diff --git a/docs/ignite3/3.0.0.html b/docs/ignite3/3.0.0.html index bf2d3c8542..30327dfc00 100644 --- a/docs/ignite3/3.0.0.html +++ b/docs/ignite3/3.0.0.html @@ -4,8 +4,8 @@ Apache Ignite 3 | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/cluster-security.html b/docs/ignite3/3.0.0/administrators-guide/cluster-security.html index 776074fde6..451be9dfb3 100644 --- a/docs/ignite3/3.0.0/administrators-guide/cluster-security.html +++ b/docs/ignite3/3.0.0/administrators-guide/cluster-security.html @@ -4,8 +4,8 @@ Cluster Security | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/colocation.html b/docs/ignite3/3.0.0/administrators-guide/colocation.html index 89eeabe2d6..c51b0c103e 100644 --- a/docs/ignite3/3.0.0/administrators-guide/colocation.html +++ b/docs/ignite3/3.0.0/administrators-guide/colocation.html @@ -4,8 +4,8 @@ Data Colocation | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/config.html b/docs/ignite3/3.0.0/administrators-guide/config.html index e42981f808..778c7b76aa 100644 --- a/docs/ignite3/3.0.0/administrators-guide/config.html +++ b/docs/ignite3/3.0.0/administrators-guide/config.html @@ -4,8 +4,8 @@ Cluster and Node Configuration | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/config/cli-config.html b/docs/ignite3/3.0.0/administrators-guide/config/cli-config.html index 6421f46d6d..a94daba4ab 100644 --- a/docs/ignite3/3.0.0/administrators-guide/config/cli-config.html +++ b/docs/ignite3/3.0.0/administrators-guide/config/cli-config.html @@ -4,8 +4,8 @@ CLI Configuration Parameters | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/config/cluster-config.html b/docs/ignite3/3.0.0/administrators-guide/config/cluster-config.html index 56a3a6b469..0b5c7f15a3 100644 --- a/docs/ignite3/3.0.0/administrators-guide/config/cluster-config.html +++ b/docs/ignite3/3.0.0/administrators-guide/config/cluster-config.html @@ -4,8 +4,8 @@ Cluster Configuration Parameters | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/config/node-config.html b/docs/ignite3/3.0.0/administrators-guide/config/node-config.html index fe3d03e89d..f7589bf28b 100644 --- a/docs/ignite3/3.0.0/administrators-guide/config/node-config.html +++ b/docs/ignite3/3.0.0/administrators-guide/config/node-config.html @@ -4,8 +4,8 @@ Node Configuration Parameters | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent.html b/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent.html index a9c8c67ada..4f69512e2f 100644 --- a/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent.html +++ b/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent.html @@ -4,8 +4,8 @@ Persistent Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb.html b/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb.html index 0dfc7f95f2..405b827103 100644 --- a/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb.html +++ b/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb.html @@ -4,8 +4,8 @@ RocksDB Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile.html b/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile.html index 087f891a63..0b623b66e5 100644 --- a/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile.html +++ b/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile.html @@ -4,8 +4,8 @@ Volatile Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/disaster-recovery.html b/docs/ignite3/3.0.0/administrators-guide/disaster-recovery.html index 055357188a..3e980533e2 100644 --- a/docs/ignite3/3.0.0/administrators-guide/disaster-recovery.html +++ b/docs/ignite3/3.0.0/administrators-guide/disaster-recovery.html @@ -4,8 +4,8 @@ Disaster Recovery for Data Partitions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/handling-exceptions.html b/docs/ignite3/3.0.0/administrators-guide/handling-exceptions.html index 97cefe244d..62ec7b0270 100644 --- a/docs/ignite3/3.0.0/administrators-guide/handling-exceptions.html +++ b/docs/ignite3/3.0.0/administrators-guide/handling-exceptions.html @@ -4,8 +4,8 @@ Errors and Solutions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/lifecycle.html b/docs/ignite3/3.0.0/administrators-guide/lifecycle.html index 09e2d58ba8..3d3c04d139 100644 --- a/docs/ignite3/3.0.0/administrators-guide/lifecycle.html +++ b/docs/ignite3/3.0.0/administrators-guide/lifecycle.html @@ -4,8 +4,8 @@ Cluster Lifecycle | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics.html b/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics.html index 375408e1fd..28850ce2fe 100644 --- a/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics.html +++ b/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics.html @@ -4,8 +4,8 @@ Configuring Metrics | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list.html b/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list.html index 46e879dc08..8a7bbd1ca7 100644 --- a/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list.html +++ b/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list.html @@ -4,8 +4,8 @@ Available Metrics | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/metrics/system-views.html b/docs/ignite3/3.0.0/administrators-guide/metrics/system-views.html index 33d9a6b7dd..b314df4374 100644 --- a/docs/ignite3/3.0.0/administrators-guide/metrics/system-views.html +++ b/docs/ignite3/3.0.0/administrators-guide/metrics/system-views.html @@ -4,8 +4,8 @@ System Views | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/security/authentication.html b/docs/ignite3/3.0.0/administrators-guide/security/authentication.html index fd43ea79cb..fe14e0c40b 100644 --- a/docs/ignite3/3.0.0/administrators-guide/security/authentication.html +++ b/docs/ignite3/3.0.0/administrators-guide/security/authentication.html @@ -4,8 +4,8 @@ Authentication | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls.html b/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls.html index 838ab04757..1a1c868cc7 100644 --- a/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls.html +++ b/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls.html @@ -4,8 +4,8 @@ SSL/TLS | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/storage.html b/docs/ignite3/3.0.0/administrators-guide/storage.html index 26aed07619..1e64aedda6 100644 --- a/docs/ignite3/3.0.0/administrators-guide/storage.html +++ b/docs/ignite3/3.0.0/administrators-guide/storage.html @@ -4,8 +4,8 @@ Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions.html b/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions.html index bcaf8dae8b..f20998c4de 100644 --- a/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions.html +++ b/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions.html @@ -4,8 +4,8 @@ Data Partitioning | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/storage/engines.html b/docs/ignite3/3.0.0/administrators-guide/storage/engines.html index 274e7f70fb..31081e96ca 100644 --- a/docs/ignite3/3.0.0/administrators-guide/storage/engines.html +++ b/docs/ignite3/3.0.0/administrators-guide/storage/engines.html @@ -4,8 +4,8 @@ Storage Engines and Profiles | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem.html b/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem.html index bbdbb0a2d5..2fbf707c44 100644 --- a/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem.html +++ b/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem.html @@ -4,8 +4,8 @@ Volatile Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist.html b/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist.html index d36b4590a6..6ab5c6041a 100644 --- a/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist.html +++ b/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist.html @@ -4,8 +4,8 @@ Persistent Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb.html b/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb.html index d8204513c2..b256a6957f 100644 --- a/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb.html +++ b/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb.html @@ -4,8 +4,8 @@ RocksDB Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/storage/storage-profiles.html b/docs/ignite3/3.0.0/administrators-guide/storage/storage-profiles.html index 597a74f0e4..8a5a704a7f 100644 --- a/docs/ignite3/3.0.0/administrators-guide/storage/storage-profiles.html +++ b/docs/ignite3/3.0.0/administrators-guide/storage/storage-profiles.html @@ -4,8 +4,8 @@ Storage Profiles | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery.html b/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery.html index 0b2279c201..8708e78cf8 100644 --- a/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery.html +++ b/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery.html @@ -4,8 +4,8 @@ Disaster Recovery for System Groups | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/clients.html b/docs/ignite3/3.0.0/developers-guide/clients.html index a745e1d415..b7e4673164 100644 --- a/docs/ignite3/3.0.0/developers-guide/clients.html +++ b/docs/ignite3/3.0.0/developers-guide/clients.html @@ -4,8 +4,8 @@ Ignite Clients | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/clients/ado.html b/docs/ignite3/3.0.0/developers-guide/clients/ado.html index 3133ccb76f..d936d210a2 100644 --- a/docs/ignite3/3.0.0/developers-guide/clients/ado.html +++ b/docs/ignite3/3.0.0/developers-guide/clients/ado.html @@ -4,8 +4,8 @@ ADO.NET Integration | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/clients/cpp.html b/docs/ignite3/3.0.0/developers-guide/clients/cpp.html index 9bf6ee6f91..be89d1d9c7 100644 --- a/docs/ignite3/3.0.0/developers-guide/clients/cpp.html +++ b/docs/ignite3/3.0.0/developers-guide/clients/cpp.html @@ -4,8 +4,8 @@ C++ Client | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/clients/dotnet.html b/docs/ignite3/3.0.0/developers-guide/clients/dotnet.html index afe29be4db..35a3b3a3ed 100644 --- a/docs/ignite3/3.0.0/developers-guide/clients/dotnet.html +++ b/docs/ignite3/3.0.0/developers-guide/clients/dotnet.html @@ -4,8 +4,8 @@ .NET Client | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/clients/java.html b/docs/ignite3/3.0.0/developers-guide/clients/java.html index 65c4256f32..8acbc625bb 100644 --- a/docs/ignite3/3.0.0/developers-guide/clients/java.html +++ b/docs/ignite3/3.0.0/developers-guide/clients/java.html @@ -4,8 +4,8 @@ Java Client | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver.html b/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver.html index 8c528545bc..9b73086c58 100644 --- a/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver.html +++ b/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver.html @@ -4,8 +4,8 @@ JDBC Driver | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/clients/linq.html b/docs/ignite3/3.0.0/developers-guide/clients/linq.html index a5598dea50..d4f2c7b941 100644 --- a/docs/ignite3/3.0.0/developers-guide/clients/linq.html +++ b/docs/ignite3/3.0.0/developers-guide/clients/linq.html @@ -4,8 +4,8 @@ .NET LINQ Queries | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/clients/python.html b/docs/ignite3/3.0.0/developers-guide/clients/python.html index c374813c68..16c7bcbbdc 100644 --- a/docs/ignite3/3.0.0/developers-guide/clients/python.html +++ b/docs/ignite3/3.0.0/developers-guide/clients/python.html @@ -4,8 +4,8 @@ Python Database API Driver | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/code-deployment.html b/docs/ignite3/3.0.0/developers-guide/code-deployment.html index f38051556f..77fb6a3f8b 100644 --- a/docs/ignite3/3.0.0/developers-guide/code-deployment.html +++ b/docs/ignite3/3.0.0/developers-guide/code-deployment.html @@ -4,8 +4,8 @@ Code Deployment | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/compute.html b/docs/ignite3/3.0.0/developers-guide/compute.html index 43723eb725..b62d114de0 100644 --- a/docs/ignite3/3.0.0/developers-guide/compute.html +++ b/docs/ignite3/3.0.0/developers-guide/compute.html @@ -4,8 +4,8 @@ Distributed Computing | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/compute/serialization.html b/docs/ignite3/3.0.0/developers-guide/compute/serialization.html index 3e8f68761e..7aff6086c9 100644 --- a/docs/ignite3/3.0.0/developers-guide/compute/serialization.html +++ b/docs/ignite3/3.0.0/developers-guide/compute/serialization.html @@ -4,8 +4,8 @@ Object Serialization | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/data-streamer.html b/docs/ignite3/3.0.0/developers-guide/data-streamer.html index 8e083c23ac..e6e01138be 100644 --- a/docs/ignite3/3.0.0/developers-guide/data-streamer.html +++ b/docs/ignite3/3.0.0/developers-guide/data-streamer.html @@ -4,8 +4,8 @@ Streaming Data | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/events.html b/docs/ignite3/3.0.0/developers-guide/events.html index e9aaa94ab8..ae7800673d 100644 --- a/docs/ignite3/3.0.0/developers-guide/events.html +++ b/docs/ignite3/3.0.0/developers-guide/events.html @@ -4,8 +4,8 @@ Working with Events | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/events/events-list.html b/docs/ignite3/3.0.0/developers-guide/events/events-list.html index e74f941b31..392a18747b 100644 --- a/docs/ignite3/3.0.0/developers-guide/events/events-list.html +++ b/docs/ignite3/3.0.0/developers-guide/events/events-list.html @@ -4,8 +4,8 @@ Available Events | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/java-to-tables.html b/docs/ignite3/3.0.0/developers-guide/java-to-tables.html index 2e167e9846..e8ac43305b 100644 --- a/docs/ignite3/3.0.0/developers-guide/java-to-tables.html +++ b/docs/ignite3/3.0.0/developers-guide/java-to-tables.html @@ -4,8 +4,8 @@ Creating Tables from Java Classes | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/rest/rest-api.html b/docs/ignite3/3.0.0/developers-guide/rest/rest-api.html index 87dda37c6c..ad8ffa5faf 100644 --- a/docs/ignite3/3.0.0/developers-guide/rest/rest-api.html +++ b/docs/ignite3/3.0.0/developers-guide/rest/rest-api.html @@ -4,8 +4,8 @@ REST API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine.html b/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine.html index 1314f21a8e..b3070609b5 100644 --- a/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine.html +++ b/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine.html @@ -4,8 +4,8 @@ Introduction | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver.html b/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver.html index c212bc547d..afa20fc81f 100644 --- a/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver.html +++ b/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver.html @@ -4,8 +4,8 @@ JDBC Driver | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string.html b/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string.html index 1ba9bca40d..09bd69ae1b 100644 --- a/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string.html +++ b/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string.html @@ -4,8 +4,8 @@ Connection String | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver.html b/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver.html index fd518f3c09..88ca9c6cd3 100644 --- a/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver.html +++ b/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver.html @@ -4,8 +4,8 @@ ODBC Driver | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data.html b/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data.html index 0b42c7b45e..88e6d9cf88 100644 --- a/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data.html +++ b/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data.html @@ -4,8 +4,8 @@ Querying and Modifying Data | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification.html b/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification.html index 695a4ac165..8e44869b53 100644 --- a/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification.html +++ b/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification.html @@ -4,8 +4,8 @@ ODBC Standard Conformance | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/sql/sql-api.html b/docs/ignite3/3.0.0/developers-guide/sql/sql-api.html index 451a23a9cd..32bd628b1a 100644 --- a/docs/ignite3/3.0.0/developers-guide/sql/sql-api.html +++ b/docs/ignite3/3.0.0/developers-guide/sql/sql-api.html @@ -4,8 +4,8 @@ Java SQL API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/sql/system-views.html b/docs/ignite3/3.0.0/developers-guide/sql/system-views.html index 5e6a0f5607..8631dc368b 100644 --- a/docs/ignite3/3.0.0/developers-guide/sql/system-views.html +++ b/docs/ignite3/3.0.0/developers-guide/sql/system-views.html @@ -4,8 +4,8 @@ System Views | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/table-api.html b/docs/ignite3/3.0.0/developers-guide/table-api.html index 95be30b30b..74a7ec9d08 100644 --- a/docs/ignite3/3.0.0/developers-guide/table-api.html +++ b/docs/ignite3/3.0.0/developers-guide/table-api.html @@ -4,8 +4,8 @@ Table API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/developers-guide/transactions.html b/docs/ignite3/3.0.0/developers-guide/transactions.html index 6654087096..b6bf18b840 100644 --- a/docs/ignite3/3.0.0/developers-guide/transactions.html +++ b/docs/ignite3/3.0.0/developers-guide/transactions.html @@ -4,8 +4,8 @@ Performing Transactions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/general-tips.html b/docs/ignite3/3.0.0/general-tips.html index e0b78a602d..8793c76b9b 100644 --- a/docs/ignite3/3.0.0/general-tips.html +++ b/docs/ignite3/3.0.0/general-tips.html @@ -4,8 +4,8 @@ General Configuration Tips | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/glossary.html b/docs/ignite3/3.0.0/glossary.html index 1f7f4a54c1..893b1f489a 100644 --- a/docs/ignite3/3.0.0/glossary.html +++ b/docs/ignite3/3.0.0/glossary.html @@ -4,8 +4,8 @@ Glossary | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/ignite-cli-tool.html b/docs/ignite3/3.0.0/ignite-cli-tool.html index 3e0c87fe78..a3877d1477 100644 --- a/docs/ignite3/3.0.0/ignite-cli-tool.html +++ b/docs/ignite3/3.0.0/ignite-cli-tool.html @@ -4,8 +4,8 @@ Apache Ignite CLI Tool | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/installation/deb-rpm.html b/docs/ignite3/3.0.0/installation/deb-rpm.html index 2fbe7164f9..51bd167a82 100644 --- a/docs/ignite3/3.0.0/installation/deb-rpm.html +++ b/docs/ignite3/3.0.0/installation/deb-rpm.html @@ -4,8 +4,8 @@ Installing Using DEB and RPM Package | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/installation/installing-to-k8s.html b/docs/ignite3/3.0.0/installation/installing-to-k8s.html index 303b3f7480..26018f4fce 100644 --- a/docs/ignite3/3.0.0/installation/installing-to-k8s.html +++ b/docs/ignite3/3.0.0/installation/installing-to-k8s.html @@ -4,8 +4,8 @@ Installing on Kubernetes | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/installation/installing-using-docker.html b/docs/ignite3/3.0.0/installation/installing-using-docker.html index bba89280ef..4b580bff74 100644 --- a/docs/ignite3/3.0.0/installation/installing-using-docker.html +++ b/docs/ignite3/3.0.0/installation/installing-using-docker.html @@ -4,8 +4,8 @@ Installing Using Docker | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/installation/installing-using-zip.html b/docs/ignite3/3.0.0/installation/installing-using-zip.html index a1c9983123..c44d326288 100644 --- a/docs/ignite3/3.0.0/installation/installing-using-zip.html +++ b/docs/ignite3/3.0.0/installation/installing-using-zip.html @@ -4,8 +4,8 @@ Installing Using ZIP Archive | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/installation/migration-from-ai2.html b/docs/ignite3/3.0.0/installation/migration-from-ai2.html index 0078add5a6..a402a5d524 100644 --- a/docs/ignite3/3.0.0/installation/migration-from-ai2.html +++ b/docs/ignite3/3.0.0/installation/migration-from-ai2.html @@ -4,8 +4,8 @@ Migration From Apache Ignite 2 | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/quick-start/embedded-mode.html b/docs/ignite3/3.0.0/quick-start/embedded-mode.html index f013a1c0e3..2821fc2ac3 100644 --- a/docs/ignite3/3.0.0/quick-start/embedded-mode.html +++ b/docs/ignite3/3.0.0/quick-start/embedded-mode.html @@ -4,8 +4,8 @@ Starting With Embedded Mode | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/quick-start/explore-sql.html b/docs/ignite3/3.0.0/quick-start/explore-sql.html index 4349980eec..702dc4220d 100644 --- a/docs/ignite3/3.0.0/quick-start/explore-sql.html +++ b/docs/ignite3/3.0.0/quick-start/explore-sql.html @@ -4,8 +4,8 @@ Getting Started with SQL | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/quick-start/getting-started-guide.html b/docs/ignite3/3.0.0/quick-start/getting-started-guide.html index 0d4f172554..d9bf9e8025 100644 --- a/docs/ignite3/3.0.0/quick-start/getting-started-guide.html +++ b/docs/ignite3/3.0.0/quick-start/getting-started-guide.html @@ -4,8 +4,8 @@ Getting Started With Apache Ignite 3 | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/quick-start/java-api.html b/docs/ignite3/3.0.0/quick-start/java-api.html index c045199089..edd23b6b3e 100644 --- a/docs/ignite3/3.0.0/quick-start/java-api.html +++ b/docs/ignite3/3.0.0/quick-start/java-api.html @@ -4,8 +4,8 @@ Getting Started with Ignite 3 Using Java API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/quick-start/persist-data.html b/docs/ignite3/3.0.0/quick-start/persist-data.html index 9a19828d26..a91de163ff 100644 --- a/docs/ignite3/3.0.0/quick-start/persist-data.html +++ b/docs/ignite3/3.0.0/quick-start/persist-data.html @@ -4,8 +4,8 @@ Getting Started with Ignite 3 Persistent Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/quick-start/start-cluster.html b/docs/ignite3/3.0.0/quick-start/start-cluster.html index 68dfeae214..1836b57901 100644 --- a/docs/ignite3/3.0.0/quick-start/start-cluster.html +++ b/docs/ignite3/3.0.0/quick-start/start-cluster.html @@ -4,8 +4,8 @@ How to Start an Ignite 3 Cluster in Docker | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/data-types.html b/docs/ignite3/3.0.0/sql-reference/data-types.html index 38aad9be5c..69d4170f5f 100644 --- a/docs/ignite3/3.0.0/sql-reference/data-types.html +++ b/docs/ignite3/3.0.0/sql-reference/data-types.html @@ -4,8 +4,8 @@ Data Types | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/ddl.html b/docs/ignite3/3.0.0/sql-reference/ddl.html index 77dabb4ce1..28d23a6c13 100644 --- a/docs/ignite3/3.0.0/sql-reference/ddl.html +++ b/docs/ignite3/3.0.0/sql-reference/ddl.html @@ -4,8 +4,8 @@ Data Definition Language (DDL) | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/distribution-zones.html b/docs/ignite3/3.0.0/sql-reference/distribution-zones.html index 55030ef4d4..55ee0c462f 100644 --- a/docs/ignite3/3.0.0/sql-reference/distribution-zones.html +++ b/docs/ignite3/3.0.0/sql-reference/distribution-zones.html @@ -4,8 +4,8 @@ Distribution Zones | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/dml.html b/docs/ignite3/3.0.0/sql-reference/dml.html index d35de76e88..0c17261aa0 100644 --- a/docs/ignite3/3.0.0/sql-reference/dml.html +++ b/docs/ignite3/3.0.0/sql-reference/dml.html @@ -4,8 +4,8 @@ Data Manipulation Language (DML) | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/explain-operators-list.html b/docs/ignite3/3.0.0/sql-reference/explain-operators-list.html index 0b6c0c384f..61660cf116 100644 --- a/docs/ignite3/3.0.0/sql-reference/explain-operators-list.html +++ b/docs/ignite3/3.0.0/sql-reference/explain-operators-list.html @@ -4,8 +4,8 @@ List Of Operators | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/explain-statement.html b/docs/ignite3/3.0.0/sql-reference/explain-statement.html index 9969b35857..b44d433c71 100644 --- a/docs/ignite3/3.0.0/sql-reference/explain-statement.html +++ b/docs/ignite3/3.0.0/sql-reference/explain-statement.html @@ -4,8 +4,8 @@ EXPLAIN Command | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/grammar-reference.html b/docs/ignite3/3.0.0/sql-reference/grammar-reference.html index a177969e5c..3dfb36ac28 100644 --- a/docs/ignite3/3.0.0/sql-reference/grammar-reference.html +++ b/docs/ignite3/3.0.0/sql-reference/grammar-reference.html @@ -4,8 +4,8 @@ Grammar Reference | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/keywords.html b/docs/ignite3/3.0.0/sql-reference/keywords.html index d9133e2526..05ae157f56 100644 --- a/docs/ignite3/3.0.0/sql-reference/keywords.html +++ b/docs/ignite3/3.0.0/sql-reference/keywords.html @@ -4,8 +4,8 @@ Keywords | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/operational-commands.html b/docs/ignite3/3.0.0/sql-reference/operational-commands.html index 86c0a703a0..ca2e35c849 100644 --- a/docs/ignite3/3.0.0/sql-reference/operational-commands.html +++ b/docs/ignite3/3.0.0/sql-reference/operational-commands.html @@ -4,8 +4,8 @@ Operational Commands | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/operators-and-functions.html b/docs/ignite3/3.0.0/sql-reference/operators-and-functions.html index 8f57ffdc50..afc51515fc 100644 --- a/docs/ignite3/3.0.0/sql-reference/operators-and-functions.html +++ b/docs/ignite3/3.0.0/sql-reference/operators-and-functions.html @@ -4,8 +4,8 @@ Supported Operators and Functions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/sql-conformance.html b/docs/ignite3/3.0.0/sql-reference/sql-conformance.html index 4c078fb970..5690df8f89 100644 --- a/docs/ignite3/3.0.0/sql-reference/sql-conformance.html +++ b/docs/ignite3/3.0.0/sql-reference/sql-conformance.html @@ -4,8 +4,8 @@ SQL Conformance | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-reference/transactions.html b/docs/ignite3/3.0.0/sql-reference/transactions.html index 2d58ec8e1c..3c457d266d 100644 --- a/docs/ignite3/3.0.0/sql-reference/transactions.html +++ b/docs/ignite3/3.0.0/sql-reference/transactions.html @@ -4,8 +4,8 @@ Transactions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-tuning.html b/docs/ignite3/3.0.0/sql-tuning.html index 53597a95b1..f4b5bbca66 100644 --- a/docs/ignite3/3.0.0/sql-tuning.html +++ b/docs/ignite3/3.0.0/sql-tuning.html @@ -4,8 +4,8 @@ SQL Performance Tuning | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.0.0/sql-tuning/using-explain.html b/docs/ignite3/3.0.0/sql-tuning/using-explain.html index 1bffb15840..d459647ea6 100644 --- a/docs/ignite3/3.0.0/sql-tuning/using-explain.html +++ b/docs/ignite3/3.0.0/sql-tuning/using-explain.html @@ -4,8 +4,8 @@ How to Improve Queries With EXPLAIN Command | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0.html b/docs/ignite3/3.1.0.html index 39c6d9f071..318f1717ad 100644 --- a/docs/ignite3/3.1.0.html +++ b/docs/ignite3/3.1.0.html @@ -4,8 +4,8 @@ Apache Ignite 3 Documentation - - + + @@ -14,9 +14,9 @@
Skip to main content
Version: 3.1.0 (Latest)

Apache Ignite 3 Documentation

Apache Ignite 3 is a distributed database for high-performance computing with in-memory speed.

Where to Start

- - + +

Documentation Sections

-

Getting Started

Tutorials and quick start guides to get up and running with Apache Ignite 3. Install, configure, and execute your first queries.

Develop

Build applications with Ignite clients, work with data using Table and SQL APIs, and integrate with frameworks like Spring Boot.

SQL

Complete SQL reference including fundamentals, query execution, data definition language, and performance tuning.

Configure and Operate

Install Ignite on various platforms, configure cluster settings, manage node lifecycle, and set up monitoring.

Understand

Core concepts, architecture patterns, storage engines, and performance characteristics of distributed data processing.

API Reference

API documentation for Java, .NET, C++, and SQL-only drivers.

Tools

Command-line interface commands, REST API endpoints, and utilities for cluster management and operations.

+

Getting Started

Tutorials and quick start guides to get up and running with Apache Ignite 3. Install, configure, and execute your first queries.

Develop

Build applications with Ignite clients, work with data using Table and SQL APIs, and integrate with frameworks like Spring Boot.

SQL

Complete SQL reference including fundamentals, query execution, data definition language, and performance tuning.

Configure and Operate

Install Ignite on various platforms, configure cluster settings, manage node lifecycle, and set up monitoring.

Understand

Core concepts, architecture patterns, storage engines, and performance characteristics of distributed data processing.

API Reference

API documentation for Java, .NET, C++, and SQL-only drivers.

Tools

Command-line interface commands, REST API endpoints, and utilities for cluster management and operations.

\ No newline at end of file diff --git a/docs/ignite3/3.1.0/api-reference.html b/docs/ignite3/3.1.0/api-reference.html index 51a679b34b..a77a1a9a1c 100644 --- a/docs/ignite3/3.1.0/api-reference.html +++ b/docs/ignite3/3.1.0/api-reference.html @@ -4,8 +4,8 @@ API Reference | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
Skip to main content
Version: 3.1.0 (Latest)

API Reference

API documentation for all supported languages and drivers.

In This Section

-

Java Client (PRIMARY)

Primary Ignite API with complete feature set including thin client, embedded node, and all platform capabilities.

.NET Client

Native .NET client for C# and F# applications with async/await patterns and LINQ support.

C++ Client

High-performance C++ client with modern C++17 features and zero-copy operations.

JDBC Driver

Java Database Connectivity (JDBC 4.x) for SQL-only operations with standard database tools.

ODBC Driver

Open Database Connectivity (ODBC 3.8) for cross-platform SQL access from C/C++ applications.

Python DB-API

Python Database API (PEP-249) for SQL connectivity from Python applications.

+

Java Client (PRIMARY)

Primary Ignite API with complete feature set including thin client, embedded node, and all platform capabilities.

.NET Client

Native .NET client for C# and F# applications with async/await patterns and LINQ support.

C++ Client

High-performance C++ client with modern C++17 features and zero-copy operations.

JDBC Driver

Java Database Connectivity (JDBC 4.x) for SQL-only operations with standard database tools.

ODBC Driver

Open Database Connectivity (ODBC 3.8) for cross-platform SQL access from C/C++ applications.

Python DB-API

Python Database API (PEP-249) for SQL connectivity from Python applications.

External API Documentation

  • Java API JavaDoc - Complete Java API reference
  • diff --git a/docs/ignite3/3.1.0/api-reference/api.html b/docs/ignite3/3.1.0/api-reference/api.html index 33a7406a00..2d31904565 100644 --- a/docs/ignite3/3.1.0/api-reference/api.html +++ b/docs/ignite3/3.1.0/api-reference/api.html @@ -4,8 +4,8 @@ API Documentation | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
    Version: 3.1.0 (Latest)

    API Documentation

    External API documentation links for all supported languages.

    In This Section

    -

    Java API Reference

    Complete JavaDoc reference for Apache Ignite 3 Java API.

    .NET API Reference

    Complete API reference for Apache Ignite 3 .NET client.

    C++ API Reference

    Complete API reference for Apache Ignite 3 C++ client.

    +

    Java API Reference

    Complete JavaDoc reference for Apache Ignite 3 Java API.

    .NET API Reference

    Complete API reference for Apache Ignite 3 .NET client.

    C++ API Reference

    Complete API reference for Apache Ignite 3 C++ client.

    Next Steps

    • Native Clients - Native client APIs
    • diff --git a/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference.html b/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference.html index ff6bcc44d8..813fb806b6 100644 --- a/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference.html +++ b/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference.html @@ -4,8 +4,8 @@ C++ API Reference | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference.html b/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference.html index 31abc59338..c08b27ebda 100644 --- a/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference.html +++ b/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference.html @@ -4,8 +4,8 @@ .NET API Reference | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/api/java-api-reference.html b/docs/ignite3/3.1.0/api-reference/api/java-api-reference.html index ef8e1f562b..4974e391cd 100644 --- a/docs/ignite3/3.1.0/api-reference/api/java-api-reference.html +++ b/docs/ignite3/3.1.0/api-reference/api/java-api-reference.html @@ -4,8 +4,8 @@ Java API Reference | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients.html b/docs/ignite3/3.1.0/api-reference/native-clients.html index e86dd56fc4..6bdb72967f 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients.html @@ -4,8 +4,8 @@ Native Client APIs | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
      Version: 3.1.0 (Latest)

      Native Client APIs

      Full-featured native clients for multiple programming languages.

      In This Section

      -

      Java API (PRIMARY)

      Primary Ignite API with complete feature set including thin client, embedded node, and all platform capabilities.

      .NET API

      Native .NET client for C# and F# applications with async/await patterns and LINQ support.

      C++ API

      High-performance C++ client with modern C++17 features and zero-copy operations.

      +

      Java API (PRIMARY)

      Primary Ignite API with complete feature set including thin client, embedded node, and all platform capabilities.

      .NET API

      Native .NET client for C# and F# applications with async/await patterns and LINQ support.

      C++ API

      High-performance C++ client with modern C++17 features and zero-copy operations.

      Next Steps

      • SQL-Only APIs - JDBC, ODBC, and Python
      • diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/cpp.html b/docs/ignite3/3.1.0/api-reference/native-clients/cpp.html index 595a2dbf0b..24077a3298 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/cpp.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/cpp.html @@ -4,8 +4,8 @@ C++ API | Apache Ignite 3 Documentation - - + + @@ -17,7 +17,7 @@

        OverviewAPI Categories

        -

        Client API

        ignite_client configuration, connection lifecycle management, and API access patterns.

        Tables API

        Record and key-value views with typed and binary tuple access for table operations.

        SQL API

        Query execution with parameterized statements, pagination, and cancellation support.

        Transactions API

        Transaction control with explicit commit and rollback operations for ACID guarantees.

        Compute API

        Distributed job execution with targeting strategies and priority management.

        Network API

        Cluster node information and topology filtering for distributed coordination.

        +

        Client API

        ignite_client configuration, connection lifecycle management, and API access patterns.

        Tables API

        Record and key-value views with typed and binary tuple access for table operations.

        SQL API

        Query execution with parameterized statements, pagination, and cancellation support.

        Transactions API

        Transaction control with explicit commit and rollback operations for ACID guarantees.

        Compute API

        Distributed job execution with targeting strategies and priority management.

        Network API

        Cluster node information and topology filtering for distributed coordination.

        Reference

        • C++ API Documentation
        • diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api.html index fc9eddfd89..032fbc359e 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api.html @@ -4,8 +4,8 @@ Client API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api.html index fa992579a6..470c335f40 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api.html @@ -4,8 +4,8 @@ Compute API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api.html index d7a026e5f4..c14e72d109 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api.html @@ -4,8 +4,8 @@ Network API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api.html index 515a29698b..c3d4fd414a 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api.html @@ -4,8 +4,8 @@ SQL API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api.html index 3f0b9c1895..effe18c4ab 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api.html @@ -4,8 +4,8 @@ Tables API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api.html index bb0c2d6e24..180dc036bd 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api.html @@ -4,8 +4,8 @@ Transactions API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet.html index 0b5d663b05..c5d59ff169 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet.html @@ -4,8 +4,8 @@ .NET API | Apache Ignite 3 Documentation - - + + @@ -17,7 +17,7 @@

          OverviewAPI Categories

          -

          Client API

          IIgniteClient configuration, connection management, and resource lifecycle with async patterns.

          Tables API

          Record and key-value views with typed and tuple access patterns for table operations.

          LINQ API

          Language-integrated queries with strongly-typed expressions and server-side execution.

          Data Streamer API

          Bulk loading with custom server-side receivers and error handling for high-throughput scenarios.

          SQL API

          Query execution with parameterized statements and lazy materialization for efficient data processing.

          ADO.NET API

          Standard ADO.NET database connectivity with DbConnection, DbCommand, and DataReader interfaces.

          Transactions API

          ACID transactions with explicit control and automatic closure-based patterns.

          Compute API

          Distributed job execution with serialization, colocated processing, and job monitoring.

          Network API

          Cluster topology, node discovery, and connection inspection for distributed coordination.

          +

          Client API

          IIgniteClient configuration, connection management, and resource lifecycle with async patterns.

          Tables API

          Record and key-value views with typed and tuple access patterns for table operations.

          LINQ API

          Language-integrated queries with strongly-typed expressions and server-side execution.

          Data Streamer API

          Bulk loading with custom server-side receivers and error handling for high-throughput scenarios.

          SQL API

          Query execution with parameterized statements and lazy materialization for efficient data processing.

          ADO.NET API

          Standard ADO.NET database connectivity with DbConnection, DbCommand, and DataReader interfaces.

          Transactions API

          ACID transactions with explicit control and automatic closure-based patterns.

          Compute API

          Distributed job execution with serialization, colocated processing, and job monitoring.

          Network API

          Cluster topology, node discovery, and connection inspection for distributed coordination.

          Reference

          • .NET API Documentation
          • diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api.html index c2814a4f75..4d297b83a7 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api.html @@ -4,8 +4,8 @@ ADO.NET API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api.html index 3670155195..d09d668e61 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api.html @@ -4,8 +4,8 @@ Client API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api.html index 47233eaa49..a57046412c 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api.html @@ -4,8 +4,8 @@ Compute API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api.html index 8d1b1872a9..757d69c382 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api.html @@ -4,8 +4,8 @@ Data Streamer API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api.html index ada07a8026..032072d0f1 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api.html @@ -4,8 +4,8 @@ LINQ API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api.html index 5bc9188b12..14d390b3a9 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api.html @@ -4,8 +4,8 @@ Network API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api.html index a0bebc7208..51e1922713 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api.html @@ -4,8 +4,8 @@ SQL API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api.html index 7b3720ff33..c95f44a773 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api.html @@ -4,8 +4,8 @@ Tables API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api.html index ec500fd0ed..90a5603384 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api.html @@ -4,8 +4,8 @@ Transactions API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java.html b/docs/ignite3/3.1.0/api-reference/native-clients/java.html index b49ad6482d..089204c63b 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java.html @@ -4,8 +4,8 @@ Java API | Apache Ignite 3 Documentation - - + + @@ -17,7 +17,7 @@

            OverviewAPI Categories

            -

            Client API

            Thin client connection configuration, connection pooling, and cluster discovery.

            Server API

            Embedded node initialization, lifecycle management, and local cluster participation.

            Tables API

            Record and key-value operations with typed and binary views for table data access.

            Data Streamer API

            High-throughput bulk loading with reactive streams and backpressure handling.

            SQL API

            Query execution with prepared statements, parameter binding, and result processing.

            Transactions API

            ACID transaction management with explicit control and closure-based patterns.

            Compute API

            Distributed job execution with colocated processing and broadcast operations.

            Catalog API

            Schema management with annotations and fluent builders for table creation.

            Criteria API

            Type-safe predicate construction for table queries with compile-time validation.

            Network API

            Cluster topology discovery and node information for distributed coordination.

            Security API

            Authentication configuration and credential management for secure cluster access.

            +

            Client API

            Thin client connection configuration, connection pooling, and cluster discovery.

            Server API

            Embedded node initialization, lifecycle management, and local cluster participation.

            Tables API

            Record and key-value operations with typed and binary views for table data access.

            Data Streamer API

            High-throughput bulk loading with reactive streams and backpressure handling.

            SQL API

            Query execution with prepared statements, parameter binding, and result processing.

            Transactions API

            ACID transaction management with explicit control and closure-based patterns.

            Compute API

            Distributed job execution with colocated processing and broadcast operations.

            Catalog API

            Schema management with annotations and fluent builders for table creation.

            Criteria API

            Type-safe predicate construction for table queries with compile-time validation.

            Network API

            Cluster topology discovery and node information for distributed coordination.

            Security API

            Authentication configuration and credential management for secure cluster access.

            Reference

            • Java API Documentation
            • diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api.html index 8963f6d605..d3244ef0be 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api.html @@ -4,8 +4,8 @@ Catalog API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api.html index ac9ddf7881..968f10c38c 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api.html @@ -4,8 +4,8 @@ Client API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api.html index cfbcc986a2..c929ec6085 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api.html @@ -4,8 +4,8 @@ Compute API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api.html index 665e1049cf..b2b93940d7 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api.html @@ -4,8 +4,8 @@ Criteria API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api.html index 390eb20459..152a944829 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api.html @@ -4,8 +4,8 @@ Data Streamer API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api.html index 93a03cad96..3c0a8ad6f5 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api.html @@ -4,8 +4,8 @@ Network API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api.html index 19104971a0..018d4cf137 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api.html @@ -4,8 +4,8 @@ Security API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api.html index aca16701ea..4b8c21e41c 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api.html @@ -4,8 +4,8 @@ Server API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api.html index fb821925d3..cbf739358d 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api.html @@ -4,8 +4,8 @@ SQL API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api.html index 13969c7233..322bd59ed3 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api.html @@ -4,8 +4,8 @@ Tables API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api.html b/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api.html index ec3ca230b5..2450cfb383 100644 --- a/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api.html +++ b/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api.html @@ -4,8 +4,8 @@ Transactions API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/sql-only-apis.html b/docs/ignite3/3.1.0/api-reference/sql-only-apis.html index 282f939614..01f1ad8cde 100644 --- a/docs/ignite3/3.1.0/api-reference/sql-only-apis.html +++ b/docs/ignite3/3.1.0/api-reference/sql-only-apis.html @@ -4,8 +4,8 @@ SQL-Only APIs | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
              Version: 3.1.0 (Latest)

              SQL-Only APIs

              SQL connectivity drivers for standard database tools and applications.

              In This Section

              -

              JDBC Driver

              Java Database Connectivity (JDBC 4.x) for SQL-only operations with standard database tools.

              ODBC Driver

              Open Database Connectivity (ODBC 3.8) for cross-platform SQL access from C/C++ applications.

              Python DB-API

              Python Database API (PEP-249) for SQL connectivity from Python applications.

              +

              JDBC Driver

              Java Database Connectivity (JDBC 4.x) for SQL-only operations with standard database tools.

              ODBC Driver

              Open Database Connectivity (ODBC 3.8) for cross-platform SQL access from C/C++ applications.

              Python DB-API

              Python Database API (PEP-249) for SQL connectivity from Python applications.

              Next Steps

              • Native Client APIs - Full-featured clients
              • diff --git a/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc.html b/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc.html index 659a01b6ec..6aabc1c227 100644 --- a/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc.html +++ b/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc.html @@ -4,8 +4,8 @@ JDBC Driver | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc.html b/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc.html index 0614bae26c..cd087ccd6d 100644 --- a/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc.html +++ b/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc.html @@ -4,8 +4,8 @@ ODBC Driver | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/api-reference/sql-only-apis/python.html b/docs/ignite3/3.1.0/api-reference/sql-only-apis/python.html index 79ee447236..e06f5b7123 100644 --- a/docs/ignite3/3.1.0/api-reference/sql-only-apis/python.html +++ b/docs/ignite3/3.1.0/api-reference/sql-only-apis/python.html @@ -4,8 +4,8 @@ Python DB-API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate.html b/docs/ignite3/3.1.0/configure-and-operate.html index 7ed6a564cb..49457da7b9 100644 --- a/docs/ignite3/3.1.0/configure-and-operate.html +++ b/docs/ignite3/3.1.0/configure-and-operate.html @@ -4,8 +4,8 @@ Configure and Operate | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                Version: 3.1.0 (Latest)

                Configure and Operate

                Install, configure, and operate Apache Ignite 3 clusters in production environments.

                In This Section

                -

                Install Using ZIP Archive

                Manual installation from binary distribution for Linux, macOS, and Windows.

                Install Using DEB/RPM Packages

                Install through Linux package managers on Debian, Ubuntu, RHEL, and CentOS systems.

                Install Using Docker

                Containerized deployment with Docker images for development and production environments.

                Install to Kubernetes

                Cloud-native deployment using Kubernetes operators and Helm charts.

                Configure Cluster and Nodes

                Essential cluster configuration including node settings, network parameters, and cluster initialization.

                Configure Storage

                Storage profiles and engine configuration for AIPersist, RocksDB, and in-memory storage.

                Set Up Authentication

                Security configuration with basic authentication and user credential management.

                Enable SSL/TLS

                Configure encrypted connections with SSL/TLS certificates for client and inter-node communication.

                Configure Metrics

                Set up metrics collection and export for cluster monitoring and observability.

                Manage Cluster Lifecycle

                Start, stop, and manage nodes with cluster initialization and topology changes.

                Disaster Recovery (Partitions)

                Partition recovery procedures for data loss scenarios and cluster failures.

                Disaster Recovery (System Groups)

                System group recovery for metadata and catalog restoration.

                Monitor Performance

                Performance monitoring with colocation strategies and query optimization.

                Handle Exceptions

                Error handling patterns and troubleshooting common cluster issues.

                Available Metrics

                Complete reference of metrics exposed for monitoring cluster health and performance.

                Metrics System Views

                Query metrics through SQL views for programmatic access to cluster statistics.

                Node Configuration Parameters

                Complete reference of node-level configuration parameters and settings.

                Cluster Configuration Parameters

                Complete reference of cluster-level configuration parameters and defaults.

                CLI Configuration

                Command-line interface configuration and usage patterns.

                Storage Profiles

                Storage engine configuration including engine selection and performance tuning.

                +

                Install Using ZIP Archive

                Manual installation from binary distribution for Linux, macOS, and Windows.

                Install Using DEB/RPM Packages

                Install through Linux package managers on Debian, Ubuntu, RHEL, and CentOS systems.

                Install Using Docker

                Containerized deployment with Docker images for development and production environments.

                Install to Kubernetes

                Cloud-native deployment using Kubernetes operators and Helm charts.

                Configure Cluster and Nodes

                Essential cluster configuration including node settings, network parameters, and cluster initialization.

                Configure Storage

                Storage profiles and engine configuration for AIPersist, RocksDB, and in-memory storage.

                Set Up Authentication

                Security configuration with basic authentication and user credential management.

                Enable SSL/TLS

                Configure encrypted connections with SSL/TLS certificates for client and inter-node communication.

                Configure Metrics

                Set up metrics collection and export for cluster monitoring and observability.

                Manage Cluster Lifecycle

                Start, stop, and manage nodes with cluster initialization and topology changes.

                Disaster Recovery (Partitions)

                Partition recovery procedures for data loss scenarios and cluster failures.

                Disaster Recovery (System Groups)

                System group recovery for metadata and catalog restoration.

                Monitor Performance

                Performance monitoring with colocation strategies and query optimization.

                Handle Exceptions

                Error handling patterns and troubleshooting common cluster issues.

                Available Metrics

                Complete reference of metrics exposed for monitoring cluster health and performance.

                Metrics System Views

                Query metrics through SQL views for programmatic access to cluster statistics.

                Node Configuration Parameters

                Complete reference of node-level configuration parameters and settings.

                Cluster Configuration Parameters

                Complete reference of cluster-level configuration parameters and defaults.

                CLI Configuration

                Command-line interface configuration and usage patterns.

                Storage Profiles

                Storage engine configuration including engine selection and performance tuning.

                Next Steps

                • Getting Started - Quick start guides
                • diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration.html b/docs/ignite3/3.1.0/configure-and-operate/configuration.html index 6f013bbdfc..1a1fd43241 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration.html @@ -4,8 +4,8 @@ Configuration | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                  Version: 3.1.0 (Latest)

                  Configuration

                  Configuration options for Apache Ignite 3 clusters and nodes.

                  In This Section

                  -

                  Cluster and Node Configuration

                  Configure cluster topology, node settings, and network parameters.

                  Storage Configuration

                  Configure storage engines, profiles, and data persistence options.

                  Authentication

                  Enable and configure authentication and user management.

                  SSL/TLS

                  Configure SSL/TLS encryption for secure communications.

                  Metrics Configuration

                  Configure metrics collection and export for monitoring.

                  Cluster Security

                  Security features and best practices for production clusters.

                  +

                  Cluster and Node Configuration

                  Configure cluster topology, node settings, and network parameters.

                  Storage Configuration

                  Configure storage engines, profiles, and data persistence options.

                  Authentication

                  Enable and configure authentication and user management.

                  SSL/TLS

                  Configure SSL/TLS encryption for secure communications.

                  Metrics Configuration

                  Configure metrics collection and export for monitoring.

                  Cluster Security

                  Security features and best practices for production clusters.

                  Next Steps

                  • Operations - Cluster lifecycle management
                  • diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication.html index e791408efc..f58d6f2e04 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication.html @@ -4,8 +4,8 @@ Authentication | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes.html index a00bd00dbc..3d8e74a5e2 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes.html @@ -4,8 +4,8 @@ Cluster and Node Configuration | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security.html index 0768078b73..845f849f08 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security.html @@ -4,8 +4,8 @@ Cluster Security | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls.html index 279b8fc575..8ddef595f4 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls.html @@ -4,8 +4,8 @@ SSL/TLS | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-overview.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-overview.html index a38de98386..5e76887a19 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-overview.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-overview.html @@ -4,8 +4,8 @@ Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent.html index 10948061a6..0625cb78f7 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent.html @@ -4,8 +4,8 @@ Persistent Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb.html index cdb57f7411..b460599a9c 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb.html @@ -4,8 +4,8 @@ RocksDB Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-volatile.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-volatile.html index fadfe7bb93..fc6afbcc7a 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-volatile.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-volatile.html @@ -4,8 +4,8 @@ Volatile Storage | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage.html index 757afb3906..418f55dcd9 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage.html @@ -4,8 +4,8 @@ Storage Profiles | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration.html b/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration.html index 7188ab30c1..661f71693a 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration.html +++ b/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration.html @@ -4,8 +4,8 @@ Configuring Metrics | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/installation.html b/docs/ignite3/3.1.0/configure-and-operate/installation.html index 936d6085d6..433a943ba7 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/installation.html +++ b/docs/ignite3/3.1.0/configure-and-operate/installation.html @@ -4,8 +4,8 @@ Installation | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                    Version: 3.1.0 (Latest)

                    Installation

                    Installation methods for Apache Ignite 3.

                    In This Section

                    -

                    Install from ZIP Archive

                    Download and install Ignite from ZIP or TAR.GZ archives for all platforms.

                    Install DEB/RPM Package

                    Install Ignite using native DEB or RPM packages on Debian/Ubuntu or RHEL/CentOS.

                    Install with Docker

                    Run Ignite in Docker containers for development and testing environments.

                    Install on Kubernetes

                    Deploy Ignite on Kubernetes clusters for production workloads.

                    +

                    Install from ZIP Archive

                    Download and install Ignite from ZIP or TAR.GZ archives for all platforms.

                    Install DEB/RPM Package

                    Install Ignite using native DEB or RPM packages on Debian/Ubuntu or RHEL/CentOS.

                    Install with Docker

                    Run Ignite in Docker containers for development and testing environments.

                    Install on Kubernetes

                    Deploy Ignite on Kubernetes clusters for production workloads.

                    Next Steps

                    • Configuration - Configure cluster and nodes
                    • diff --git a/docs/ignite3/3.1.0/configure-and-operate/installation/install-deb-rpm.html b/docs/ignite3/3.1.0/configure-and-operate/installation/install-deb-rpm.html index 832aa3fe2a..d4bd54184e 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/installation/install-deb-rpm.html +++ b/docs/ignite3/3.1.0/configure-and-operate/installation/install-deb-rpm.html @@ -4,8 +4,8 @@ Install Using DEB and RPM Package | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker.html b/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker.html index c13c5ab0d2..6eb7d0c0b6 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker.html +++ b/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker.html @@ -4,8 +4,8 @@ Install Using Docker | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes.html b/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes.html index 47dee6e5fd..48549cd5f2 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes.html +++ b/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes.html @@ -4,8 +4,8 @@ Install on Kubernetes | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip.html b/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip.html index 75d60f50db..4bc551abbb 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip.html +++ b/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip.html @@ -4,8 +4,8 @@ Install Using ZIP Archive | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/monitoring.html b/docs/ignite3/3.1.0/configure-and-operate/monitoring.html index 49701e4fe2..e761aea49b 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/monitoring.html +++ b/docs/ignite3/3.1.0/configure-and-operate/monitoring.html @@ -4,8 +4,8 @@ Monitoring | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                      Version: 3.1.0 (Latest)

                      Monitoring

                      Monitor Apache Ignite 3 cluster health and performance.

                      In This Section

                      -

                      Metrics

                      Collect and export cluster metrics for monitoring and alerting.

                      +

                      Metrics

                      Collect and export cluster metrics for monitoring and alerting.

                      Next Steps

                      • Configuration - Configure metrics collection
                      • diff --git a/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics.html b/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics.html index f5fc557469..55357ffee6 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics.html +++ b/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics.html @@ -4,8 +4,8 @@ Available Metrics | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/monitoring/config-metrics.html b/docs/ignite3/3.1.0/configure-and-operate/monitoring/config-metrics.html index e2737b4421..d1d13dc9e1 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/monitoring/config-metrics.html +++ b/docs/ignite3/3.1.0/configure-and-operate/monitoring/config-metrics.html @@ -4,8 +4,8 @@ Configuring Metrics | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views.html b/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views.html index fd477fa8ca..cdb873d2cf 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views.html +++ b/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views.html @@ -4,8 +4,8 @@ System Views | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics.html b/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics.html index 384e992220..4565ce86f0 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics.html +++ b/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics.html @@ -4,8 +4,8 @@ Metrics | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/operations.html b/docs/ignite3/3.1.0/configure-and-operate/operations.html index 8c0eead73a..39c48db9bd 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/operations.html +++ b/docs/ignite3/3.1.0/configure-and-operate/operations.html @@ -4,8 +4,8 @@ Operations | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                        Version: 3.1.0 (Latest)

                        Operations

                        Cluster lifecycle and operational procedures.

                        In This Section

                        -

                        Lifecycle Management

                        Start, stop, and manage cluster lifecycle operations.

                        Disaster Recovery

                        Backup, restore, and disaster recovery procedures.

                        Handle Exceptions

                        Exception handling and error recovery strategies.

                        Colocation

                        Data colocation strategies for performance optimization.

                        +

                        Lifecycle Management

                        Start, stop, and manage cluster lifecycle operations.

                        Disaster Recovery

                        Backup, restore, and disaster recovery procedures.

                        Handle Exceptions

                        Exception handling and error recovery strategies.

                        Colocation

                        Data colocation strategies for performance optimization.

                        Next Steps

                        • Configuration - Configure your cluster
                        • diff --git a/docs/ignite3/3.1.0/configure-and-operate/operations/colocation.html b/docs/ignite3/3.1.0/configure-and-operate/operations/colocation.html index b401bdab7f..0acbf2ec4d 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/operations/colocation.html +++ b/docs/ignite3/3.1.0/configure-and-operate/operations/colocation.html @@ -4,8 +4,8 @@ Data Colocation | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-partitions.html b/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-partitions.html index 4389add0e3..8242d7c1d5 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-partitions.html +++ b/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-partitions.html @@ -4,8 +4,8 @@ Disaster Recovery for Data Partitions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-system-groups.html b/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-system-groups.html index 19f0ca7a9e..07155f203a 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-system-groups.html +++ b/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-system-groups.html @@ -4,8 +4,8 @@ Disaster Recovery for System Groups | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery.html b/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery.html index 953495586e..d02b8a0cb4 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery.html +++ b/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery.html @@ -4,8 +4,8 @@ Disaster Recovery | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/operations/handle-exceptions.html b/docs/ignite3/3.1.0/configure-and-operate/operations/handle-exceptions.html index 6597ad15a6..8f2ef37270 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/operations/handle-exceptions.html +++ b/docs/ignite3/3.1.0/configure-and-operate/operations/handle-exceptions.html @@ -4,8 +4,8 @@ Errors and Solutions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle.html b/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle.html index 6f57aa3f25..0acdacd583 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle.html +++ b/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle.html @@ -4,8 +4,8 @@ Cluster Lifecycle | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/reference.html b/docs/ignite3/3.1.0/configure-and-operate/reference.html index e2b4f10439..6a3a0cf9a0 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/reference.html +++ b/docs/ignite3/3.1.0/configure-and-operate/reference.html @@ -4,8 +4,8 @@ Configuration Reference | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                          Version: 3.1.0 (Latest)

                          Configuration Reference

                          Complete configuration reference for Apache Ignite 3.

                          In This Section

                          -

                          Node Configuration

                          Complete reference for node configuration parameters.

                          Cluster Configuration

                          Complete reference for cluster-wide configuration parameters.

                          CLI Configuration

                          Command-line interface configuration and usage.

                          Storage Profiles

                          Storage profile configuration reference.

                          +

                          Node Configuration

                          Complete reference for node configuration parameters.

                          Cluster Configuration

                          Complete reference for cluster-wide configuration parameters.

                          CLI Configuration

                          Command-line interface configuration and usage.

                          Storage Profiles

                          Storage profile configuration reference.

                          Next Steps

                          • Configuration - Configuration guides
                          • diff --git a/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration.html b/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration.html index b6542794d7..5008a96013 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration.html +++ b/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration.html @@ -4,8 +4,8 @@ CLI Configuration Parameters | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration.html b/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration.html index b9c060bb63..d2ce8d0390 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration.html +++ b/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration.html @@ -4,8 +4,8 @@ Cluster Configuration Parameters | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration.html b/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration.html index 6684df3afb..59e21df4b7 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration.html +++ b/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration.html @@ -4,8 +4,8 @@ Node Configuration Parameters | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles.html b/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles.html index ec2ebc1001..f510525967 100644 --- a/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles.html +++ b/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles.html @@ -4,8 +4,8 @@ Storage Profiles Reference | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop.html b/docs/ignite3/3.1.0/develop.html index 7129af4eda..cabb4adc69 100644 --- a/docs/ignite3/3.1.0/develop.html +++ b/docs/ignite3/3.1.0/develop.html @@ -4,8 +4,8 @@ Develop | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                            Version: 3.1.0 (Latest)

                            Develop

                            Build applications with Apache Ignite 3 using native clients, SQL drivers, and framework integrations.

                            In This Section

                            -

                            Ignite Clients

                            Full-featured native clients for Java, .NET, and C++ with support for all Ignite APIs including tables, SQL, transactions, and compute.

                            Connect to Ignite

                            SQL-only connectivity through standard database drivers including JDBC, ODBC, and Python DB-API.

                            Use the Table API

                            Key-value and record-based data access with typed views for direct table operations.

                            Execute SQL Queries

                            Programmatic SQL execution with prepared statements, parameter binding, and result processing.

                            Work with Transactions

                            ACID transaction support with explicit transaction control and closure-based patterns.

                            Stream Data

                            High-throughput data streaming for bulk loading with reactive stream patterns.

                            Deploy Code

                            Deploy compute jobs to the cluster for colocated data processing and distributed execution.

                            Handle Events

                            React to cluster events including node join/leave, data changes, and system notifications.

                            Map Java Objects to Tables

                            Object-relational mapping with annotations for automatic schema generation and type conversion.

                            Spring Boot Integration

                            Auto-configuration and starters for Spring Boot applications with dependency injection support.

                            Spring Data Integration

                            Repository pattern support with Spring Data abstractions for simplified data access.

                            +

                            Ignite Clients

                            Full-featured native clients for Java, .NET, and C++ with support for all Ignite APIs including tables, SQL, transactions, and compute.

                            Connect to Ignite

                            SQL-only connectivity through standard database drivers including JDBC, ODBC, and Python DB-API.

                            Use the Table API

                            Key-value and record-based data access with typed views for direct table operations.

                            Execute SQL Queries

                            Programmatic SQL execution with prepared statements, parameter binding, and result processing.

                            Work with Transactions

                            ACID transaction support with explicit transaction control and closure-based patterns.

                            Stream Data

                            High-throughput data streaming for bulk loading with reactive stream patterns.

                            Deploy Code

                            Deploy compute jobs to the cluster for colocated data processing and distributed execution.

                            Handle Events

                            React to cluster events including node join/leave, data changes, and system notifications.

                            Map Java Objects to Tables

                            Object-relational mapping with annotations for automatic schema generation and type conversion.

                            Spring Boot Integration

                            Auto-configuration and starters for Spring Boot applications with dependency injection support.

                            Spring Data Integration

                            Repository pattern support with Spring Data abstractions for simplified data access.

                            Next Steps

                            • SQL - Learn about SQL capabilities and syntax
                            • diff --git a/docs/ignite3/3.1.0/develop/connect-to-ignite.html b/docs/ignite3/3.1.0/develop/connect-to-ignite.html index fce25a3bc6..a06aa26de3 100644 --- a/docs/ignite3/3.1.0/develop/connect-to-ignite.html +++ b/docs/ignite3/3.1.0/develop/connect-to-ignite.html @@ -4,8 +4,8 @@ Connect to Ignite | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                              Version: 3.1.0 (Latest)

                              Connect to Ignite

                              Multiple connectivity options for accessing Apache Ignite 3 clusters.

                              In This Section

                              -

                              JDBC Driver

                              Java Database Connectivity (JDBC) driver for SQL operations with standard database tools.

                              ODBC Driver

                              Open Database Connectivity (ODBC) for cross-platform SQL access from C/C++ applications.

                              Python DB-API

                              Python Database API (PEP-249) for SQL connectivity from Python applications.

                              +

                              JDBC Driver

                              Java Database Connectivity (JDBC) driver for SQL operations with standard database tools.

                              ODBC Driver

                              Open Database Connectivity (ODBC) for cross-platform SQL access from C/C++ applications.

                              Python DB-API

                              Python Database API (PEP-249) for SQL connectivity from Python applications.

                              Next Steps

                              • Work with Data - Data manipulation and processing
                              • diff --git a/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc.html b/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc.html index 8e21114147..42ed3fc202 100644 --- a/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc.html +++ b/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc.html @@ -4,8 +4,8 @@ JDBC Driver | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string.html b/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string.html index 58a217a974..8f46433130 100644 --- a/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string.html +++ b/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string.html @@ -4,8 +4,8 @@ ODBC Connection String | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data.html b/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data.html index 5e37f5f833..4618029972 100644 --- a/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data.html +++ b/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data.html @@ -4,8 +4,8 @@ Querying and Modifying Data with ODBC | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc.html b/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc.html index 86a5fe88d4..721411b48c 100644 --- a/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc.html +++ b/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc.html @@ -4,8 +4,8 @@ ODBC Driver | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/connect-to-ignite/python.html b/docs/ignite3/3.1.0/develop/connect-to-ignite/python.html index 0873cd06f8..cef05197d2 100644 --- a/docs/ignite3/3.1.0/develop/connect-to-ignite/python.html +++ b/docs/ignite3/3.1.0/develop/connect-to-ignite/python.html @@ -4,8 +4,8 @@ Python Database API Driver | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/ignite-clients.html b/docs/ignite3/3.1.0/develop/ignite-clients.html index cffa5d4319..f42f81bd7b 100644 --- a/docs/ignite3/3.1.0/develop/ignite-clients.html +++ b/docs/ignite3/3.1.0/develop/ignite-clients.html @@ -4,8 +4,8 @@ Ignite Clients | Apache Ignite 3 Documentation - - + + @@ -35,6 +35,6 @@

                                When to Use

                                For SQL-only connectivity, see Connect to Ignite.

                                Available Clients

                                -

                                Java Client

                                Primary API with complete feature set for all Ignite operations including thin client and embedded node modes.

                                .NET Client

                                Native .NET client for C# applications with async/await patterns and LINQ integration.

                                C++ Client

                                High-performance C++ client with modern C++17 features for low-latency applications.

                              +

                              Java Client

                              Primary API with complete feature set for all Ignite operations including thin client and embedded node modes.

                              .NET Client

                              Native .NET client for C# applications with async/await patterns and LINQ integration.

                              C++ Client

                              High-performance C++ client with modern C++17 features for low-latency applications.

                            \ No newline at end of file diff --git a/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client.html b/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client.html index 1be8549c32..43e40f818e 100644 --- a/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client.html +++ b/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client.html @@ -4,8 +4,8 @@ C++ Client | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client.html b/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client.html index d5a58e0d18..e80e9c0089 100644 --- a/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client.html +++ b/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client.html @@ -4,8 +4,8 @@ .NET Client | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/ignite-clients/java-client.html b/docs/ignite3/3.1.0/develop/ignite-clients/java-client.html index 689975c814..ccc37bc855 100644 --- a/docs/ignite3/3.1.0/develop/ignite-clients/java-client.html +++ b/docs/ignite3/3.1.0/develop/ignite-clients/java-client.html @@ -4,8 +4,8 @@ Java Client | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/integrate.html b/docs/ignite3/3.1.0/develop/integrate.html index 77a61a91f9..cf9b247d6a 100644 --- a/docs/ignite3/3.1.0/develop/integrate.html +++ b/docs/ignite3/3.1.0/develop/integrate.html @@ -4,8 +4,8 @@ Integrate | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                            Version: 3.1.0 (Latest)

                            Integrate

                            Framework integrations for Apache Ignite 3.

                            In This Section

                            -

                            Spring Boot

                            Auto-configured IgniteClient bean with property-based configuration and programmatic customization.

                            Spring Data

                            Spring Data JDBC repositories with CrudRepository, pagination, derived queries, and Query by Example.

                            +

                            Spring Boot

                            Auto-configured IgniteClient bean with property-based configuration and programmatic customization.

                            Spring Data

                            Spring Data JDBC repositories with CrudRepository, pagination, derived queries, and Query by Example.

                            Next Steps

                            • Work with Data - Core data operations
                            • diff --git a/docs/ignite3/3.1.0/develop/integrate/spring-boot.html b/docs/ignite3/3.1.0/develop/integrate/spring-boot.html index a61d5a84b8..09a79f2ae8 100644 --- a/docs/ignite3/3.1.0/develop/integrate/spring-boot.html +++ b/docs/ignite3/3.1.0/develop/integrate/spring-boot.html @@ -4,8 +4,8 @@ Spring Boot Integration | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/integrate/spring-data.html b/docs/ignite3/3.1.0/develop/integrate/spring-data.html index 228e488d8e..99148e7c58 100644 --- a/docs/ignite3/3.1.0/develop/integrate/spring-data.html +++ b/docs/ignite3/3.1.0/develop/integrate/spring-data.html @@ -4,8 +4,8 @@ Spring Data Integration | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data.html b/docs/ignite3/3.1.0/develop/work-with-data.html index 258a2a695b..36228901fd 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data.html +++ b/docs/ignite3/3.1.0/develop/work-with-data.html @@ -4,8 +4,8 @@ Work with Data | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                              Version: 3.1.0 (Latest)

                              Work with Data

                              Core data manipulation and processing capabilities in Apache Ignite 3.

                              In This Section

                              -

                              Table API

                              Key-value and record-based operations using the Table API for direct data access.

                              Transactions

                              ACID transactions with MVCC support for consistent data operations across the cluster.

                              Data Streaming

                              High-throughput data ingestion using the streaming API for bulk data loading.

                              Compute

                              Distributed computing with colocated processing for efficient data-local operations.

                              Serialization

                              Custom object serialization for efficient data transfer and storage.

                              Code Deployment

                              Deploy custom code units to cluster nodes for distributed execution.

                              Events

                              React to cluster events and data changes with the events API.

                              Events List

                              Complete reference of all available event types and their parameters.

                              Java to Tables

                              Create and manage tables programmatically from Java code.

                              Java Client Logging

                              Configure logging for the Java thin client using System.Logger or popular frameworks.

                              +

                              Table API

                              Key-value and record-based operations using the Table API for direct data access.

                              Transactions

                              ACID transactions with MVCC support for consistent data operations across the cluster.

                              Data Streaming

                              High-throughput data ingestion using the streaming API for bulk data loading.

                              Compute

                              Distributed computing with colocated processing for efficient data-local operations.

                              Serialization

                              Custom object serialization for efficient data transfer and storage.

                              Code Deployment

                              Deploy custom code units to cluster nodes for distributed execution.

                              Events

                              React to cluster events and data changes with the events API.

                              Events List

                              Complete reference of all available event types and their parameters.

                              Java to Tables

                              Create and manage tables programmatically from Java code.

                              Java Client Logging

                              Configure logging for the Java thin client using System.Logger or popular frameworks.

                              Next Steps

                              • Connect to Ignite - Connection methods
                              • diff --git a/docs/ignite3/3.1.0/develop/work-with-data/code-deployment.html b/docs/ignite3/3.1.0/develop/work-with-data/code-deployment.html index 4765885ddc..18b4b786f1 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/code-deployment.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/code-deployment.html @@ -4,8 +4,8 @@ Code Deployment | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data/compute.html b/docs/ignite3/3.1.0/develop/work-with-data/compute.html index c5d349fbcf..2e25cd4d3f 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/compute.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/compute.html @@ -4,8 +4,8 @@ Distributed Computing | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data/events-list.html b/docs/ignite3/3.1.0/develop/work-with-data/events-list.html index 1fd230f17a..37807f99bd 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/events-list.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/events-list.html @@ -4,8 +4,8 @@ Available Events | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data/events.html b/docs/ignite3/3.1.0/develop/work-with-data/events.html index d447eaef7d..08eabeea2a 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/events.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/events.html @@ -4,8 +4,8 @@ Working with Events | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging.html b/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging.html index 77d2106080..68a5232a9d 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging.html @@ -4,8 +4,8 @@ Java Client Logging | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables.html b/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables.html index 7787e5940e..9ba01146e7 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables.html @@ -4,8 +4,8 @@ Creating Tables from Java Classes | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data/serialization.html b/docs/ignite3/3.1.0/develop/work-with-data/serialization.html index 4b7a3ac490..5fe38a0296 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/serialization.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/serialization.html @@ -4,8 +4,8 @@ Object Serialization | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data/streaming.html b/docs/ignite3/3.1.0/develop/work-with-data/streaming.html index 81cf8a6bb6..b43921b5f4 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/streaming.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/streaming.html @@ -4,8 +4,8 @@ Streaming Data | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data/table-api.html b/docs/ignite3/3.1.0/develop/work-with-data/table-api.html index dbe610d08d..2480f35c96 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/table-api.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/table-api.html @@ -4,8 +4,8 @@ Table API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/develop/work-with-data/transactions.html b/docs/ignite3/3.1.0/develop/work-with-data/transactions.html index a00e8d8281..0fdbfa8d0e 100644 --- a/docs/ignite3/3.1.0/develop/work-with-data/transactions.html +++ b/docs/ignite3/3.1.0/develop/work-with-data/transactions.html @@ -4,8 +4,8 @@ Performing Transactions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/getting-started.html b/docs/ignite3/3.1.0/getting-started.html index 9309a0dbf2..03c70509f1 100644 --- a/docs/ignite3/3.1.0/getting-started.html +++ b/docs/ignite3/3.1.0/getting-started.html @@ -4,8 +4,8 @@ Getting Started | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                Version: 3.1.0 (Latest)

                                Getting Started

                                Learn the basics of Apache Ignite 3 and get your first cluster running.

                                In This Section

                                -

                                Introduction to Apache Ignite 3

                                Overview of Apache Ignite 3 capabilities, use cases, and core features for distributed data processing.

                                Quick Start Guide

                                Get started with Ignite in 5 minutes. Download, install, and execute your first queries.

                                Start Your First Cluster

                                Launch a local cluster, connect using clients, and verify cluster topology.

                                Work with SQL

                                Execute SQL queries, create tables, insert data, and perform data manipulation operations.

                                Use the Key-Value API

                                Work with data using the Table API for key-value and record-based operations.

                                Run in Embedded Mode

                                Embed Ignite nodes directly in your application for local data processing.

                                Best Practices

                                Production deployment tips, configuration recommendations, and performance optimization guidance.

                                Migrate from Ignite 2

                                Migration guide for Ignite 2 users covering API changes and feature mapping.

                                +

                                Introduction to Apache Ignite 3

                                Overview of Apache Ignite 3 capabilities, use cases, and core features for distributed data processing.

                                Quick Start Guide

                                Get started with Ignite in 5 minutes. Download, install, and execute your first queries.

                                Start Your First Cluster

                                Launch a local cluster, connect using clients, and verify cluster topology.

                                Work with SQL

                                Execute SQL queries, create tables, insert data, and perform data manipulation operations.

                                Use the Key-Value API

                                Work with data using the Table API for key-value and record-based operations.

                                Run in Embedded Mode

                                Embed Ignite nodes directly in your application for local data processing.

                                Best Practices

                                Production deployment tips, configuration recommendations, and performance optimization guidance.

                                Migrate from Ignite 2

                                Migration guide for Ignite 2 users covering API changes and feature mapping.

                                Next Steps

                                After completing the getting started tutorials, explore:

                                  diff --git a/docs/ignite3/3.1.0/getting-started/best-practices.html b/docs/ignite3/3.1.0/getting-started/best-practices.html index 88526560ab..6741916a07 100644 --- a/docs/ignite3/3.1.0/getting-started/best-practices.html +++ b/docs/ignite3/3.1.0/getting-started/best-practices.html @@ -4,8 +4,8 @@ Configuration Tips | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/getting-started/embedded-mode.html b/docs/ignite3/3.1.0/getting-started/embedded-mode.html index bd22150175..41c9aa4fcf 100644 --- a/docs/ignite3/3.1.0/getting-started/embedded-mode.html +++ b/docs/ignite3/3.1.0/getting-started/embedded-mode.html @@ -4,8 +4,8 @@ Embedded Mode | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/getting-started/intro.html b/docs/ignite3/3.1.0/getting-started/intro.html index 8730797ff5..65e112de21 100644 --- a/docs/ignite3/3.1.0/getting-started/intro.html +++ b/docs/ignite3/3.1.0/getting-started/intro.html @@ -4,8 +4,8 @@ Introduction | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/getting-started/key-value-api.html b/docs/ignite3/3.1.0/getting-started/key-value-api.html index d3cc21dccb..3257ea372f 100644 --- a/docs/ignite3/3.1.0/getting-started/key-value-api.html +++ b/docs/ignite3/3.1.0/getting-started/key-value-api.html @@ -4,8 +4,8 @@ Using Java API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1.html b/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1.html index aeee58f39d..67ff7303f5 100644 --- a/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1.html +++ b/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1.html @@ -4,8 +4,8 @@ Migrating from Apache Ignite 3.0 to 3.1 | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2.html b/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2.html index 68baa99d97..ab2fc5c0d3 100644 --- a/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2.html +++ b/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2.html @@ -4,8 +4,8 @@ Migrating from Ignite 2 | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/getting-started/quick-start.html b/docs/ignite3/3.1.0/getting-started/quick-start.html index c388767005..06be044cf7 100644 --- a/docs/ignite3/3.1.0/getting-started/quick-start.html +++ b/docs/ignite3/3.1.0/getting-started/quick-start.html @@ -4,8 +4,8 @@ Getting Started | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/getting-started/start-cluster.html b/docs/ignite3/3.1.0/getting-started/start-cluster.html index 9b99a8769a..112c9d73d7 100644 --- a/docs/ignite3/3.1.0/getting-started/start-cluster.html +++ b/docs/ignite3/3.1.0/getting-started/start-cluster.html @@ -4,8 +4,8 @@ Start a Cluster in Docker | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/getting-started/work-with-sql.html b/docs/ignite3/3.1.0/getting-started/work-with-sql.html index b457f5205d..ec4f4a0a00 100644 --- a/docs/ignite3/3.1.0/getting-started/work-with-sql.html +++ b/docs/ignite3/3.1.0/getting-started/work-with-sql.html @@ -4,8 +4,8 @@ Working with SQL | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql.html b/docs/ignite3/3.1.0/sql.html index 0e6b525578..4dd412fd39 100644 --- a/docs/ignite3/3.1.0/sql.html +++ b/docs/ignite3/3.1.0/sql.html @@ -4,8 +4,8 @@ SQL | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                  Version: 3.1.0 (Latest)

                                  SQL

                                  Complete SQL reference for Apache Ignite 3, including fundamentals, syntax, and performance tuning.

                                  In This Section

                                  -

                                  SQL Engine Architecture

                                  Understanding the SQL engine, query processing pipeline, and distributed query execution.

                                  Execute Queries

                                  Run SQL from applications using prepared statements, parameter binding, and result processing.

                                  Work with System Views

                                  Query cluster metadata, metrics, and system information through SQL views.

                                  DDL Commands

                                  Data definition language including CREATE, ALTER, and DROP statements for schema management.

                                  DML Commands

                                  Data manipulation language including SELECT, INSERT, UPDATE, and DELETE operations.

                                  Data Types

                                  Supported SQL data types including numeric, string, temporal, and binary types.

                                  Operators and Functions

                                  Built-in SQL functions and operators for arithmetic, string manipulation, date operations, and aggregations.

                                  Grammar Reference

                                  Complete SQL syntax with railroad diagrams showing valid statement structures.

                                  Keywords

                                  Reserved SQL keywords and naming restrictions for identifiers.

                                  SQL Conformance

                                  SQL standards compliance and supported ANSI SQL features.

                                  Distribution Zones

                                  Control data distribution across cluster nodes for performance optimization.

                                  EXPLAIN Statement

                                  Analyze query execution plans to understand performance characteristics.

                                  Performance Tuning

                                  Best practices for SQL query optimization and performance improvement.

                                  +

                                  SQL Engine Architecture

                                  Understanding the SQL engine, query processing pipeline, and distributed query execution.

                                  Execute Queries

                                  Run SQL from applications using prepared statements, parameter binding, and result processing.

                                  Work with System Views

                                  Query cluster metadata, metrics, and system information through SQL views.

                                  DDL Commands

                                  Data definition language including CREATE, ALTER, and DROP statements for schema management.

                                  DML Commands

                                  Data manipulation language including SELECT, INSERT, UPDATE, and DELETE operations.

                                  Data Types

                                  Supported SQL data types including numeric, string, temporal, and binary types.

                                  Operators and Functions

                                  Built-in SQL functions and operators for arithmetic, string manipulation, date operations, and aggregations.

                                  Grammar Reference

                                  Complete SQL syntax with railroad diagrams showing valid statement structures.

                                  Keywords

                                  Reserved SQL keywords and naming restrictions for identifiers.

                                  SQL Conformance

                                  SQL standards compliance and supported ANSI SQL features.

                                  Distribution Zones

                                  Control data distribution across cluster nodes for performance optimization.

                                  EXPLAIN Statement

                                  Analyze query execution plans to understand performance characteristics.

                                  Performance Tuning

                                  Best practices for SQL query optimization and performance improvement.

                                  Next Steps

                                  • Develop - Build applications with SQL
                                  • diff --git a/docs/ignite3/3.1.0/sql/advanced.html b/docs/ignite3/3.1.0/sql/advanced.html index 5208cbc472..aae7108b72 100644 --- a/docs/ignite3/3.1.0/sql/advanced.html +++ b/docs/ignite3/3.1.0/sql/advanced.html @@ -4,8 +4,8 @@ Advanced SQL | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                    Version: 3.1.0 (Latest)

                                    Advanced SQL

                                    Advanced SQL features including query optimization and performance tuning.

                                    In This Section

                                    -

                                    EXPLAIN Statement

                                    Analyze query execution plans to understand performance characteristics.

                                    Performance Tuning

                                    Best practices for SQL query optimization and performance improvement.

                                    +

                                    EXPLAIN Statement

                                    Analyze query execution plans to understand performance characteristics.

                                    Performance Tuning

                                    Best practices for SQL query optimization and performance improvement.

                                    Next Steps

                                    • SQL Reference - Complete language reference
                                    • diff --git a/docs/ignite3/3.1.0/sql/advanced/explain-statement.html b/docs/ignite3/3.1.0/sql/advanced/explain-statement.html index 77e45f326e..0fde69f99b 100644 --- a/docs/ignite3/3.1.0/sql/advanced/explain-statement.html +++ b/docs/ignite3/3.1.0/sql/advanced/explain-statement.html @@ -4,8 +4,8 @@ EXPLAIN Statement | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/advanced/performance-tuning.html b/docs/ignite3/3.1.0/sql/advanced/performance-tuning.html index f0092935aa..9ad9de7b39 100644 --- a/docs/ignite3/3.1.0/sql/advanced/performance-tuning.html +++ b/docs/ignite3/3.1.0/sql/advanced/performance-tuning.html @@ -4,8 +4,8 @@ Performance Tuning | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/fundamentals.html b/docs/ignite3/3.1.0/sql/fundamentals.html index 710277c197..2a6cff4090 100644 --- a/docs/ignite3/3.1.0/sql/fundamentals.html +++ b/docs/ignite3/3.1.0/sql/fundamentals.html @@ -4,8 +4,8 @@ SQL Fundamentals | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                      Version: 3.1.0 (Latest)

                                      SQL Fundamentals

                                      Core concepts and architecture of the Apache Ignite 3 SQL engine.

                                      In This Section

                                      -

                                      SQL Engine Architecture

                                      Understanding the SQL engine, query processing pipeline, and distributed query execution.

                                      +

                                      SQL Engine Architecture

                                      Understanding the SQL engine, query processing pipeline, and distributed query execution.

                                      Next Steps

                                      • SQL Operations - Execute queries and work with system views
                                      • diff --git a/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture.html b/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture.html index 548d06f8eb..15adc0c752 100644 --- a/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture.html +++ b/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture.html @@ -4,8 +4,8 @@ SQL Engine Architecture | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/reference.html b/docs/ignite3/3.1.0/sql/reference.html index de451385fc..c3f9914063 100644 --- a/docs/ignite3/3.1.0/sql/reference.html +++ b/docs/ignite3/3.1.0/sql/reference.html @@ -4,8 +4,8 @@ SQL Reference | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                        Version: 3.1.0 (Latest)

                                        SQL Reference

                                        Complete SQL language reference for Apache Ignite 3.

                                        In This Section

                                        -

                                        Language Definition

                                        DDL, DML, distribution zones, transactions, and grammar reference.

                                        Data Types and Functions

                                        Supported data types, operators, functions, and operational commands.

                                        SQL Conformance

                                        SQL standards compliance, keywords, and reserved words.

                                        +

                                        Language Definition

                                        DDL, DML, distribution zones, transactions, and grammar reference.

                                        Data Types and Functions

                                        Supported data types, operators, functions, and operational commands.

                                        SQL Conformance

                                        SQL standards compliance, keywords, and reserved words.

                                        Next Steps

                                        • SQL Fundamentals - SQL engine architecture
                                        • diff --git a/docs/ignite3/3.1.0/sql/reference/data-types-and-functions.html b/docs/ignite3/3.1.0/sql/reference/data-types-and-functions.html index 8e19ff75d4..749339c012 100644 --- a/docs/ignite3/3.1.0/sql/reference/data-types-and-functions.html +++ b/docs/ignite3/3.1.0/sql/reference/data-types-and-functions.html @@ -4,8 +4,8 @@ Data Types and Functions | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                          Version: 3.1.0 (Latest)

                                          Data Types and Functions

                                          SQL data types, operators, functions, and operational commands.

                                          In This Section

                                          -

                                          Data Types

                                          Supported SQL data types including numeric, string, temporal, and binary types.

                                          Operators and Functions

                                          Built-in SQL functions and operators for arithmetic, string manipulation, date operations, and aggregations.

                                          Operational Commands

                                          Operational SQL commands including SELECT, COPY INTO, KILL, and system management.

                                          +

                                          Data Types

                                          Supported SQL data types including numeric, string, temporal, and binary types.

                                          Operators and Functions

                                          Built-in SQL functions and operators for arithmetic, string manipulation, date operations, and aggregations.

                                          Operational Commands

                                          Operational SQL commands including SELECT, COPY INTO, KILL, and system management.

                                          Next Steps

                                          • Language Definition - DDL, DML, and grammar
                                          • diff --git a/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types.html b/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types.html index 3f8a0acff2..a887aeb750 100644 --- a/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types.html +++ b/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types.html @@ -4,8 +4,8 @@ SQL Data Types | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands.html b/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands.html index abd63b69a7..d0cb6f802c 100644 --- a/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands.html +++ b/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands.html @@ -4,8 +4,8 @@ Operational Commands | Apache Ignite 3 Documentation - - + + @@ -58,7 +58,7 @@

                                            Parameterss3.secret-access-key - when using S3 storage, the AWS secret key.
                                          • Iceberg-specific:
                                              -
                                            • The catalog properties are supported.
                                            • +
                                            • The catalog properties are supported.
                                            • The table-identifier property describes Apache Iceberg TableIdentifier names. The names can be dot-separated. For example, db_name.table_name or table.
                                            • The warehouse path can be defined explicitly as a 'warehouse'='path' property, or implicitly as a source or target COPY FROM source INTO target. If both ways are defined, the explicit property is used.
                                            diff --git a/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions.html b/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions.html index 1e82518c4a..7a01ad2a61 100644 --- a/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions.html +++ b/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions.html @@ -4,8 +4,8 @@ Operators and Functions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/reference/language-definition.html b/docs/ignite3/3.1.0/sql/reference/language-definition.html index 61a9855d78..06baa874f7 100644 --- a/docs/ignite3/3.1.0/sql/reference/language-definition.html +++ b/docs/ignite3/3.1.0/sql/reference/language-definition.html @@ -4,8 +4,8 @@ Language Definition | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                            Version: 3.1.0 (Latest)

                                            Language Definition

                                            SQL language definition including DDL, DML, distribution zones, transactions, and grammar.

                                            In This Section

                                            -

                                            DDL Commands

                                            Data definition language including CREATE, ALTER, and DROP statements for schema management.

                                            DML Commands

                                            Data manipulation language including SELECT, INSERT, UPDATE, and DELETE operations.

                                            Distribution Zones

                                            Control data distribution across cluster nodes for performance optimization.

                                            Transactions

                                            Transaction control statements for ACID-compliant data operations.

                                            Grammar Reference

                                            Complete SQL syntax with railroad diagrams showing valid statement structures.

                                            +

                                            DDL Commands

                                            Data definition language including CREATE, ALTER, and DROP statements for schema management.

                                            DML Commands

                                            Data manipulation language including SELECT, INSERT, UPDATE, and DELETE operations.

                                            Distribution Zones

                                            Control data distribution across cluster nodes for performance optimization.

                                            Transactions

                                            Transaction control statements for ACID-compliant data operations.

                                            Grammar Reference

                                            Complete SQL syntax with railroad diagrams showing valid statement structures.

                                            Next Steps

                                            • Data Types and Functions - SQL types and functions
                                            • diff --git a/docs/ignite3/3.1.0/sql/reference/language-definition/ddl.html b/docs/ignite3/3.1.0/sql/reference/language-definition/ddl.html index 7636e4c03c..ea0f466ff1 100644 --- a/docs/ignite3/3.1.0/sql/reference/language-definition/ddl.html +++ b/docs/ignite3/3.1.0/sql/reference/language-definition/ddl.html @@ -4,8 +4,8 @@ Data Definition Language (DDL) | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones.html b/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones.html index aae7574ada..9faf2b8ee7 100644 --- a/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones.html +++ b/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones.html @@ -4,8 +4,8 @@ Distribution Zones | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/reference/language-definition/dml.html b/docs/ignite3/3.1.0/sql/reference/language-definition/dml.html index 1ea9b04643..6560528552 100644 --- a/docs/ignite3/3.1.0/sql/reference/language-definition/dml.html +++ b/docs/ignite3/3.1.0/sql/reference/language-definition/dml.html @@ -4,8 +4,8 @@ Data Manipulation Language (DML) | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference.html b/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference.html index 0c1dd40322..e2b323de5c 100644 --- a/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference.html +++ b/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference.html @@ -4,8 +4,8 @@ Grammar Reference | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/reference/language-definition/transactions.html b/docs/ignite3/3.1.0/sql/reference/language-definition/transactions.html index 3a0c1ea384..ef910f93b3 100644 --- a/docs/ignite3/3.1.0/sql/reference/language-definition/transactions.html +++ b/docs/ignite3/3.1.0/sql/reference/language-definition/transactions.html @@ -4,8 +4,8 @@ Transactions | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/reference/sql-conformance.html b/docs/ignite3/3.1.0/sql/reference/sql-conformance.html index 36d251238c..0fc6181265 100644 --- a/docs/ignite3/3.1.0/sql/reference/sql-conformance.html +++ b/docs/ignite3/3.1.0/sql/reference/sql-conformance.html @@ -4,8 +4,8 @@ SQL Conformance | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                              Version: 3.1.0 (Latest)

                                              SQL Conformance

                                              SQL standards compliance and reserved keywords.

                                              In This Section

                                              -

                                              SQL Conformance

                                              SQL standards compliance and supported ANSI SQL features.

                                              Keywords

                                              Reserved SQL keywords and naming restrictions for identifiers.

                                              +

                                              SQL Conformance

                                              SQL standards compliance and supported ANSI SQL features.

                                              Keywords

                                              Reserved SQL keywords and naming restrictions for identifiers.

                                              Next Steps

                                              • Language Definition - DDL, DML, and grammar
                                              • diff --git a/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords.html b/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords.html index 87eb59d76d..86ad48e3cf 100644 --- a/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords.html +++ b/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords.html @@ -4,8 +4,8 @@ SQL Keywords | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview.html b/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview.html index c017503812..718e56c5a3 100644 --- a/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview.html +++ b/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview.html @@ -4,8 +4,8 @@ SQL Conformance | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/working-with-sql.html b/docs/ignite3/3.1.0/sql/working-with-sql.html index 3efe32522f..271cc6f9c6 100644 --- a/docs/ignite3/3.1.0/sql/working-with-sql.html +++ b/docs/ignite3/3.1.0/sql/working-with-sql.html @@ -4,8 +4,8 @@ SQL Operations | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                                Version: 3.1.0 (Latest)

                                                SQL Operations

                                                Execute SQL queries and work with system views in Apache Ignite 3.

                                                In This Section

                                                -

                                                Execute Queries

                                                Run SQL from applications using prepared statements, parameter binding, and result processing.

                                                System Views

                                                Query cluster metadata, metrics, and system information through SQL views.

                                                +

                                                Execute Queries

                                                Run SQL from applications using prepared statements, parameter binding, and result processing.

                                                System Views

                                                Query cluster metadata, metrics, and system information through SQL views.

                                                Next Steps

                                                • SQL Reference - Complete SQL language reference
                                                • diff --git a/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries.html b/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries.html index ce37986dd6..ce0563b227 100644 --- a/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries.html +++ b/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries.html @@ -4,8 +4,8 @@ Executing SQL Queries | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/sql/working-with-sql/system-views.html b/docs/ignite3/3.1.0/sql/working-with-sql/system-views.html index 4d71e88e2d..65207517e5 100644 --- a/docs/ignite3/3.1.0/sql/working-with-sql/system-views.html +++ b/docs/ignite3/3.1.0/sql/working-with-sql/system-views.html @@ -4,8 +4,8 @@ System Views | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/tools.html b/docs/ignite3/3.1.0/tools.html index f7b9a5d665..3ba6097e32 100644 --- a/docs/ignite3/3.1.0/tools.html +++ b/docs/ignite3/3.1.0/tools.html @@ -4,8 +4,8 @@ Tools | Apache Ignite 3 Documentation - - + + @@ -18,7 +18,7 @@

                                                  CLI ToolsREST API

                                                  The REST API allows remote cluster management and monitoring through HTTP endpoints. See the REST API reference for endpoint documentation.

                                                  In This Section

                                                  -

                                                  CLI Commands

                                                  Command-line interface reference for cluster initialization, node management, and configuration.

                                                  REST API

                                                  RESTful API endpoints for remote cluster management, monitoring, and operations.

                                                  Glossary

                                                  Common terms and definitions for Apache Ignite concepts and terminology.

                                                  +

                                                  CLI Commands

                                                  Command-line interface reference for cluster initialization, node management, and configuration.

                                                  REST API

                                                  RESTful API endpoints for remote cluster management, monitoring, and operations.

                                                  Glossary

                                                  Common terms and definitions for Apache Ignite concepts and terminology.

                                                  Next Steps

                                                  • Configure and Operate - Cluster management
                                                  • diff --git a/docs/ignite3/3.1.0/tools/cli-commands.html b/docs/ignite3/3.1.0/tools/cli-commands.html index 2b5290acd1..a4103cb486 100644 --- a/docs/ignite3/3.1.0/tools/cli-commands.html +++ b/docs/ignite3/3.1.0/tools/cli-commands.html @@ -4,8 +4,8 @@ CLI Commands Reference | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/tools/glossary.html b/docs/ignite3/3.1.0/tools/glossary.html index 2a3f380691..de1cb4369e 100644 --- a/docs/ignite3/3.1.0/tools/glossary.html +++ b/docs/ignite3/3.1.0/tools/glossary.html @@ -4,8 +4,8 @@ Glossary | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/tools/rest-api.html b/docs/ignite3/3.1.0/tools/rest-api.html index fd6f316658..a67869481f 100644 --- a/docs/ignite3/3.1.0/tools/rest-api.html +++ b/docs/ignite3/3.1.0/tools/rest-api.html @@ -4,8 +4,8 @@ REST API | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand.html b/docs/ignite3/3.1.0/understand.html index 43e1182801..16aafa4ee0 100644 --- a/docs/ignite3/3.1.0/understand.html +++ b/docs/ignite3/3.1.0/understand.html @@ -4,8 +4,8 @@ Understand | Apache Ignite 3 Documentation - - + + @@ -15,13 +15,13 @@

                                                    This section explains how Apache Ignite 3 works. Start with core concepts to understand the data model and distributed processing fundamentals, then explore the architecture for implementation details.

                                                    Core Concepts

                                                    Fundamental concepts for working with Apache Ignite 3.

                                                    -

                                                    What is Apache Ignite 3?

                                                    Distributed database capabilities, use cases, and system components.

                                                    Tables and Schemas

                                                    Data organization with tables, schemas, indexes, and the system catalog.

                                                    Transactions and MVCC

                                                    ACID transactions, isolation levels, and multi-version concurrency control.

                                                    Distribution and Colocation

                                                    Distribution zones, data placement, and colocation strategies for joins.

                                                    Data Partitioning

                                                    Partition distribution, replicas, leases, and replication groups.

                                                    Compute and Events

                                                    Distributed job execution, code deployment, and cluster event handling.

                                                    +

                                                    What is Apache Ignite 3?

                                                    Distributed database capabilities, use cases, and system components.

                                                    Tables and Schemas

                                                    Data organization with tables, schemas, indexes, and the system catalog.

                                                    Transactions and MVCC

                                                    ACID transactions, isolation levels, and multi-version concurrency control.

                                                    Distribution and Colocation

                                                    Distribution zones, data placement, and colocation strategies for joins.

                                                    Data Partitioning

                                                    Partition distribution, replicas, leases, and replication groups.

                                                    Compute and Events

                                                    Distributed job execution, code deployment, and cluster event handling.

                                                    Architecture

                                                    System architecture, storage implementation, and data distribution.

                                                    -

                                                    Architecture Overview

                                                    Node components, cluster coordination, RAFT consensus, and request flow.

                                                    Storage Architecture

                                                    Storage layers, profiles, and the relationship between zones and engines.

                                                    Storage Engines

                                                    AIMemory, AIPersist, and RocksDB engine configuration and characteristics.

                                                    Security Architecture

                                                    Authentication, SSL/TLS encryption, and security configuration.

                                                    +

                                                    Architecture Overview

                                                    Node components, cluster coordination, RAFT consensus, and request flow.

                                                    Storage Architecture

                                                    Storage layers, profiles, and the relationship between zones and engines.

                                                    Storage Engines

                                                    AIMemory, AIPersist, and RocksDB engine configuration and characteristics.

                                                    Security Architecture

                                                    Authentication, SSL/TLS encryption, and security configuration.

                                                    Performance

                                                    Query analysis and optimization techniques.

                                                    -

                                                    Using EXPLAIN

                                                    Analyze query execution plans to understand performance characteristics.

                                                    EXPLAIN Operators

                                                    Reference for all query plan operators and their attributes.

                                                    +

                                                    Using EXPLAIN

                                                    Analyze query execution plans to understand performance characteristics.

                                                    EXPLAIN Operators

                                                    Reference for all query plan operators and their attributes.

                                                    Next Steps

                                                    • Getting Started - Quick start guides
                                                    • diff --git a/docs/ignite3/3.1.0/understand/architecture.html b/docs/ignite3/3.1.0/understand/architecture.html index dea760635d..4c496d6803 100644 --- a/docs/ignite3/3.1.0/understand/architecture.html +++ b/docs/ignite3/3.1.0/understand/architecture.html @@ -4,8 +4,8 @@ Architecture | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                                      Version: 3.1.0 (Latest)

                                                      Architecture

                                                      Apache Ignite 3 architecture deep dive.

                                                      In This Section

                                                      -

                                                      Architecture Overview

                                                      System architecture, node components, and cluster coordination.

                                                      Storage Architecture

                                                      Storage layers, profiles, and persistence mechanisms.

                                                      Storage Engines

                                                      AIMemory, AIPersist, and RocksDB storage engine details.

                                                      Security Architecture

                                                      Authentication, SSL/TLS encryption, and security configuration.

                                                      +

                                                      Architecture Overview

                                                      System architecture, node components, and cluster coordination.

                                                      Storage Architecture

                                                      Storage layers, profiles, and persistence mechanisms.

                                                      Storage Engines

                                                      AIMemory, AIPersist, and RocksDB storage engine details.

                                                      Security Architecture

                                                      Authentication, SSL/TLS encryption, and security configuration.

                                                      Next Steps

                                                      • Core Concepts - Fundamental concepts
                                                      • diff --git a/docs/ignite3/3.1.0/understand/architecture/architecture-overview.html b/docs/ignite3/3.1.0/understand/architecture/architecture-overview.html index 71706c0a8d..1baeba2d3b 100644 --- a/docs/ignite3/3.1.0/understand/architecture/architecture-overview.html +++ b/docs/ignite3/3.1.0/understand/architecture/architecture-overview.html @@ -4,8 +4,8 @@ Architecture Overview | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/architecture/security.html b/docs/ignite3/3.1.0/understand/architecture/security.html index 998b00dfe5..33de724dd3 100644 --- a/docs/ignite3/3.1.0/understand/architecture/security.html +++ b/docs/ignite3/3.1.0/understand/architecture/security.html @@ -4,8 +4,8 @@ Security Architecture | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/architecture/storage-architecture.html b/docs/ignite3/3.1.0/understand/architecture/storage-architecture.html index 69a51a06c5..80b851fc82 100644 --- a/docs/ignite3/3.1.0/understand/architecture/storage-architecture.html +++ b/docs/ignite3/3.1.0/understand/architecture/storage-architecture.html @@ -4,8 +4,8 @@ Storage Architecture | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/architecture/storage-engines.html b/docs/ignite3/3.1.0/understand/architecture/storage-engines.html index c4046eb979..117031dc07 100644 --- a/docs/ignite3/3.1.0/understand/architecture/storage-engines.html +++ b/docs/ignite3/3.1.0/understand/architecture/storage-engines.html @@ -4,8 +4,8 @@ Storage Engines | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                                        Version: 3.1.0 (Latest)

                                                        Storage Engines

                                                        Storage engine implementations in Apache Ignite 3.

                                                        In This Section

                                                        -

                                                        AIMemory

                                                        In-memory volatile storage engine for high-speed data access.

                                                        AIPersist

                                                        Persistent B+ tree storage engine with page-based organization.

                                                        RocksDB

                                                        LSM-tree based storage engine optimized for write-heavy workloads.

                                                        +

                                                        AIMemory

                                                        In-memory volatile storage engine for high-speed data access.

                                                        AIPersist

                                                        Persistent B+ tree storage engine with page-based organization.

                                                        RocksDB

                                                        LSM-tree based storage engine optimized for write-heavy workloads.

                                                        Next Steps

                                                        • Storage Architecture - Storage overview
                                                        • diff --git a/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem.html b/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem.html index 6d5ac76d4e..d1d48bea13 100644 --- a/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem.html +++ b/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem.html @@ -4,8 +4,8 @@ AIMemory Storage Engine | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist.html b/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist.html index cb2ab2eb1f..01bca49fea 100644 --- a/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist.html +++ b/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist.html @@ -4,8 +4,8 @@ AIPersist Storage Engine | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb.html b/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb.html index 3f2538c52d..5cff51e246 100644 --- a/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb.html +++ b/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb.html @@ -4,8 +4,8 @@ RocksDB Storage Engine | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/core-concepts.html b/docs/ignite3/3.1.0/understand/core-concepts.html index 1017441e80..754c452858 100644 --- a/docs/ignite3/3.1.0/understand/core-concepts.html +++ b/docs/ignite3/3.1.0/understand/core-concepts.html @@ -4,8 +4,8 @@ Core Concepts | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                                          Version: 3.1.0 (Latest)

                                                          Core Concepts

                                                          Fundamental concepts in Apache Ignite 3.

                                                          In This Section

                                                          -

                                                          What is Ignite

                                                          Introduction to Apache Ignite 3 capabilities, architecture, and use cases.

                                                          Tables and Schemas

                                                          Understanding tables, schemas, and data organization in Ignite.

                                                          Transactions and MVCC

                                                          ACID transactions with multi-version concurrency control.

                                                          Distribution and Colocation

                                                          Data distribution and colocation strategies for performance.

                                                          Data Partitioning

                                                          Partition distribution, replicas, leases, and replication groups.

                                                          Compute and Events

                                                          Distributed computing and event handling in the cluster.

                                                          +

                                                          What is Ignite

                                                          Introduction to Apache Ignite 3 capabilities, architecture, and use cases.

                                                          Tables and Schemas

                                                          Understanding tables, schemas, and data organization in Ignite.

                                                          Transactions and MVCC

                                                          ACID transactions with multi-version concurrency control.

                                                          Distribution and Colocation

                                                          Data distribution and colocation strategies for performance.

                                                          Data Partitioning

                                                          Partition distribution, replicas, leases, and replication groups.

                                                          Compute and Events

                                                          Distributed computing and event handling in the cluster.

                                                          Next Steps

                                                          • Architecture - Deep dive into architecture
                                                          • diff --git a/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events.html b/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events.html index 5a2681b6e0..417e532783 100644 --- a/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events.html +++ b/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events.html @@ -4,8 +4,8 @@ Compute and Events | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning.html b/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning.html index abcd6117bb..8224b0f2a3 100644 --- a/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning.html +++ b/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning.html @@ -4,8 +4,8 @@ Data Partitioning | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation.html b/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation.html index de005fcfa5..ccbf7df334 100644 --- a/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation.html +++ b/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation.html @@ -4,8 +4,8 @@ Distribution and Colocation | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas.html b/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas.html index 76c1a69914..1166ee3a77 100644 --- a/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas.html +++ b/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas.html @@ -4,8 +4,8 @@ Tables and Schemas | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc.html b/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc.html index 02bd700010..ac653892fb 100644 --- a/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc.html +++ b/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc.html @@ -4,8 +4,8 @@ Transactions and MVCC | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite.html b/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite.html index c3ffdd0475..b5b25d8313 100644 --- a/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite.html +++ b/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite.html @@ -4,8 +4,8 @@ What is Apache Ignite 3? | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/performance.html b/docs/ignite3/3.1.0/understand/performance.html index aa497c3e20..b7680f7db1 100644 --- a/docs/ignite3/3.1.0/understand/performance.html +++ b/docs/ignite3/3.1.0/understand/performance.html @@ -4,8 +4,8 @@ Performance | Apache Ignite 3 Documentation - - + + @@ -14,7 +14,7 @@
                                                            Version: 3.1.0 (Latest)

                                                            Performance

                                                            Understanding query performance and optimization.

                                                            In This Section

                                                            -

                                                            Using EXPLAIN

                                                            Analyze query execution plans with the EXPLAIN statement.

                                                            EXPLAIN Operators

                                                            Reference guide for relational operators in execution plans.

                                                            +

                                                            Using EXPLAIN

                                                            Analyze query execution plans with the EXPLAIN statement.

                                                            EXPLAIN Operators

                                                            Reference guide for relational operators in execution plans.

                                                            Next Steps

                                                            • SQL Advanced - Performance tuning guide
                                                            • diff --git a/docs/ignite3/3.1.0/understand/performance/explain-operators.html b/docs/ignite3/3.1.0/understand/performance/explain-operators.html index ecef9b4de7..87d82cddb9 100644 --- a/docs/ignite3/3.1.0/understand/performance/explain-operators.html +++ b/docs/ignite3/3.1.0/understand/performance/explain-operators.html @@ -4,8 +4,8 @@ EXPLAIN Operators Reference | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/3.1.0/understand/performance/using-explain.html b/docs/ignite3/3.1.0/understand/performance/using-explain.html index 5d93733a36..faaa0177af 100644 --- a/docs/ignite3/3.1.0/understand/performance/using-explain.html +++ b/docs/ignite3/3.1.0/understand/performance/using-explain.html @@ -4,8 +4,8 @@ Using EXPLAIN Command | Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/404.html b/docs/ignite3/404.html index c03b680189..4415fe06ce 100644 --- a/docs/ignite3/404.html +++ b/docs/ignite3/404.html @@ -4,8 +4,8 @@ Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/assets/js/00310d16.657729fb.js b/docs/ignite3/assets/js/00310d16.657729fb.js deleted file mode 100644 index a0deeed7a4..0000000000 --- a/docs/ignite3/assets/js/00310d16.657729fb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[746],{28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var o=n(96540);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}},80042:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"tools/rest-api","title":"REST API","description":"The Apache Ignite clusters provide an OpenAPI specification that can be used to work with Apache Ignite by standard REST methods.","source":"@site/docs/tools/rest-api.md","sourceDirName":"tools","slug":"/tools/rest-api","permalink":"/docs/ignite3/3.1.0/tools/rest-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"id":"rest-api","title":"REST API","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"CLI Commands Reference","permalink":"/docs/ignite3/3.1.0/tools/cli-commands"},"next":{"title":"Glossary","permalink":"/docs/ignite3/3.1.0/tools/glossary"}}');var i=n(74848),r=n(28453);const s={id:"rest-api",title:"REST API",sidebar_position:2},a="REST API",c={},l=[{value:"REST Connector Configuration",id:"rest-connector-configuration",level:2},{value:"Using HTTP Tools",id:"using-http-tools",level:2},{value:"Java Project Configuration",id:"java-project-configuration",level:2}];function p(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"rest-api",children:"REST API"})}),"\n",(0,i.jsxs)(t.p,{children:["The Apache Ignite clusters provide an ",(0,i.jsx)(t.a,{href:"https://www.openapis.org/",children:"OpenAPI"})," specification that can be used to work with Apache Ignite by standard REST methods."]}),"\n",(0,i.jsx)(t.h2,{id:"rest-connector-configuration",children:"REST Connector Configuration"}),"\n",(0,i.jsxs)(t.p,{children:["By default, rest connector starts on port 10300. This port can be configured in the ",(0,i.jsx)(t.code,{children:"ignite.rest"})," ",(0,i.jsx)(t.a,{href:"/3.1.0/configure-and-operate/reference/node-configuration",children:"node configuration"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"using-http-tools",children:"Using HTTP Tools"}),"\n",(0,i.jsxs)(t.p,{children:["Once the cluster is started, you can use external tools to monitor the cluster over http, or manage the cluster. In this example, we will use ",(0,i.jsx)(t.a,{href:"https://curl.se/",children:"curl"})," to get cluster status:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"curl 'http://localhost:10300/management/v1/cluster/state'\n"})}),"\n",(0,i.jsxs)(t.p,{children:["You are not limited to only monitoring, as Apache Ignite REST API provides endpoints that can be used to manage the cluster as well. For example, you can create a ",(0,i.jsx)(t.a,{href:"/3.1.0/configure-and-operate/operations/disaster-recovery-partitions",children:"snapshot"})," via REST:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'curl -H "Content-Type: application/json" -d \'{"snapshotType": "FULL","tableNames": "table1,table2","startTimeEpochMilli": 0}\' http://localhost:10300/management/v1/snapshot/create\n'})}),"\n",(0,i.jsx)(t.h2,{id:"java-project-configuration",children:"Java Project Configuration"}),"\n",(0,i.jsxs)(t.p,{children:["If you want to integrate Apache Ignite REST API closer into your application, we recommend using an ",(0,i.jsx)(t.a,{href:"https://github.com/OpenAPITools/openapi-generator",children:"OpenAPI generator"})," to generate a Java client. Once the client is generated, you can use it to work with REST API from code, for example:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-java",children:'ApiClient client = Configuration.getDefaultApiClient();\r\n// Set base URL\r\nclient.setBasePath("http://localhost:10300");\r\n\r\n// Get cluster configuration.\r\nClusterConfigurationApi clusterConfigurationApi = new ClusterConfigurationApi(client);\r\nString configuration = clusterConfigurationApi.getClusterConfiguration();\n'})})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/01605f1b.5cdc9d7f.js b/docs/ignite3/assets/js/01605f1b.5cdc9d7f.js deleted file mode 100644 index ab73180545..0000000000 --- a/docs/ignite3/assets/js/01605f1b.5cdc9d7f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[720],{8164:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"api-reference/sql-only-apis/jdbc","title":"JDBC Driver","description":"The Apache Ignite 3 JDBC driver implements JDBC 4.x standard for Java applications. It connects directly to cluster nodes using a thin client protocol and requires no server-side libraries.","source":"@site/docs/api-reference/sql-only-apis/jdbc.md","sourceDirName":"api-reference/sql-only-apis","slug":"/api-reference/sql-only-apis/jdbc","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"JDBC Driver","id":"jdbc","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"SQL-Only APIs","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/"},"next":{"title":"ODBC Driver","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc"}}');var i=t(74848),s=t(28453);const c={title:"JDBC Driver",id:"jdbc",sidebar_position:1},a="JDBC Driver",o={},l=[{value:"Connection String Format",id:"connection-string-format",level:2},{value:"Configuration Parameters",id:"configuration-parameters",level:2},{value:"Connection Parameters",id:"connection-parameters",level:3},{value:"Authentication",id:"authentication",level:3},{value:"SSL Configuration",id:"ssl-configuration",level:3},{value:"Schema Selection",id:"schema-selection",level:3},{value:"Parameter Precedence",id:"parameter-precedence",level:2},{value:"Driver Registration",id:"driver-registration",level:2},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Basic Connection",id:"basic-connection",level:3},{value:"Connection with Authentication",id:"connection-with-authentication",level:3},{value:"Connection with SSL",id:"connection-with-ssl",level:3},{value:"Multiple Node Addresses",id:"multiple-node-addresses",level:3},{value:"Prepared Statements",id:"prepared-statements",level:3},{value:"Batch Operations",id:"batch-operations",level:3},{value:"Transaction Control",id:"transaction-control",level:3},{value:"Query Timeout",id:"query-timeout",level:3},{value:"Fetch Size Configuration",id:"fetch-size-configuration",level:3},{value:"Ignite-Specific Behavior",id:"ignite-specific-behavior",level:2},{value:"Type Mapping",id:"type-mapping",level:3},{value:"Result Set Characteristics",id:"result-set-characteristics",level:3},{value:"Pagination",id:"pagination",level:3},{value:"Statement Cancellation",id:"statement-cancellation",level:3},{value:"Network Timeout",id:"network-timeout",level:3},{value:"Connection String Examples",id:"connection-string-examples",level:2},{value:"Reference",id:"reference",level:2},{value:"Driver Class",id:"driver-class",level:3},{value:"JDBC Compliance",id:"jdbc-compliance",level:3},{value:"Limitations",id:"limitations",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"jdbc-driver",children:"JDBC Driver"})}),"\n",(0,i.jsx)(n.p,{children:"The Apache Ignite 3 JDBC driver implements JDBC 4.x standard for Java applications. It connects directly to cluster nodes using a thin client protocol and requires no server-side libraries."}),"\n",(0,i.jsx)(n.h2,{id:"connection-string-format",children:"Connection String Format"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"jdbc:ignite:thin://host[:port][,host[:port]][/schema][?param=value[¶m=value]]\n"})}),"\n",(0,i.jsx)(n.p,{children:"The driver supports multiple host addresses for failover. When one node becomes unavailable, the driver automatically attempts to connect to the next address in the list."}),"\n",(0,i.jsx)(n.p,{children:"Default port: 10800\r\nDefault schema: PUBLIC"}),"\n",(0,i.jsx)(n.h2,{id:"configuration-parameters",children:"Configuration Parameters"}),"\n",(0,i.jsx)(n.h3,{id:"connection-parameters",children:"Connection Parameters"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"connectionTimeout"})," - Socket connection timeout in milliseconds (default: 0, no timeout)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"connectionTimeZone"})," - ZoneId string for timestamp conversions (default: system timezone)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"queryTimeout"})," - Default query timeout in seconds (default: no timeout)"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(n.p,{children:"Basic authentication uses username and password credentials:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"username"})," - Authentication username"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"password"})," - Authentication password"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"ssl-configuration",children:"SSL Configuration"}),"\n",(0,i.jsx)(n.p,{children:"Enable SSL with certificate-based authentication:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"sslEnabled"})," - Set to ",(0,i.jsx)(n.code,{children:"true"})," to enable SSL (default: ",(0,i.jsx)(n.code,{children:"false"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"trustStorePath"})," - Path to Java trust store file containing trusted certificates"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"trustStorePassword"})," - Trust store password"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"keyStorePath"})," - Path to Java key store file containing client private key and certificate"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"keyStorePassword"})," - Key store password"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ciphers"})," - Comma-separated list of allowed cipher suites"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"schema-selection",children:"Schema Selection"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"schema"})," - Default schema for queries (default: ",(0,i.jsx)(n.code,{children:"PUBLIC"}),")"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"parameter-precedence",children:"Parameter Precedence"}),"\n",(0,i.jsx)(n.p,{children:"When the same parameter appears in multiple locations, the driver applies them in this order (highest to lowest):"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Connection object method calls (e.g., ",(0,i.jsx)(n.code,{children:"setNetworkTimeout()"}),")"]}),"\n",(0,i.jsx)(n.li,{children:"Last occurrence in connection string"}),"\n",(0,i.jsxs)(n.li,{children:["Properties object passed to ",(0,i.jsx)(n.code,{children:"DriverManager.getConnection()"})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"driver-registration",children:"Driver Registration"}),"\n",(0,i.jsx)(n.p,{children:"The driver registers automatically using Java Service Provider Interface (SPI). Load it explicitly if needed:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'Class.forName("org.apache.ignite.jdbc.IgniteJdbcDriver");\n'})}),"\n",(0,i.jsx)(n.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,i.jsx)(n.h3,{id:"basic-connection",children:"Basic Connection"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'import java.sql.Connection;\r\nimport java.sql.DriverManager;\r\nimport java.sql.ResultSet;\r\nimport java.sql.Statement;\r\n\r\nString url = "jdbc:ignite:thin://localhost:10800";\r\n\r\ntry (Connection conn = DriverManager.getConnection(url)) {\r\n try (Statement stmt = conn.createStatement()) {\r\n try (ResultSet rs = stmt.executeQuery("SELECT id, name FROM users")) {\r\n while (rs.next()) {\r\n int id = rs.getInt("id");\r\n String name = rs.getString("name");\r\n System.out.println(id + ": " + name);\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"connection-with-authentication",children:"Connection with Authentication"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'String url = "jdbc:ignite:thin://localhost:10800?username=admin&password=secret";\r\n\r\ntry (Connection conn = DriverManager.getConnection(url)) {\r\n // Execute queries\r\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Alternative using Properties:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'String url = "jdbc:ignite:thin://localhost:10800";\r\nProperties props = new Properties();\r\nprops.setProperty("username", "admin");\r\nprops.setProperty("password", "secret");\r\n\r\ntry (Connection conn = DriverManager.getConnection(url, props)) {\r\n // Execute queries\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"connection-with-ssl",children:"Connection with SSL"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'String url = "jdbc:ignite:thin://localhost:10800" +\r\n "?sslEnabled=true" +\r\n "&trustStorePath=/path/to/truststore.jks" +\r\n "&trustStorePassword=changeit" +\r\n "&keyStorePath=/path/to/keystore.jks" +\r\n "&keyStorePassword=changeit";\r\n\r\ntry (Connection conn = DriverManager.getConnection(url)) {\r\n // Execute queries over SSL\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"multiple-node-addresses",children:"Multiple Node Addresses"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'String url = "jdbc:ignite:thin://node1:10800,node2:10800,node3:10800/mySchema";\r\n\r\ntry (Connection conn = DriverManager.getConnection(url)) {\r\n // Connection attempts nodes in order until one succeeds\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"prepared-statements",children:"Prepared Statements"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";\r\n\r\ntry (Connection conn = DriverManager.getConnection(url);\r\n PreparedStatement pstmt = conn.prepareStatement(sql)) {\r\n\r\n pstmt.setInt(1, 101);\r\n pstmt.setString(2, "John Doe");\r\n pstmt.setString(3, "john@example.com");\r\n\r\n int rowsAffected = pstmt.executeUpdate();\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"batch-operations",children:"Batch Operations"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'String sql = "INSERT INTO users (id, name) VALUES (?, ?)";\r\n\r\ntry (Connection conn = DriverManager.getConnection(url);\r\n PreparedStatement pstmt = conn.prepareStatement(sql)) {\r\n\r\n conn.setAutoCommit(false);\r\n\r\n for (int i = 0; i < 1000; i++) {\r\n pstmt.setInt(1, i);\r\n pstmt.setString(2, "User " + i);\r\n pstmt.addBatch();\r\n }\r\n\r\n int[] results = pstmt.executeBatch();\r\n conn.commit();\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"transaction-control",children:"Transaction Control"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'try (Connection conn = DriverManager.getConnection(url)) {\r\n conn.setAutoCommit(false);\r\n\r\n try (Statement stmt = conn.createStatement()) {\r\n stmt.executeUpdate("INSERT INTO accounts (id, balance) VALUES (1, 1000)");\r\n stmt.executeUpdate("INSERT INTO accounts (id, balance) VALUES (2, 2000)");\r\n\r\n conn.commit();\r\n } catch (SQLException e) {\r\n conn.rollback();\r\n throw e;\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"query-timeout",children:"Query Timeout"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'try (Connection conn = DriverManager.getConnection(url);\r\n Statement stmt = conn.createStatement()) {\r\n\r\n stmt.setQueryTimeout(30); // 30 seconds\r\n\r\n try (ResultSet rs = stmt.executeQuery("SELECT * FROM large_table")) {\r\n // Process results\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"fetch-size-configuration",children:"Fetch Size Configuration"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'try (Connection conn = DriverManager.getConnection(url);\r\n Statement stmt = conn.createStatement()) {\r\n\r\n stmt.setFetchSize(2048); // Fetch 2048 rows per page (default: 1024)\r\n\r\n try (ResultSet rs = stmt.executeQuery("SELECT * FROM large_table")) {\r\n while (rs.next()) {\r\n // Process rows in pages of 2048\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"ignite-specific-behavior",children:"Ignite-Specific Behavior"}),"\n",(0,i.jsx)(n.h3,{id:"type-mapping",children:"Type Mapping"}),"\n",(0,i.jsx)(n.p,{children:"The driver maps SQL types to Java types according to JDBC specification:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"SQL Type"}),(0,i.jsx)(n.th,{children:"Java Type"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"BOOLEAN"}),(0,i.jsx)(n.td,{children:"boolean / Boolean"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"TINYINT"}),(0,i.jsx)(n.td,{children:"byte / Byte"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"SMALLINT"}),(0,i.jsx)(n.td,{children:"short / Short"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INTEGER"}),(0,i.jsx)(n.td,{children:"int / Integer"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"BIGINT"}),(0,i.jsx)(n.td,{children:"long / Long"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"FLOAT"}),(0,i.jsx)(n.td,{children:"float / Float"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"REAL"}),(0,i.jsx)(n.td,{children:"float / Float"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DOUBLE"}),(0,i.jsx)(n.td,{children:"double / Double"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DECIMAL"}),(0,i.jsx)(n.td,{children:"java.math.BigDecimal"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DATE"}),(0,i.jsx)(n.td,{children:"java.sql.Date"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"TIME"}),(0,i.jsx)(n.td,{children:"java.sql.Time"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"TIMESTAMP"}),(0,i.jsx)(n.td,{children:"java.sql.Timestamp"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"CHAR"}),(0,i.jsx)(n.td,{children:"String"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"VARCHAR"}),(0,i.jsx)(n.td,{children:"String"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"BINARY"}),(0,i.jsx)(n.td,{children:"byte[]"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"VARBINARY"}),(0,i.jsx)(n.td,{children:"byte[]"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"UUID"}),(0,i.jsx)(n.td,{children:"java.util.UUID"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"result-set-characteristics",children:"Result Set Characteristics"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Type"}),": ",(0,i.jsx)(n.code,{children:"TYPE_FORWARD_ONLY"})," (cursor moves forward only)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Concurrency"}),": ",(0,i.jsx)(n.code,{children:"CONCUR_READ_ONLY"})," (results cannot be updated)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Holdability"}),": Configurable via connection or statement"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"pagination",children:"Pagination"}),"\n",(0,i.jsx)(n.p,{children:"The driver fetches results in pages (default: 1024 rows per page). For large result sets, increase fetch size to reduce network round trips:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"stmt.setFetchSize(4096);\n"})}),"\n",(0,i.jsx)(n.h3,{id:"statement-cancellation",children:"Statement Cancellation"}),"\n",(0,i.jsx)(n.p,{children:"Cancel long-running queries from another thread:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"Statement stmt = conn.createStatement();\r\n\r\n// In another thread\r\nstmt.cancel();\n"})}),"\n",(0,i.jsx)(n.p,{children:"The driver uses correlation tokens to identify and cancel specific queries."}),"\n",(0,i.jsx)(n.h3,{id:"network-timeout",children:"Network Timeout"}),"\n",(0,i.jsx)(n.p,{children:"Set network-level timeout separately from query timeout:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"conn.setNetworkTimeout(executor, 5000); // 5 seconds\n"})}),"\n",(0,i.jsx)(n.p,{children:"Query timeout controls server-side execution time. Network timeout controls socket read/write operations."}),"\n",(0,i.jsx)(n.h2,{id:"connection-string-examples",children:"Connection String Examples"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"# Basic\r\njdbc:ignite:thin://localhost:10800\r\n\r\n# With schema\r\njdbc:ignite:thin://localhost:10800/analytics\r\n\r\n# With authentication\r\njdbc:ignite:thin://localhost:10800?username=admin&password=secret\r\n\r\n# With SSL\r\njdbc:ignite:thin://localhost:10800?sslEnabled=true&trustStorePath=/opt/certs/truststore.jks&trustStorePassword=changeit\r\n\r\n# Multiple nodes with timeouts\r\njdbc:ignite:thin://node1:10800,node2:10800,node3:10800?connectionTimeout=5000&queryTimeout=60\r\n\r\n# Complete configuration\r\njdbc:ignite:thin://node1:10800,node2:10800/mySchema?username=admin&password=secret&sslEnabled=true&trustStorePath=/opt/certs/truststore.jks&trustStorePassword=changeit&keyStorePath=/opt/certs/keystore.jks&keyStorePassword=changeit&connectionTimeout=5000&queryTimeout=60\n"})}),"\n",(0,i.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,i.jsx)(n.h3,{id:"driver-class",children:"Driver Class"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"org.apache.ignite.jdbc.IgniteJdbcDriver"})}),"\n",(0,i.jsx)(n.h3,{id:"jdbc-compliance",children:"JDBC Compliance"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"JDBC 4.x specification compliant"}),"\n",(0,i.jsxs)(n.li,{children:["Supports ",(0,i.jsx)(n.code,{children:"java.sql.Connection"}),", ",(0,i.jsx)(n.code,{children:"Statement"}),", ",(0,i.jsx)(n.code,{children:"PreparedStatement"}),", ",(0,i.jsx)(n.code,{children:"ResultSet"})]}),"\n",(0,i.jsxs)(n.li,{children:["Implements ",(0,i.jsx)(n.code,{children:"DatabaseMetaData"})," for schema discovery"]}),"\n",(0,i.jsxs)(n.li,{children:["Supports ",(0,i.jsx)(n.code,{children:"ResultSetMetaData"})," for column information"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Result sets are forward-only (no scrolling)"}),"\n",(0,i.jsx)(n.li,{children:"Result sets are read-only (no updates via ResultSet API)"}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CallableStatement"})," not supported (no stored procedures)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"lastRowid"})," always returns null (no auto-generated key tracking)"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>a});var r=t(96540);const i={},s=r.createContext(i);function c(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/01966bdf.ad726cca.js b/docs/ignite3/assets/js/01966bdf.ad726cca.js deleted file mode 100644 index 7779a502f8..0000000000 --- a/docs/ignite3/assets/js/01966bdf.ad726cca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8201],{28453:(e,r,i)=>{i.d(r,{R:()=>c,x:()=>d});var n=i(96540);const a={},s=n.createContext(a);function c(e){const r=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),n.createElement(s.Provider,{value:r},e.children)}},51502:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>c,metadata:()=>n,toc:()=>t});const n=JSON.parse('{"id":"configure-and-operate/index","title":"Configure and Operate","description":"Install, configure, and operate Apache Ignite 3 clusters in production environments.","source":"@site/docs/configure-and-operate/index.mdx","sourceDirName":"configure-and-operate","slug":"/configure-and-operate/","permalink":"/docs/ignite3/3.1.0/configure-and-operate/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Performance Tuning","permalink":"/docs/ignite3/3.1.0/sql/advanced/performance-tuning"},"next":{"title":"Installation","permalink":"/docs/ignite3/3.1.0/configure-and-operate/installation/"}}');var a=i(74848),s=i(28453);const c={},d="Configure and Operate",o={},t=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const r={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components},{IIcon:i}=r;return i||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.header,{children:(0,a.jsx)(r.h1,{id:"configure-and-operate",children:"Configure and Operate"})}),"\n",(0,a.jsx)(r.p,{children:"Install, configure, and operate Apache Ignite 3 clusters in production environments."}),"\n",(0,a.jsx)(r.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,a.jsxs)("div",{className:"card-container",children:[(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:zip-box-outline",height:"24"})," Install Using ZIP Archive"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Manual installation from binary distribution for Linux, macOS, and Windows."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/installation/install-zip",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"carbon:package",height:"24"})," Install Using DEB/RPM Packages"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Install through Linux package managers on Debian, Ubuntu, RHEL, and CentOS systems."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/installation/install-deb-rpm",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"simple-icons:docker",height:"24"})," Install Using Docker"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Containerized deployment with Docker images for development and production environments."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/installation/install-docker",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"simple-icons:kubernetes",height:"24"})," Install to Kubernetes"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Cloud-native deployment using Kubernetes operators and Helm charts."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/installation/install-kubernetes",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:cog-outline",height:"24"})," Configure Cluster and Nodes"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Essential cluster configuration including node settings, network parameters, and cluster initialization."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/configuration/config-cluster-and-nodes",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:database-cog-outline",height:"24"})," Configure Storage"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Storage profiles and engine configuration for AIPersist, RocksDB, and in-memory storage."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/configuration/config-storage-overview",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:shield-account-outline",height:"24"})," Set Up Authentication"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Security configuration with basic authentication and user credential management."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/configuration/config-authentication",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:certificate-outline",height:"24"})," Enable SSL/TLS"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Configure encrypted connections with SSL/TLS certificates for client and inter-node communication."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/configuration/config-ssl-tls",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:chart-line",height:"24"})," Configure Metrics"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Set up metrics collection and export for cluster monitoring and observability."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/configuration/metrics-configuration",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:server-outline",height:"24"})," Manage Cluster Lifecycle"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Start, stop, and manage nodes with cluster initialization and topology changes."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/operations/lifecycle",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:backup-restore",height:"24"})," Disaster Recovery (Partitions)"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Partition recovery procedures for data loss scenarios and cluster failures."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/operations/disaster-recovery-partitions",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:database-sync-outline",height:"24"})," Disaster Recovery (System Groups)"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"System group recovery for metadata and catalog restoration."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/operations/disaster-recovery-system-groups",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:map-marker-multiple-outline",height:"24"})," Monitor Performance"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Performance monitoring with colocation strategies and query optimization."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/operations/colocation",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:alert-circle-outline",height:"24"})," Handle Exceptions"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Error handling patterns and troubleshooting common cluster issues."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/operations/handle-exceptions",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:gauge",height:"24"})," Available Metrics"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Complete reference of metrics exposed for monitoring cluster health and performance."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/monitoring/available-metrics",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:table-eye",height:"24"})," Metrics System Views"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Query metrics through SQL views for programmatic access to cluster statistics."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/monitoring/metrics-system-views",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:file-document-edit-outline",height:"24"})," Node Configuration Parameters"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Complete reference of node-level configuration parameters and settings."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/reference/node-configuration",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:server-network",height:"24"})," Cluster Configuration Parameters"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Complete reference of cluster-level configuration parameters and defaults."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/reference/cluster-configuration",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:console",height:"24"})," CLI Configuration"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Command-line interface configuration and usage patterns."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/reference/cli-configuration",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(i,{icon:"mdi:harddisk",height:"24"})," Storage Profiles"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Storage engine configuration including engine selection and performance tuning."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./configure-and-operate/reference/storage-profiles",children:"Learn more \u2192"})})]})]}),"\n",(0,a.jsx)(r.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.a,{href:"getting-started",children:"Getting Started"})," - Quick start guides"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.a,{href:"understand",children:"Understand"})," - Architecture and concepts"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.a,{href:"tools",children:"Tools"})," - CLI and REST API reference"]}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/01a4d6cc.5fce4382.js b/docs/ignite3/assets/js/01a4d6cc.5fce4382.js deleted file mode 100644 index f5e2e7854c..0000000000 --- a/docs/ignite3/assets/js/01a4d6cc.5fce4382.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[505],{28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var r=t(96540);const s={},l=r.createContext(s);function i(e){const n=r.useContext(l);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(l.Provider,{value:n},e.children)}},30917:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"api-reference/native-clients/cpp/sql-api","title":"SQL API","description":"The SQL API executes SQL statements and scripts against Apache Ignite clusters. It supports parameterized queries, pagination, transaction integration, and query cancellation.","source":"@site/docs/api-reference/native-clients/cpp/sql-api.md","sourceDirName":"api-reference/native-clients/cpp","slug":"/api-reference/native-clients/cpp/sql-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"SQL API","id":"sql-api","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Tables API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api"},"next":{"title":"Transactions API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api"}}');var s=t(74848),l=t(28453);const i={title:"SQL API",id:"sql-api",sidebar_position:3},a="SQL API",c={},d=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Statement Execution",id:"statement-execution",level:3},{value:"Parameterized Queries",id:"parameterized-queries",level:3},{value:"Result Sets",id:"result-sets",level:3},{value:"Transaction Integration",id:"transaction-integration",level:3},{value:"Query Cancellation",id:"query-cancellation",level:3},{value:"Basic Execution",id:"basic-execution",level:2},{value:"Simple Query",id:"simple-query",level:3},{value:"Parameterized Query",id:"parameterized-query",level:3},{value:"DML Operations",id:"dml-operations",level:3},{value:"DDL Operations",id:"ddl-operations",level:3},{value:"SQL Statements",id:"sql-statements",level:2},{value:"Statement Configuration",id:"statement-configuration",level:3},{value:"Statement Properties",id:"statement-properties",level:3},{value:"Builder Pattern",id:"builder-pattern",level:3},{value:"Result Sets",id:"result-sets-1",level:2},{value:"Accessing Rows",id:"accessing-rows",level:3},{value:"Pagination",id:"pagination",level:3},{value:"Metadata",id:"metadata",level:3},{value:"Checking Result Type",id:"checking-result-type",level:3},{value:"Closing Result Sets",id:"closing-result-sets",level:3},{value:"Script Execution",id:"script-execution",level:2},{value:"Multi-Statement Scripts",id:"multi-statement-scripts",level:3},{value:"Transaction Integration",id:"transaction-integration-1",level:2},{value:"Explicit Transactions",id:"explicit-transactions",level:3},{value:"Implicit Transactions",id:"implicit-transactions",level:3},{value:"Query Cancellation",id:"query-cancellation-1",level:2},{value:"Creating Cancellation Tokens",id:"creating-cancellation-tokens",level:3},{value:"Cancelling Queries",id:"cancelling-queries",level:3},{value:"Asynchronous Execution",id:"asynchronous-execution",level:2},{value:"Data Type Mapping",id:"data-type-mapping",level:2},{value:"Error Handling",id:"error-handling",level:2},{value:"Reference",id:"reference",level:2}];function o(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"sql-api",children:"SQL API"})}),"\n",(0,s.jsx)(n.p,{children:"The SQL API executes SQL statements and scripts against Apache Ignite clusters. It supports parameterized queries, pagination, transaction integration, and query cancellation."}),"\n",(0,s.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,s.jsx)(n.h3,{id:"statement-execution",children:"Statement Execution"}),"\n",(0,s.jsx)(n.p,{children:"Single-statement queries return result sets. Multi-statement scripts execute multiple statements without returning results. Use statements for queries and DML operations. Use scripts for DDL operations and batch updates."}),"\n",(0,s.jsx)(n.h3,{id:"parameterized-queries",children:"Parameterized Queries"}),"\n",(0,s.jsxs)(n.p,{children:["Parameters prevent SQL injection and enable query plan reuse. Use question marks (",(0,s.jsx)(n.code,{children:"?"}),") as placeholders. Pass parameter values as a vector of ",(0,s.jsx)(n.code,{children:"primitive"})," values in execution order."]}),"\n",(0,s.jsx)(n.h3,{id:"result-sets",children:"Result Sets"}),"\n",(0,s.jsxs)(n.p,{children:["Query results return as ",(0,s.jsx)(n.code,{children:"result_set"})," objects containing rows and metadata. Result sets support pagination for large queries. Each page contains a batch of rows. Fetch additional pages explicitly."]}),"\n",(0,s.jsx)(n.h3,{id:"transaction-integration",children:"Transaction Integration"}),"\n",(0,s.jsxs)(n.p,{children:["Pass a transaction pointer to execute statements within explicit transactions. Pass ",(0,s.jsx)(n.code,{children:"nullptr"})," for implicit transactions that commit immediately."]}),"\n",(0,s.jsx)(n.h3,{id:"query-cancellation",children:"Query Cancellation"}),"\n",(0,s.jsxs)(n.p,{children:["Pass a ",(0,s.jsx)(n.code,{children:"cancellation_token"})," to cancel long-running queries. Create tokens before execution. Trigger cancellation from another thread when needed."]}),"\n",(0,s.jsx)(n.h2,{id:"basic-execution",children:"Basic Execution"}),"\n",(0,s.jsx)(n.h3,{id:"simple-query",children:"Simple Query"}),"\n",(0,s.jsx)(n.p,{children:"Execute a SELECT statement:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nauto sql = client.get_sql();\r\nauto result = sql.execute(nullptr, nullptr, sql_statement("SELECT * FROM accounts"), {});\r\n\r\nif (result.has_rowset()) {\r\n for (const auto& row : result.current_page()) {\r\n auto id = row.get("id");\r\n auto name = row.get("name");\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"parameterized-query",children:"Parameterized Query"}),"\n",(0,s.jsx)(n.p,{children:"Use parameters for safe value binding:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'sql_statement stmt("SELECT * FROM accounts WHERE balance > ? AND active = ?");\r\nstd::vector params{1000.0, true};\r\n\r\nauto result = sql.execute(nullptr, nullptr, stmt, params);\n'})}),"\n",(0,s.jsx)(n.h3,{id:"dml-operations",children:"DML Operations"}),"\n",(0,s.jsx)(n.p,{children:"Execute INSERT, UPDATE, DELETE:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'// Insert\r\nsql_statement insert("INSERT INTO accounts (id, name, balance) VALUES (?, ?, ?)");\r\nstd::vector values{42, std::string("John Doe"), 1000.0};\r\n\r\nauto result = sql.execute(nullptr, nullptr, insert, values);\r\nstd::cout << "Rows inserted: " << result.affected_rows() << std::endl;\r\n\r\n// Update\r\nsql_statement update("UPDATE accounts SET balance = ? WHERE id = ?");\r\nauto result2 = sql.execute(nullptr, nullptr, update, {1500.0, 42});\r\nstd::cout << "Rows updated: " << result2.affected_rows() << std::endl;\r\n\r\n// Delete\r\nsql_statement del("DELETE FROM accounts WHERE id = ?");\r\nauto result3 = sql.execute(nullptr, nullptr, del, {42});\r\nstd::cout << "Rows deleted: " << result3.affected_rows() << std::endl;\n'})}),"\n",(0,s.jsx)(n.h3,{id:"ddl-operations",children:"DDL Operations"}),"\n",(0,s.jsx)(n.p,{children:"Execute schema changes:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'sql_statement ddl("CREATE TABLE new_table (id INT PRIMARY KEY, data VARCHAR)");\r\nauto result = sql.execute(nullptr, nullptr, ddl, {});\r\n\r\n// Check if DDL was applied\r\nif (result.was_applied()) {\r\n std::cout << "Table created" << std::endl;\r\n}\n'})}),"\n",(0,s.jsx)(n.h2,{id:"sql-statements",children:"SQL Statements"}),"\n",(0,s.jsx)(n.h3,{id:"statement-configuration",children:"Statement Configuration"}),"\n",(0,s.jsx)(n.p,{children:"Configure statement properties:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'sql_statement stmt;\r\nstmt.query("SELECT * FROM large_table");\r\nstmt.schema("my_schema");\r\nstmt.page_size(100); // Rows per page\r\nstmt.timeout(std::chrono::seconds(30));\r\nstmt.timezone_id("America/New_York");\n'})}),"\n",(0,s.jsx)(n.h3,{id:"statement-properties",children:"Statement Properties"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"query()"})," - SQL text to execute (required)"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"schema()"}),' - Default schema name (default: "PUBLIC")']}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"page_size()"})," - Rows per result page (default: 1024)"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"timeout()"})," - Query timeout in milliseconds (default: 0 for no timeout)"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"timezone_id()"})," - Timezone for time functions"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"properties()"})," - Additional statement properties as key-value map"]}),"\n",(0,s.jsx)(n.h3,{id:"builder-pattern",children:"Builder Pattern"}),"\n",(0,s.jsx)(n.p,{children:"Chain configuration calls:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'sql_statement stmt;\r\nstmt.query("SELECT * FROM accounts")\r\n .schema("PUBLIC")\r\n .page_size(500)\r\n .timeout(std::chrono::seconds(10));\n'})}),"\n",(0,s.jsx)(n.h2,{id:"result-sets-1",children:"Result Sets"}),"\n",(0,s.jsx)(n.h3,{id:"accessing-rows",children:"Accessing Rows"}),"\n",(0,s.jsx)(n.p,{children:"Iterate current page:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto result = sql.execute(nullptr, nullptr, stmt, {});\r\n\r\nfor (const auto& row : result.current_page()) {\r\n // Access columns by name\r\n auto id = row.get("id");\r\n auto name = row.get("name");\r\n\r\n // Or by index\r\n auto id2 = row.get(0);\r\n auto name2 = row.get(1);\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"pagination",children:"Pagination"}),"\n",(0,s.jsx)(n.p,{children:"Handle large result sets:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto result = sql.execute(nullptr, nullptr, stmt, {});\r\n\r\n// Process first page\r\nfor (const auto& row : result.current_page()) {\r\n // Process row\r\n}\r\n\r\n// Fetch and process remaining pages\r\nwhile (result.has_more_pages()) {\r\n result.fetch_next_page();\r\n for (const auto& row : result.current_page()) {\r\n // Process row\r\n }\r\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"Use async pagination:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"void process_page(result_set& result) {\r\n for (const auto& row : result.current_page()) {\r\n // Process row\r\n }\r\n\r\n if (result.has_more_pages()) {\r\n result.fetch_next_page_async([&](ignite_result res) {\r\n if (!res.has_error()) {\r\n process_page(result);\r\n }\r\n });\r\n }\r\n}\r\n\r\nauto result = sql.execute(nullptr, nullptr, stmt, {});\r\nprocess_page(result);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"metadata",children:"Metadata"}),"\n",(0,s.jsx)(n.p,{children:"Access result metadata:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto result = sql.execute(nullptr, nullptr, stmt, {});\r\nconst auto& metadata = result.metadata();\r\n\r\nfor (const auto& column : metadata.columns()) {\r\n std::cout << "Column: " << column.name() << std::endl;\r\n std::cout << "Type: " << static_cast(column.type()) << std::endl;\r\n std::cout << "Nullable: " << column.nullable() << std::endl;\r\n\r\n if (column.precision() != -1) {\r\n std::cout << "Precision: " << column.precision() << std::endl;\r\n }\r\n if (column.scale() != -1) {\r\n std::cout << "Scale: " << column.scale() << std::endl;\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Find column index by name:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'int32_t col_index = metadata.index_of("balance");\n'})}),"\n",(0,s.jsx)(n.h3,{id:"checking-result-type",children:"Checking Result Type"}),"\n",(0,s.jsx)(n.p,{children:"Determine if result contains rows or is a DML result:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto result = sql.execute(nullptr, nullptr, stmt, {});\r\n\r\nif (result.has_rowset()) {\r\n // Query returned rows\r\n auto rows = result.current_page();\r\n} else {\r\n // DML or DDL operation\r\n std::cout << "Affected rows: " << result.affected_rows() << std::endl;\r\n}\r\n\r\n// Check if conditional DDL was applied\r\nif (result.was_applied()) {\r\n std::cout << "Statement applied successfully" << std::endl;\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"closing-result-sets",children:"Closing Result Sets"}),"\n",(0,s.jsx)(n.p,{children:"Close result sets explicitly to free resources:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto result = sql.execute(nullptr, nullptr, stmt, {});\r\n// Use result\r\nresult.close();\n"})}),"\n",(0,s.jsx)(n.p,{children:"Use async close:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"result.close_async([](ignite_result res) {\r\n if (!res.has_error()) {\r\n // Result closed\r\n }\r\n});\n"})}),"\n",(0,s.jsx)(n.h2,{id:"script-execution",children:"Script Execution"}),"\n",(0,s.jsx)(n.h3,{id:"multi-statement-scripts",children:"Multi-Statement Scripts"}),"\n",(0,s.jsx)(n.p,{children:"Execute multiple statements:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"sql_statement script(R\"(\r\n CREATE TABLE temp1 (id INT PRIMARY KEY, data VARCHAR);\r\n CREATE TABLE temp2 (id INT PRIMARY KEY, data VARCHAR);\r\n INSERT INTO temp1 VALUES (1, 'test');\r\n)\");\r\n\r\nsql.execute_script(nullptr, script, {});\n"})}),"\n",(0,s.jsx)(n.p,{children:"Use async execution:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'sql.execute_script_async(nullptr, script, {}, [](ignite_result result) {\r\n if (!result.has_error()) {\r\n std::cout << "Script executed successfully" << std::endl;\r\n }\r\n});\n'})}),"\n",(0,s.jsx)(n.p,{children:"Scripts do not return result sets. Use individual statements for queries. Scripts do not support transactions."}),"\n",(0,s.jsx)(n.h2,{id:"transaction-integration-1",children:"Transaction Integration"}),"\n",(0,s.jsx)(n.h3,{id:"explicit-transactions",children:"Explicit Transactions"}),"\n",(0,s.jsx)(n.p,{children:"Execute statements in a transaction:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto tx = client.get_transactions().begin();\r\n\r\ntry {\r\n sql_statement update1("UPDATE accounts SET balance = balance - ? WHERE id = ?");\r\n sql.execute(&tx, nullptr, update1, {100.0, 1});\r\n\r\n sql_statement update2("UPDATE accounts SET balance = balance + ? WHERE id = ?");\r\n sql.execute(&tx, nullptr, update2, {100.0, 2});\r\n\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n tx.rollback();\r\n throw;\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"implicit-transactions",children:"Implicit Transactions"}),"\n",(0,s.jsxs)(n.p,{children:["Pass ",(0,s.jsx)(n.code,{children:"nullptr"})," for auto-commit:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"// Each statement commits immediately\r\nsql.execute(nullptr, nullptr, stmt, params);\n"})}),"\n",(0,s.jsx)(n.h2,{id:"query-cancellation-1",children:"Query Cancellation"}),"\n",(0,s.jsx)(n.h3,{id:"creating-cancellation-tokens",children:"Creating Cancellation Tokens"}),"\n",(0,s.jsx)(n.p,{children:"Create a token before execution:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"cancel_handle handle;\r\ncancellation_token token(&handle);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"cancelling-queries",children:"Cancelling Queries"}),"\n",(0,s.jsx)(n.p,{children:"Cancel from another thread:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'// Thread 1: Execute long query\r\nauto result = sql.execute(nullptr, &token,\r\n sql_statement("SELECT * FROM huge_table"), {});\r\n\r\n// Thread 2: Cancel query\r\nhandle.cancel();\n'})}),"\n",(0,s.jsx)(n.p,{children:"Use with async execution:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"cancel_handle handle;\r\ncancellation_token token(&handle);\r\n\r\nsql.execute_async(nullptr, &token, stmt, {},\r\n [](ignite_result result) {\r\n if (result.has_error()) {\r\n // May be cancellation error\r\n } else {\r\n // Process result\r\n }\r\n });\r\n\r\n// Cancel if needed\r\nhandle.cancel();\n"})}),"\n",(0,s.jsx)(n.h2,{id:"asynchronous-execution",children:"Asynchronous Execution"}),"\n",(0,s.jsx)(n.p,{children:"Execute statements without blocking:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"sql.execute_async(nullptr, nullptr, stmt, params,\r\n [](ignite_result result) {\r\n if (!result.has_error()) {\r\n auto rs = std::move(result).value();\r\n for (const auto& row : rs.current_page()) {\r\n // Process row\r\n }\r\n }\r\n });\n"})}),"\n",(0,s.jsx)(n.p,{children:"Execute scripts asynchronously:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'sql.execute_script_async(nullptr, script, {},\r\n [](ignite_result result) {\r\n if (!result.has_error()) {\r\n std::cout << "Script completed" << std::endl;\r\n }\r\n });\n'})}),"\n",(0,s.jsx)(n.h2,{id:"data-type-mapping",children:"Data Type Mapping"}),"\n",(0,s.jsx)(n.p,{children:"C++ types map to SQL types:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"C++ Type"}),(0,s.jsx)(n.th,{children:"SQL Type"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"bool"})}),(0,s.jsx)(n.td,{children:"BOOLEAN"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"int8_t"})}),(0,s.jsx)(n.td,{children:"TINYINT"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"int16_t"})}),(0,s.jsx)(n.td,{children:"SMALLINT"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"int32_t"})}),(0,s.jsx)(n.td,{children:"INTEGER"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"int64_t"})}),(0,s.jsx)(n.td,{children:"BIGINT"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"float"})}),(0,s.jsx)(n.td,{children:"REAL"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"double"})}),(0,s.jsx)(n.td,{children:"DOUBLE"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"std::string"})}),(0,s.jsx)(n.td,{children:"VARCHAR"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"std::vector"})}),(0,s.jsx)(n.td,{children:"VARBINARY"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"uuid"})}),(0,s.jsx)(n.td,{children:"UUID"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ignite_date"})}),(0,s.jsx)(n.td,{children:"DATE"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ignite_time"})}),(0,s.jsx)(n.td,{children:"TIME"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ignite_timestamp"})}),(0,s.jsx)(n.td,{children:"TIMESTAMP"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ignite_date_time"})}),(0,s.jsx)(n.td,{children:"DATETIME"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"big_decimal"})}),(0,s.jsx)(n.td,{children:"DECIMAL"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"big_integer"})}),(0,s.jsx)(n.td,{children:"DECIMAL"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"error-handling",children:"Error Handling"}),"\n",(0,s.jsx)(n.p,{children:"Handle SQL errors:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'try {\r\n auto result = sql.execute(nullptr, nullptr, stmt, params);\r\n} catch (const ignite_error& e) {\r\n std::cerr << "SQL error: " << e.what_str() << std::endl;\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"With async operations:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'sql.execute_async(nullptr, nullptr, stmt, params,\r\n [](ignite_result result) {\r\n if (result.has_error()) {\r\n std::cerr << "Error: " << result.error().what_str() << std::endl;\r\n } else {\r\n // Process result\r\n }\r\n });\n'})}),"\n",(0,s.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/cppdoc/",children:"C++ API Documentation"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"../../../sql",children:"SQL Reference"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"./client-api",children:"Client API"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"./tables-api",children:"Tables API"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"./transactions-api",children:"Transactions API"})}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/04b7cdab.a8fc4450.js b/docs/ignite3/assets/js/04b7cdab.a8fc4450.js deleted file mode 100644 index d0964058cc..0000000000 --- a/docs/ignite3/assets/js/04b7cdab.a8fc4450.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8054],{6886:(e,i,t)=>{t.d(i,{A:()=>a});const a=t.p+"assets/images/partitioning-bc8aedcc432fc982355b2351866de7be.png"},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>o});var a=t(96540);const n={},r=a.createContext(n);function s(e){const i=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),a.createElement(r.Provider,{value:i},e.children)}},48347:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"administrators-guide/storage/data-partitions","title":"Data Partitioning","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/storage/data-partitions.md","sourceDirName":"administrators-guide/storage","slug":"/administrators-guide/storage/data-partitions","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Data Partitioning","sidebar_label":"Data Partitioning"},"sidebar":"tutorialSidebar","previous":{"title":"Volatile Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem"},"next":{"title":"Persistent Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent"}}');var n=t(74848),r=t(28453);const s={title:"Data Partitioning",sidebar_label:"Data Partitioning"},o=void 0,d={},l=[{value:"How Data is Partitioned",id:"how-data-is-partitioned",level:2},{value:"Partition Number",id:"partition-number",level:3},{value:"Replica Number",id:"replica-number",level:3},{value:"Primary Replicas and Leases",id:"primary-replicas-and-leases",level:2},{value:"Reading Data From Replicas",id:"reading-data-from-replicas",level:3},{value:"Version Storage",id:"version-storage",level:2},{value:"Distribution Reset",id:"distribution-reset",level:2},{value:"Partition Rebalance",id:"partition-rebalance",level:2}];function c(e){const i={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:["\n",(0,n.jsx)(i.p,{children:"Data partitioning is a method of subdividing large sets of data into smaller chunks and distributing them between all server nodes in a balanced manner."}),"\n",(0,n.jsx)(i.h2,{id:"how-data-is-partitioned",children:"How Data is Partitioned"}),"\n",(0,n.jsxs)(i.p,{children:["When the table is created, it is always assigned to a ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"distribution zone"}),". Based on the distribution zone parameters, the table is separated into ",(0,n.jsx)(i.code,{children:"PARTITIONS"})," parts, called ",(0,n.jsx)(i.strong,{children:"partitions"}),", stored ",(0,n.jsx)(i.code,{children:"REPLICAS"})," times across the cluster. Each partition is identified by a number from a limited set (0 to 24 for the default zone). Each individual copy of a partition is called a ",(0,n.jsx)(i.strong,{children:"replica"}),", and is stored on separate nodes, if possible. Partitions with the same number for all tables in the zone are always stored on the same node."]}),"\n",(0,n.jsxs)(i.p,{children:["Apache Ignite uses the ",(0,n.jsx)(i.strong,{children:"Fair"})," partition distribution algorithm. It means that it stores information on partition distribution and uses this information for assigning new partitions. This information is preserved in cluster metastorage, and is recalculated only when necessary."]}),"\n",(0,n.jsxs)(i.p,{children:["Once partitions and all replicas are created, they are distributed across the available cluster nodes that are included in the distribution zone following the ",(0,n.jsx)(i.code,{children:"DATA_NODES_FILTER"})," parameter and according to the ",(0,n.jsx)(i.strong,{children:"partition distribution algorithm"}),". Thus, each key is mapped to a list of nodes owning the corresponding partition and is stored on those nodes. When data is added, it is distributed evenly between partitions."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Apache Ignite Partitions",src:t(6886).A+"",width:"1019",height:"931"})}),"\n",(0,n.jsxs)(i.p,{children:["You can configure the way node stores relevant information in the ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config#system-configuration",children:"node configuration"}),":"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"ignite.system.partitionsBasePath"})," defines the folder partitions are stored in. By default, partitions are stored in the ",(0,n.jsx)(i.code,{children:"work/partitions"})," folder."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"ignite.system.partitionsLogPath"})," defines the folder where partition-specific RAFT logs are stored. These logs contain information on RAFT elections and consensus."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"ignite.system.metastoragePath"})," defines the folder where cluster metadata is stored. It is recommended to store metadata on a separate device from partitions."]}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:"partition-number",children:"Partition Number"}),"\n",(0,n.jsxs)(i.p,{children:["When creating a distribution zone, you have an option to manually set the number of partitions with the ",(0,n.jsx)(i.code,{children:"PARTITIONS"})," parameter, for example:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (PARTITIONS 10) STORAGE PROFILES ['default'];\n"})}),"\n",(0,n.jsx)(i.p,{children:"As partitions will be spread across the cluster, we recommend to set the number of partitions depending on its size and the number of available cores."}),"\n",(0,n.jsx)(i.p,{children:"In most cases, we recommend using 2, 3 or 4 times the number of total available cores, divided by the number of replicas as the number of partitions. For example:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"For a cluster with 3 nodes, 8 cores on each node, and 3 data replicas, we recommend using 16, 24 or 32 partitions;"}),"\n",(0,n.jsx)(i.li,{children:"For a cluster with 7 nodes, 16 cores on each node, and 3 data replicas, we recommend using 75, 112 or 150 partitions."}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"It is not recommended to set a significantly larger number of partitions or replicas, as maintaining partitions and their distribution can cause a performance drain on the cluster."}),"\n",(0,n.jsx)(i.p,{children:"Otherwise, Apache Ignite will automatically calculate the recommended number of partitions:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"dataNodesCount * coresOnNode * 2 / replicas\n"})}),"\n",(0,n.jsxs)(i.p,{children:["In this case, the ",(0,n.jsx)(i.code,{children:"dataNodesCount"})," is the estimated number of nodes that will be in the distribution zone when it is created, according to its filter (see the NODES FILTER parameter in ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"Distribution Zones"}),") and ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/storage/",children:"storage profiles"}),". At least 1 partition is always created."]}),"\n",(0,n.jsx)(i.h3,{id:"replica-number",children:"Replica Number"}),"\n",(0,n.jsxs)(i.p,{children:["When creating a distribution zone, you can configure the number of ",(0,n.jsx)(i.strong,{children:"replicas"})," - individual copies of data on the cluster - by setting the ",(0,n.jsx)(i.code,{children:"REPLICAS"})," parameter. By default, no additional replicas of data are created. As more replicas are added, additional copies of data will be stored on the cluster, and automatically spread to ensure data availability in case of a node leaving the cluster."]}),"\n",(0,n.jsxs)(i.p,{children:["Replicas of each partition form a RAFT group, and a quorum in that group is required to perform updates to the partition. The default quorum size depends on the number of replicas in the distribution zone - 3 replicas are required for quorum if the distribution zone has 5 or more replicas, 2 if there are between 2 and 4 replicas, or 1 if only one data replica exists. See the QUORUM SIZE parameter in ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"Distribution Zones"})," for details."]}),"\n",(0,n.jsxs)(i.p,{children:["Some replicas will be selected as part of a consensus group. These nodes will be voting members, confirming all data changes in the replication group, while other replicas will be ",(0,n.jsx)(i.strong,{children:"learners"}),", only passively receiving data from the group leader and not participating in elections."]}),"\n",(0,n.jsxs)(i.p,{children:["Losing the majority of the consensus group leads the partition to enter the ",(0,n.jsx)(i.code,{children:"Read-only"})," state. In this state, no data can be written and only explicit read-only transactions can be used to retrieve data. If the distribution zone scales up or down (typically, due to a node entering or leaving the cluster), new replicas will be selected as the consensus group. See the AUTO SCALE UP and AUTO SCALE DOWN parameters in ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"Distribution Zones"})," for details."]}),"\n",(0,n.jsx)(i.p,{children:"The size of the consensus group is automatically calculated based on quorum size:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"quorumSize * 2 - 1\n"})}),"\n",(0,n.jsx)(i.p,{children:"For example, with 5 replicas and quorum size of 2, 3 replicas will be part of consensus group, and 2 replicas will be learners. In this scenario, losing 2 nodes will lead to some partitions losing the majority of the consensus group and becoming unavailable. For this reason, it is recommended to hava a quorum size of 3 for a 5-node cluster."}),"\n",(0,n.jsx)(i.p,{children:"It is recommended to always have an odd number of replicas and at least 3 replicas of your data on the cluster. When only 2 data replicas exist, losing one will always lead to losing majority, while having 3 or 5 data replicas will allow the cluster to stay functional in network segmentation scenarios."}),"\n",(0,n.jsxs)(i.p,{children:["You can also store data replicas on every node in cluster by creating a zone with ",(0,n.jsx)(i.code,{children:"REPLICAS ALL"})," parameter to ensure data is always available to the cluster."]}),"\n",(0,n.jsx)(i.h2,{id:"primary-replicas-and-leases",children:"Primary Replicas and Leases"}),"\n",(0,n.jsxs)(i.p,{children:["Once the partitions are distributed on the nodes, Apache Ignite forms ",(0,n.jsx)(i.strong,{children:"replication groups"})," for all partitions of the table, and each group elects its leader. To linearize writes to partitions, Apache Ignite designates one replica of each partition as a ",(0,n.jsx)(i.strong,{children:"primary replica"}),", and other replicas as ."]}),"\n",(0,n.jsxs)(i.p,{children:["To designate a primary replica, Apache Ignite uses a process of granting a ",(0,n.jsx)(i.strong,{children:"lease"}),". Leases are granted by the ",(0,n.jsx)(i.strong,{children:"lease placement driver"}),", and signify the node that houses the primary replica, called a ",(0,n.jsx)(i.strong,{children:"lease holder"}),". Once the lease is granted, information about it is written to the ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/lifecycle#cluster-metastorage-group",children:"metastorage"}),", and provided to all nodes in the cluster. Usually, the primary replica will be the same as replication group leader."]}),"\n",(0,n.jsx)(i.p,{children:"Granted leases are valid for a short period of time and are extended every couple of seconds, preserving the continuity of each lease. A lease cannot be revoked until it expires. In exceptional situations (for example, when the primary replica is unable to serve as primary anymore, the leaseholder node goes offline, the replication group is inoperable, etc.) the placement driver waits for the lease to expire and then initiates the negotiation of the new one."}),"\n",(0,n.jsx)(i.p,{children:"Only the primary replica can handle operations of read-write transactions. Other replicas of the partition can be read from by using read-only transactions."}),"\n",(0,n.jsxs)(i.p,{children:["If a new replica is chosen to receive the lease, it first makes sure it is up-to-date with its replication group based on the stored data. In scenarios where replication group is no longer operable (for example, a node unexpectedly leaves the cluster and the group loses majority), it follows the ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery",children:"disaster recovery"})," procedure, and you may need to reset the partitions manually."]}),"\n",(0,n.jsx)(i.h3,{id:"reading-data-from-replicas",children:"Reading Data From Replicas"}),"\n",(0,n.jsxs)(i.p,{children:["Reading data as part of a read-write ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/developers-guide/transactions",children:"transaction"})," is always handled by the primary data replica."]}),"\n",(0,n.jsx)(i.p,{children:"Read-only transactions can be handled by either backup or primary replicas, depending on the specifics of the transaction."}),"\n",(0,n.jsx)(i.h2,{id:"version-storage",children:"Version Storage"}),"\n",(0,n.jsxs)(i.p,{children:["As new data is written to the partition, Apache Ignite does not immediately delete old one. Instead, Apache Ignite stores old keys in a ",(0,n.jsx)(i.strong,{children:"version chain"})," within the same partition."]}),"\n",(0,n.jsxs)(i.p,{children:["Older key versions can only be accessed by ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/developers-guide/transactions#read-only-transactions",children:"read-only transactions"}),", while up-to-date version can be accessed by any transactions."]}),"\n",(0,n.jsxs)(i.p,{children:["Older key versions are kept until the ",(0,n.jsx)(i.strong,{children:"low watermark"})," point is reached. By default, low watermark is 600000 ms, and it can be changed in ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config#garbage-collection-configuration",children:"cluster configuration"}),". Increasing data availability time will mean that old key versions are stored and available for longer, however storing them may require extra storage, depending on cluster load."]}),"\n",(0,n.jsxs)(i.p,{children:["In a similar manner, ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#drop-table",children:"dropped tables"})," are also not removed from disk until the low watermark point, however you can no longer write to these tables. Read-only transactions that try to get data from these tables will succeed if they read data at timestamp before the table was dropped, and will delay the low watermark point if it is necessary to complete the transaction."]}),"\n",(0,n.jsx)(i.p,{children:"Once the low watermark is reached, old versions of data are considered garbage and will be cleaned up by garbage collector during the next cleanup. This data may or may not be available, as garbage collection is not an immediate process. If a transaction was already started before the low watermark was reached, the required data will be kept available until the end of transaction even if the garbage collection happens. Additionally, Apache Ignite checks that old data is not required anywhere on the cluster before cleaning up the data."}),"\n",(0,n.jsx)(i.h2,{id:"distribution-reset",children:"Distribution Reset"}),"\n",(0,n.jsxs)(i.p,{children:["The SQL query performance can deteriorate in a cluster where tables had been created over a long period, alongside topology changes, due to sub-optimum data colocation. To resolve this issue, you can reset (recalculate) partition distribution using ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool#distribution-commands",children:"CLI"})," or ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/developers-guide/rest/rest-api",children:"REST API"}),"."]}),"\n",(0,n.jsx)(i.admonition,{type:"note",children:(0,n.jsxs)(i.p,{children:["Reset is likely to result in ",(0,n.jsx)(i.a,{href:"#partition-rebalance",children:"Partition Rebalance"}),", which may take a long time."]})}),"\n",(0,n.jsx)(i.h2,{id:"partition-rebalance",children:"Partition Rebalance"}),"\n",(0,n.jsxs)(i.p,{children:["When the cluster size changes, Apache Ignite waits for the timeout specified in the ",(0,n.jsx)(i.code,{children:"AUTO SCALE UP"})," or ",(0,n.jsx)(i.code,{children:"AUTO SCALE DOWN"})," ",(0,n.jsx)(i.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"distribution zone properties"}),", and then redistributes partitions according to partition distribution algorithm and transfers data to make it up-to-date with the replication group. This process is called ",(0,n.jsx)(i.strong,{children:"data rebalance"}),"."]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/071c34d4.1660ba59.js b/docs/ignite3/assets/js/071c34d4.1660ba59.js deleted file mode 100644 index 7b7c18ea40..0000000000 --- a/docs/ignite3/assets/js/071c34d4.1660ba59.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2445],{11470:(e,n,t)=>{t.d(n,{A:()=>k});var r=t(96540),i=t(34164),s=t(17559),l=t(23104),a=t(56347),c=t(205),o=t(57485),d=t(31682),u=t(70679);function h(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const t=(0,a.W6)(),i=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,o.aZ)(i),(0,r.useCallback)(e=>{if(!i)return;const n=new URLSearchParams(t.location.search);n.set(i,e),t.replace({...t.location,search:n.toString()})},[i,t])]}function b(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,s=p(e),[l,a]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s})),[o,d]=x({queryString:t,groupId:i}),[h,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,i]=(0,u.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&i.set(e)},[n,i])]}({groupId:i}),j=(()=>{const e=o??h;return g({value:e,tabValues:s})?e:null})();(0,c.A)(()=>{j&&a(j)},[j]);return{selectedValue:l,selectValue:(0,r.useCallback)(e=>{if(!g({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);a(e),d(e),b(e)},[d,b,s]),tabValues:s}}var j=t(92303);const m={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(74848);function f({className:e,block:n,selectedValue:t,selectValue:r,tabValues:s}){const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.a_)(),o=e=>{const n=e.currentTarget,i=a.indexOf(n),l=s[i].value;l!==t&&(c(n),r(l))},d=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{a.push(e)},onKeyDown:d,onClick:o,...r,className:(0,i.A)("tabs__item",m.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:t}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function _(e){const n=b(e);return(0,v.jsxs)("div",{className:(0,i.A)(s.G.tabs.container,"tabs-container",m.tabList),children:[(0,v.jsx)(f,{...n,...e}),(0,v.jsx)(y,{...n,...e})]})}function k(e){const n=(0,j.A)();return(0,v.jsx)(_,{...e,children:h(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>l});t(96540);var r=t(34164);const i={tabItem:"tabItem_Ymn6"};var s=t(74848);function l({children:e,hidden:n,className:t}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>a});var r=t(96540);const i={},s=r.createContext(i);function l(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(s.Provider,{value:n},e.children)}},94515:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>c,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"develop/ignite-clients/cpp-client","title":"C++ Client","description":"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there is no separate Thin and Thick clients in Ignite 3. All clients are \'thin\'.","source":"@site/docs/develop/ignite-clients/cpp.md","sourceDirName":"develop/ignite-clients","slug":"/develop/ignite-clients/cpp-client","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"id":"cpp-client","title":"C++ Client","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":".NET Client","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client"},"next":{"title":"Connect to Ignite","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/"}}');var i=t(74848),s=t(28453),l=t(11470),a=t(19365);const c={id:"cpp-client",title:"C++ Client",sidebar_position:3},o=void 0,d={},u=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Installation",id:"build-ref",level:3},{value:"Building C++ Client on CentOS 7 and RHEL 7",id:"building-c-client-on-centos-7-and-rhel-7",level:3},{value:"Client Connector Configuration",id:"client-connector-configuration",level:2},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Authentication",id:"authentication",level:2},{value:"User Object Serialization",id:"user-object-serialization",level:2},{value:"Limitations",id:"limitations",level:3},{value:"Usage Examples",id:"usage-examples",level:3},{value:"SQL API",id:"sql-api",level:2},{value:"SQL Scripts",id:"sql-scripts",level:3},{value:"Transactions",id:"transactions",level:2},{value:"Table API",id:"table-api",level:2},{value:"Getting a Table Instance",id:"getting-a-table-instance",level:3},{value:"Basic Table Operations",id:"basic-table-operations",level:3},{value:"Binary Record View",id:"binary-record-view",level:4},{value:"Record View",id:"record-view",level:4},{value:"Key-Value Binary View",id:"key-value-binary-view",level:4},{value:"Key-Value View",id:"key-value-view",level:4}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there is no separate Thin and Thick clients in Ignite 3. All clients are 'thin'."}),"\n",(0,i.jsx)(n.p,{children:"Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations."}),"\n",(0,i.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,i.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.p,{children:["To run C++ client, you need a C++ build environment to run the ",(0,i.jsx)(n.code,{children:"cmake"})," command:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"C++ compiler supporting C++ 17"}),"\n",(0,i.jsx)(n.li,{children:"CMake 3.10+"}),"\n",(0,i.jsx)(n.li,{children:"One of build systems: make, ninja, MS Visual Studio, or other"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"build-ref",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"The source code of the C++ client comes with the Ignite 3 distribution. To build it, use the following commands:"}),"\n",(0,i.jsxs)(l.A,{groupId:"os",children:[(0,i.jsx)(a.A,{value:"windows",label:"Windows",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bat",children:"mkdir cmake-build-release\r\ncd cmake-build-release\r\ncmake ..\r\ncmake --build . -j8\n"})})}),(0,i.jsx)(a.A,{value:"linux",label:"Linux",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkdir cmake-build-release\r\ncd cmake-build-release\r\ncmake .. -DCMAKE_BUILD_TYPE=Release\r\ncmake --build . -j8\n"})})}),(0,i.jsx)(a.A,{value:"macos",label:"MacOS",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkdir cmake-build-release\r\ncd cmake-build-release\r\ncmake .. -DCMAKE_BUILD_TYPE=Release\r\ncmake --build . -j8\n"})})})]}),"\n",(0,i.jsx)(n.h3,{id:"building-c-client-on-centos-7-and-rhel-7",children:"Building C++ Client on CentOS 7 and RHEL 7"}),"\n",(0,i.jsx)(n.p,{children:"If you are running on older systems, you need to set up the environment in the following way:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.code,{children:"epel-release"})," and ",(0,i.jsx)(n.code,{children:"centos-release-scl"}),":"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"yum install epel-release centos-release-scl\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Update yum and accept ",(0,i.jsx)(n.code,{children:"epel-release"})," keys:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"yum update\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsxs)(n.li,{children:["Install the build tools from the main repository and ",(0,i.jsx)(n.code,{children:"devtoolset-11"}),":"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"yum install devtoolset-11-gcc devtoolset-11-gcc-c++ cmake3 git java-11-openjdk-devel gtest-devel gmock-devel\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsxs)(n.li,{children:["Create and update alternatives for ",(0,i.jsx)(n.code,{children:"cmake"})," to force the use of ",(0,i.jsx)(n.code,{children:"cmake3"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Create an alternative for ",(0,i.jsx)(n.code,{children:"cmake2"})," with priority 10:"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake 10 \\\r\n--slave /usr/local/bin/ctest ctest /usr/bin/ctest \\\r\n--slave /usr/local/bin/cpack cpack /usr/bin/cpack \\\r\n--slave /usr/local/bin/ccmake ccmake /usr/bin/ccmake \\\r\n--family cmake\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Create an alternative for ",(0,i.jsx)(n.code,{children:"cmake3"})," with priority 20:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake3 20 \\\r\n--slave /usr/local/bin/ctest ctest /usr/bin/ctest3 \\\r\n--slave /usr/local/bin/cpack cpack /usr/bin/cpack3 \\\r\n--slave /usr/local/bin/ccmake ccmake /usr/bin/ccmake3 \\\r\n--family cmake\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Check that the default alternative points to ",(0,i.jsx)(n.code,{children:"cmake3"}),":"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo alternatives --config cmake\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsxs)(n.li,{children:["Enable the ",(0,i.jsx)(n.code,{children:"devtoolset-11"})," compiler and start bash with the updated PATH:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"scl enable devtoolset-11 bash\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"6",children:["\n",(0,i.jsxs)(n.li,{children:["Start the ",(0,i.jsx)(n.a,{href:"#build-ref",children:"build"})," in the shell you have established."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"client-connector-configuration",children:"Client Connector Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["Client connection parameters are controlled by the client connector configuration. By default, Ignite accepts client connections on port 10800. You can change the configuration for the node by using the ",(0,i.jsx)(n.a,{href:"/3.1.0/tools/cli-commands",children:"CLI tool"})," at any time."]}),"\n",(0,i.jsx)(n.p,{children:"Here is how the client connector configuration looks like in the JSON format."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'"ignite" : {\r\n "clientConnector" : {\r\n "port" : 10800,\r\n "idleTimeoutMillis" :3000,\r\n "sendServerExceptionStackTraceToClient" : true,\r\n "ssl" : {\r\n "enabled" : true,\r\n "clientAuth" : "require",\r\n "keyStore" : {\r\n "path" : "KEYSTORE_PATH",\r\n "password" : "SSL_STORE_PASS"\r\n },\r\n "trustStore" : {\r\n "path" : "TRUSTSTORE_PATH",\r\n "password" : "SSL_STORE_PASS"\r\n },\r\n },\r\n },\r\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"The table below covers the configuration for client connector:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Property"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"connectTimeoutMillis"}),(0,i.jsx)(n.td,{children:"5000"}),(0,i.jsx)(n.td,{children:"Connection attempt timeout, in milliseconds."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"idleTimeoutMillis"}),(0,i.jsx)(n.td,{children:"0"}),(0,i.jsx)(n.td,{children:"How long the client can be idle before the connection is dropped, in milliseconds. By default, there is no limit."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"metricsEnabled"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"false"})}),(0,i.jsx)(n.td,{children:"Defines if client metrics are collected."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"port"}),(0,i.jsx)(n.td,{children:"10800"}),(0,i.jsx)(n.td,{children:"The port the client connector will be listening to."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"sendServerExceptionStackTraceToClient"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"false"})}),(0,i.jsx)(n.td,{children:"Defines if cluster exceptions are sent to the client."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ssl.ciphers"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"The cipher used for SSL communication."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ssl.clientAuth"}),(0,i.jsx)(n.td,{}),(0,i.jsxs)(n.td,{children:["Type of client authentication used by clients. For more information, see ",(0,i.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-ssl-tls",children:"SSL/TLS"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ssl.enabled"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Defines if SSL is enabled."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ssl.keyStore.password"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"SSL keystore password."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ssl.keyStore.path"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Path to the SSL keystore."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ssl.keyStore.type"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"PKCS12"})}),(0,i.jsx)(n.td,{children:"The type of SSL keystore used."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ssl.trustStore.password"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"SSL keystore password."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ssl.trustStore.path"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Path to the SSL keystore."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ssl.trustStore.type"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"PKCS12"})}),(0,i.jsx)(n.td,{children:"The type of SSL keystore used."})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"Here is how you can change the parameters:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node config update clientConnector.port=10469\n"})}),"\n",(0,i.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,i.jsxs)(n.p,{children:["To initialize a client, use the ",(0,i.jsx)(n.code,{children:"IgniteClient"})," class, and provide it with the configuration:"]}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nignite_client_configuration cfg{"127.0.0.1"};\r\nauto client = ignite_client::start(cfg, std::chrono::seconds(5));\n'})})})}),"\n",(0,i.jsx)(n.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsxs)(n.p,{children:["To pass authentication information, pass it to ",(0,i.jsx)(n.code,{children:"IgniteClient"})," builder:"]}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'auto authenticator = std::make_shared("myUser", "myPassword");\r\n\r\nignite::ignite_client_configuration cfg{"127.0.0.1:10800"};\r\ncfg.set_authenticator(authenticator);\r\nauto client = ignite_client::start(std::move(cfg), std::chrono::seconds(30));\n'})})})}),"\n",(0,i.jsx)(n.h2,{id:"user-object-serialization",children:"User Object Serialization"}),"\n",(0,i.jsx)(n.p,{children:"Ignite supports mapping user objects to table tuples. This ensures that objects created in any programming language can be used for key-value operations directly."}),"\n",(0,i.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,i.jsx)(n.p,{children:"There are limitations to user types that can be used for such a mapping. Some limitations are common, and others are platform-specific due to the programming language used."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Only flat field structure is supported, meaning no nesting user objects. This is because Ignite tables, and therefore tuples have flat structure themselves."}),"\n",(0,i.jsx)(n.li,{children:"Fields should be mapped to Ignite types."}),"\n",(0,i.jsx)(n.li,{children:"All fields in user type should either be mapped to Table column or explicitly excluded."}),"\n",(0,i.jsx)(n.li,{children:"All columns from Table should be mapped to some field in the user type."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"C++ only"}),": User has to provide marshalling functions explicitly as there is no reflection to generate them based on user type structure."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'struct account {\r\n account() = default;\r\n account(std::int64_t id) : id(id) {}\r\n account(std::int64_t id, std::int64_t balance) : id(id), balance(balance) {}\r\n\r\n std::int64_t id{0};\r\n std::int64_t balance{0};\r\n};\r\n\r\nnamespace ignite {\r\n\r\n template<>\r\n ignite_tuple convert_to_tuple(account &&value) {\r\n ignite_tuple tuple;\r\n\r\n tuple.set("id", value.id);\r\n tuple.set("balance", value.balance);\r\n\r\n return tuple;\r\n }\r\n\r\n template<>\r\n account convert_from_tuple(ignite_tuple&& value) {\r\n account res;\r\n\r\n res.id = value.get("id");\r\n\r\n // Sometimes only key columns are returned, i.e. "id",\r\n // so we have to check whether there are any other columns.\r\n if (value.column_count() > 1)\r\n res.balance = value.get("balance");\r\n\r\n return res;\r\n }\r\n\r\n} // namespace ignite\n'})})})}),"\n",(0,i.jsx)(n.h2,{id:"sql-api",children:"SQL API"}),"\n",(0,i.jsxs)(n.p,{children:["Ignite 3 is focused on SQL, and SQL API is the primary way to work with the data. You can read more about supported SQL statements in the ",(0,i.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/ddl",children:"SQL Reference"})," section. Here is how you can send SQL requests:"]}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'result_set result = client.get_sql().execute(nullptr, {"select name from tbl where id = ?"}, {std::int64_t{42}});\r\nstd::vector page = result_set.current_page();\r\nignite_tuple& row = page.front();\n'})})})}),"\n",(0,i.jsx)(n.h3,{id:"sql-scripts",children:"SQL Scripts"}),"\n",(0,i.jsxs)(n.p,{children:["The default API executes SQL statements one at a time. If you want to execute large SQL statements, pass them to the ",(0,i.jsx)(n.code,{children:"executeScript()"})," method. These statements will be executed in order."]}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'std::string script = ""\r\n\t+ "CREATE TABLE IF NOT EXISTS Person (id int primary key, city_id int, name varchar, age int, company varchar);"\r\n\t+ "INSERT INTO Person (1,3, \'John\', 43, \'Sample\')";\r\n\r\nclient.get_sql().execute_script(script);\n'})})})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Execution of each statement is considered complete when the first page is ready to be returned. As a result, when working with large data sets, SELECT statement may be affected by later statements in the same script."})}),"\n",(0,i.jsx)(n.h2,{id:"transactions",children:"Transactions"}),"\n",(0,i.jsx)(n.p,{children:"All table operations in Ignite 3 are transactional. You can provide an explicit transaction as a first argument of any Table and SQL API call. If you do not provide an explicit transaction, an implicit one will be created for every call."}),"\n",(0,i.jsx)(n.p,{children:"Here is how you can provide a transaction explicitly:"}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:"auto accounts = table.get_key_value_view();\r\n\r\naccount init_value(42, 16'000);\r\naccounts.put(nullptr, {42}, init_value);\r\n\r\nauto tx = client.get_transactions().begin();\r\n\r\nstd::optional res_account = accounts.get(&tx, {42});\r\nres_account->balance += 500;\r\naccounts.put(&tx, {42}, res_account);\r\n\r\nassert(accounts.get(&tx, {42})->balance == 16'500);\r\n\r\ntx.rollback();\r\n\r\nassert(accounts.get(&tx, {42})->balance == 16'000);\n"})})})}),"\n",(0,i.jsx)(n.h2,{id:"table-api",children:"Table API"}),"\n",(0,i.jsx)(n.p,{children:"To execute table operations on a specific table, you need to get a specific view of the table and use one of its methods. You can only create new tables by using SQL API."}),"\n",(0,i.jsx)(n.p,{children:"When working with tables, you can use built-in Tuple type, which is a set of key-value pairs underneath, or map the data to your own types for a strongly-typed access. Here is how you can work with tables:"}),"\n",(0,i.jsx)(n.h3,{id:"getting-a-table-instance",children:"Getting a Table Instance"}),"\n",(0,i.jsxs)(n.p,{children:["First, get an instance of the table. To obtain an instance of table, use the ",(0,i.jsx)(n.code,{children:"IgniteTables.table(String)"})," method. You can also use ",(0,i.jsx)(n.code,{children:"IgniteTables.tables()"})," method to list all existing tables."]}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nauto table_api = client.get_tables();\r\nstd::vector existing_tables = table_api.get_tables();\r\ntable first_table = existing_tables.front();\r\n\r\nstd::optional
                                                              my_table = table_api.get_table("MY_TABLE");\n'})})})}),"\n",(0,i.jsx)(n.h3,{id:"basic-table-operations",children:"Basic Table Operations"}),"\n",(0,i.jsx)(n.p,{children:"Once you've got a table you need to get a specific view to choose how you want to operate table records."}),"\n",(0,i.jsx)(n.h4,{id:"binary-record-view",children:"Binary Record View"}),"\n",(0,i.jsx)(n.p,{children:"A binary record view. It can be used to operate table tuples directly."}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'record_view view = table.get_record_binary_view();\r\n\r\nignite_tuple record{\r\n {"id", 42},\r\n {"name", "John Doe"}\r\n};\r\n\r\nview.upsert(nullptr, record);\r\nstd::optional res_record = view.get(nullptr, {"id", 42});\r\n\r\nassert(res_record.has_value());\r\nassert(res_record->column_count() == 2);\r\nassert(res_record->get("id") == 42);\r\nassert(res_record->get("name") == "John Doe");\n'})})})}),"\n",(0,i.jsx)(n.h4,{id:"record-view",children:"Record View"}),"\n",(0,i.jsx)(n.p,{children:"A record view mapped to a user type. It can be used to operate table using user objects which are mapped to table tuples."}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'record_view view = table.get_record_view();\r\n\r\nperson record(42, "John Doe");\r\n\r\nview.upsert(nullptr, record);\r\nstd::optional res_record = view.get(nullptr, person{42});\r\n\r\nassert(res.has_value());\r\nassert(res->id == 42);\r\nassert(res->name == "John Doe");\n'})})})}),"\n",(0,i.jsx)(n.h4,{id:"key-value-binary-view",children:"Key-Value Binary View"}),"\n",(0,i.jsx)(n.p,{children:"A binary key-value view. It can be used to operate table using key and value tuples separately."}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'key_value_view kv_view = table.get_key_value_binary_view();\r\n\r\nignite_tuple key_tuple{{"id", 42}};\r\nignite_tuple val_tuple{{"name", "John Doe"}};\r\n\r\nkv_view.put(nullptr, key_tuple, val_tuple);\r\nstd::optional res_tuple = kv_view.get(nullptr, key_tuple);\r\n\r\nassert(res_tuple.has_value());\r\nassert(res_tuple->column_count() == 2);\r\nassert(res_tuple->get("id") == 42);\r\nassert(res_tuple->get("name") == "John Doe");\n'})})})}),"\n",(0,i.jsx)(n.h4,{id:"key-value-view",children:"Key-Value View"}),"\n",(0,i.jsx)(n.p,{children:"A key-value view with user objects. It can be used to operate table using key and value user objects mapped to table tuples."}),"\n",(0,i.jsx)(l.A,{groupId:"languages",children:(0,i.jsx)(a.A,{value:"cpp",label:"C++",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-cpp",children:'key_value_view kv_view = table.get_key_value_view();\r\n\r\nkv_view.put(nullptr, {42}, {"John Doe"});\r\nstd::optional res = kv_view.get(nullptr, {42});\r\n\r\nassert(res.has_value());\r\nassert(res->id == 42);\r\nassert(res->name == "John Doe");\n'})})})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/0b3cdf12.493963ba.js b/docs/ignite3/assets/js/0b3cdf12.493963ba.js deleted file mode 100644 index 17b3b0cd6f..0000000000 --- a/docs/ignite3/assets/js/0b3cdf12.493963ba.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6064],{28453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>t});var r=i(96540);const s={},a=r.createContext(s);function c(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(a.Provider,{value:n},e.children)}},54119:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>t,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"api-reference/index","title":"API Reference","description":"API documentation for all supported languages and drivers.","source":"@site/docs/api-reference/index.mdx","sourceDirName":"api-reference","slug":"/api-reference/","permalink":"/docs/ignite3/3.1.0/api-reference/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"EXPLAIN Operators Reference","permalink":"/docs/ignite3/3.1.0/understand/performance/explain-operators"},"next":{"title":"Native Client APIs","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/"}}');var s=i(74848),a=i(28453);const c={},t="API Reference",d={},l=[{value:"In This Section",id:"in-this-section",level:2},{value:"External API Documentation",id:"external-api-documentation",level:2},{value:"Next Steps",id:"next-steps",level:2}];function o(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components},{IIcon:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"api-reference",children:"API Reference"})}),"\n",(0,s.jsx)(n.p,{children:"API documentation for all supported languages and drivers."}),"\n",(0,s.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:openjdk",height:"24"})," Java Client (PRIMARY)"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Primary Ignite API with complete feature set including thin client, embedded node, and all platform capabilities."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./api-reference/native-clients/java/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:dotnet",height:"24"})," .NET Client"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Native .NET client for C# and F# applications with async/await patterns and LINQ support."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./api-reference/native-clients/dotnet/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:cplusplus",height:"24"})," C++ Client"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"High-performance C++ client with modern C++17 features and zero-copy operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./api-reference/native-clients/cpp/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:database-sync",height:"24"})," JDBC Driver"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Java Database Connectivity (JDBC 4.x) for SQL-only operations with standard database tools."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./api-reference/sql-only-apis/jdbc",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:link-variant",height:"24"})," ODBC Driver"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Open Database Connectivity (ODBC 3.8) for cross-platform SQL access from C/C++ applications."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./api-reference/sql-only-apis/odbc",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:python",height:"24"})," Python DB-API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Python Database API (PEP-249) for SQL connectivity from Python applications."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./api-reference/sql-only-apis/python",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(n.h2,{id:"external-api-documentation",children:"External API Documentation"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/javadoc/",children:"Java API JavaDoc"})," - Complete Java API reference"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/dotnetdoc/",children:".NET API Reference"})," - Complete .NET API reference"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/cppdoc/",children:"C++ API Reference"})," - Complete C++ API reference"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"develop",children:"Develop"})," - Build applications with these APIs"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"sql",children:"SQL"})," - SQL language reference"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"getting-started",children:"Getting Started"})," - Quick start tutorials"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/0d1c3a24.95af2c1a.js b/docs/ignite3/assets/js/0d1c3a24.95af2c1a.js deleted file mode 100644 index 98aabbbc56..0000000000 --- a/docs/ignite3/assets/js/0d1c3a24.95af2c1a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7313],{28453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>a});var s=r(96540);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}},47957:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"administrators-guide/system-groups-recovery","title":"Disaster Recovery for System Groups","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/system-groups-recovery.md","sourceDirName":"administrators-guide","slug":"/administrators-guide/system-groups-recovery","permalink":"/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Disaster Recovery for System Groups","sidebar_label":"Disaster Recovery for System Groups"},"sidebar":"tutorialSidebar","previous":{"title":"Disaster Recovery for Data Partitions","permalink":"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery"},"next":{"title":"Cluster Security","permalink":"/docs/ignite3/3.0.0/administrators-guide/cluster-security"}}');var n=r(74848),o=r(28453);const i={title:"Disaster Recovery for System Groups",sidebar_label:"Disaster Recovery for System Groups"},a="Disaster Recovery for System Groups",l={},d=[{value:"Cluster Management Group",id:"cluster-management-group",level:2},{value:"Metastorage Group",id:"metastorage-group",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:["\n",(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"disaster-recovery-for-system-groups",children:"Disaster Recovery for System Groups"})}),"\n",(0,n.jsx)(t.p,{children:"An Apache Ignite cluster includes two system RAFT groups, both of which are essential for the cluster's normal operation:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"/docs/ignite3/3.0.0/administrators-guide/lifecycle#cluster-management-group",children:"Cluster Management Group (CMG)"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"/docs/ignite3/3.0.0/administrators-guide/lifecycle#cluster-metastorage-group",children:"Metastorage Group (MG)"})}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["You perform ",(0,n.jsx)(t.em,{children:"disaster recovery"})," operations on ",(0,n.jsx)(t.em,{children:"system RAFT groups"})," to recover permanent ",(0,n.jsx)(t.em,{children:"majority loss"}),". When a system RAFT group loses majority, it becomes unavailable. When CMG is unavailable, the cluster itself remains available with limitations: it can still process most of the operations, but it cannot join new nodes, start/restart existing nodes, and start building new indexes. When MG is unavailable, the cluster becomes unusable; it cannot handle even GET/PUT/SQL requests."]}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsxs)(t.p,{children:["Disaster recovery for ",(0,n.jsx)(t.a,{href:"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery",children:"data partitions"})," is described in a separate page."]})}),"\n",(0,n.jsxs)(t.p,{children:["You see that the majority has been lost in cluster logs in the console or in the ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Log_rotation",children:"rotated log files"}),". When a RAFT group becomes unavailable, the logs would show something like\r\n",(0,n.jsx)(t.code,{children:"Send with retry timed out [retryCount = 11, groupId = cmg_group]."}),"\r\nor\r\n",(0,n.jsx)(t.code,{children:"Send with retry timed out [retryCount = 11, groupId = metastorage_group]."}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["An indicator that CMG is down is when a node does not start after a ",(0,n.jsx)(t.code,{children:"restart"})," command. This is reflected in the log as ",(0,n.jsx)(t.code,{children:"Local CMG state recovered, starting the CMG"}),", not followed by ",(0,n.jsx)(t.code,{children:"Successfully joined the cluster"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["If a node tries to start when CMG is available, but MG is not, the log shows ",(0,n.jsx)(t.code,{children:"Metastorage info on start"})," not followed by ",(0,n.jsx)(t.code,{children:"Performing MetaStorage recovery"}),"."]}),"\n",(0,n.jsx)(t.admonition,{type:"warning",children:(0,n.jsxs)(t.p,{children:["Exercise caution when applying disaster recovery commands to system node groups. These commands might result in ",(0,n.jsx)(t.em,{children:"split brain"})," (split your cluster into two clusters). Use the recovery commands as the last resort, only if the majority for CMG/MG is lost permanently."]})}),"\n",(0,n.jsx)(t.h2,{id:"cluster-management-group",children:"Cluster Management Group"}),"\n",(0,n.jsx)(t.p,{children:"If CMG loses majority:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Restart CMG nodes to restore the lost majority."}),"\n",(0,n.jsxs)(t.li,{children:["If the above fails, forcefully assign a new majority using the following ",(0,n.jsx)(t.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool#disaster-recovery-commands",children:"CLI command"})," (manually or via REST): ",(0,n.jsx)(t.code,{children:"recovery cluster reset --url= --cluster-management-group="}),"."]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The command is sent to the node indicated by the ",(0,n.jsx)(t.code,{children:"--url"})," parameter, which must belong to the ",(0,n.jsx)(t.code,{children:"new-cmg-nodes"})," RAFT group. This node becomes the ",(0,n.jsx)(t.em,{children:"Repair Conductor"}),", and it initiates the ",(0,n.jsx)(t.code,{children:"reset"})," procedure."]}),"\n",(0,n.jsx)(t.p,{children:"The above procedure might fail for the following reasons:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Some of the nodes specified in ",(0,n.jsx)(t.code,{children:"new-cmg-nodes"})," are not in the physical topology."]}),"\n",(0,n.jsx)(t.li,{children:"The Repair Conductor does not have all the information it needs to start the procedure."}),"\n"]}),"\n",(0,n.jsxs)(t.ol,{start:"3",children:["\n",(0,n.jsxs)(t.li,{children:["If some nodes were down or were unavailable due to a network partition (and hence did not participate in the repair):","\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Start these nodes (or restore network connectivity and restart them)."}),"\n",(0,n.jsxs)(t.li,{children:["Migrate these nodes to the repaired cluster using the following ",(0,n.jsx)(t.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool#disaster-recovery-commands",children:"CLI command"})," (manually or via REST): ",(0,n.jsx)(t.code,{children:"recovery cluster migrate --old-cluster-url= --new-cluster-url="}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"metastorage-group",children:"Metastorage Group"}),"\n",(0,n.jsx)(t.p,{children:"If MG loses majority:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Restart MG nodes (or at least their RAFT nodes inside Apache Ignite nodes)."}),"\n",(0,n.jsxs)(t.li,{children:["If the above fails:","\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Make sure that every node that could be started had started and joined the cluster."}),"\n",(0,n.jsxs)(t.li,{children:["Forcefully assign a new majority using the following ",(0,n.jsx)(t.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool#disaster-recovery-commands",children:"CLI command"})," (manually or via REST): ",(0,n.jsx)(t.code,{children:"recovery cluster reset --url= [--cluster-management-group=] --metastorage-replication-factor=N"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.code,{children:"N"})," is the requested number of the voting RAFT nodes in the MG after repair. If you omit ",(0,n.jsx)(t.code,{children:"--cluster-management-group"}),", the command takes the current CMG voting members set from the CMG leader; if CMG is not available, the command fails."]}),"\n",(0,n.jsxs)(t.p,{children:["The command is sent to the node specified by ",(0,n.jsx)(t.code,{children:"--url"}),". This node becomes the ",(0,n.jsx)(t.em,{children:"Repair Conductor"}),", and it initiates the ",(0,n.jsx)(t.code,{children:"reset"})," procedure."]}),"\n",(0,n.jsx)(t.p,{children:"If the Repair Conductor fails to repair MG, the procedure has to be repeated manually (there is no failover)."}),"\n",(0,n.jsxs)(t.ol,{start:"3",children:["\n",(0,n.jsxs)(t.li,{children:["If some nodes were down or were unavailable due to a network partition (and hence did not participate in the repair):","\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Start these nodes (or restore network connectivity and restart them)."}),"\n",(0,n.jsxs)(t.li,{children:["Migrate these nodes to the repaired cluster using the following ",(0,n.jsx)(t.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool#disaster-recovery-commands",children:"CLI command"})," (manually or via REST): ",(0,n.jsx)(t.code,{children:"recovery cluster migrate --old-cluster-url= --new-cluster-url="}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsxs)(t.p,{children:["If one of the nodes has a revision in its metastorage that is not present on any of the nodes that had participated in the repair, this means that its metastorage has diverged from the MG leader's metastorage. Such a node will not be allowed to join the cluster. Its startup will fail with ",(0,n.jsx)(t.code,{children:"MetastorageDivergedException (error code META-7)"}),". Remove the data from the above metastorage-divergent node and have it join the cluster as a blank node."]})})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/0dba3038.0883f0ee.js b/docs/ignite3/assets/js/0dba3038.0883f0ee.js deleted file mode 100644 index 51a124407c..0000000000 --- a/docs/ignite3/assets/js/0dba3038.0883f0ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8424],{28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>c});var t=i(96540);const a={},r=t.createContext(a);function o(e){const n=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(r.Provider,{value:n},e.children)}},94068:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"configure-and-operate/configuration/config-authentication","title":"Authentication","description":"Apache Ignite 3 provides basic Authentication capabilities.","source":"@site/docs/configure-and-operate/configuration/authentication.md","sourceDirName":"configure-and-operate/configuration","slug":"/configure-and-operate/configuration/config-authentication","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"config-authentication","title":"Authentication","sidebar_label":"Authentication"},"sidebar":"tutorialSidebar","previous":{"title":"RocksDB Storage","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb"},"next":{"title":"SSL/TLS","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls"}}');var a=i(74848),r=i(28453);const o={id:"config-authentication",title:"Authentication",sidebar_label:"Authentication"},c=void 0,s={},l=[{value:"Authentication Configuration",id:"authentication-configuration",level:2},{value:"Basic Authentication",id:"basic-authentication",level:3}];function u(e){const n={admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:"Apache Ignite 3 provides basic Authentication capabilities."}),"\n",(0,a.jsx)(n.h2,{id:"authentication-configuration",children:"Authentication Configuration"}),"\n",(0,a.jsx)(n.h3,{id:"basic-authentication",children:"Basic Authentication"}),"\n",(0,a.jsxs)(n.p,{children:["To start using basic authentication on the cluster, you need to enable it and create an initial administrator user. By default, the role that grants administrator permissions is called ",(0,a.jsx)(n.code,{children:"admin"}),", but you can change it in cluster configuration."]}),"\n",(0,a.jsx)(n.p,{children:"Here is an example of configuration that initializes the cluster and enables security on it:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Prepare cluster configuration file with security configuration:"}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-hocon",children:'ignite {\r\n security {\r\n enabled:true\r\n authentication {\r\n providers=[\r\n {\r\n name=default\r\n type=basic\r\n users=[\r\n {\r\n displayName=administrator\r\n password="ignite"\r\n roles=[\r\n system\r\n ]\r\n username=ignite\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Initialize the cluster with the security configuration:"}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"cluster init --name=sampleCluster --config-files=/cluster-config.conf\n"})}),"\n",(0,a.jsxs)(n.p,{children:["When the cluster has been initialized, it has basic authorization configured for ",(0,a.jsx)(n.code,{children:"ignite"})," user name and ",(0,a.jsx)(n.code,{children:"ignite"})," password with system level access. However, by default security is disabled. To enable it:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"cluster config update ignite.security.enabled=true\n"})}),"\n",(0,a.jsx)(n.admonition,{type:"warning",children:(0,a.jsx)(n.p,{children:"If you lose access to all accounts with system role, you will lose administrator access to the cluster."})}),"\n",(0,a.jsx)(n.p,{children:"After authorization is enabled, you will be disconnected from the cluster and must reconnect to the cluster:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"connect http://127.0.0.1:10300 --username ignite --password ignite\n"})}),"\n",(0,a.jsx)(n.p,{children:"You can change the password for the default user by updating cluster configuration, for example:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"cluster config update ignite.security.authentication.providers.default.users.ignite.password=myPass\n"})})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/0e52afe7.6e26a64f.js b/docs/ignite3/assets/js/0e52afe7.6e26a64f.js deleted file mode 100644 index 39cfdd3e4b..0000000000 --- a/docs/ignite3/assets/js/0e52afe7.6e26a64f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4026],{28453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>l});var i=t(96540);const d={},n=i.createContext(d);function r(e){const s=i.useContext(n);return i.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),i.createElement(n.Provider,{value:s},e.children)}},33124:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>h,contentTitle:()=>l,default:()=>a,frontMatter:()=>r,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"administrators-guide/metrics/system-views","title":"System Views","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/metrics/system-views.md","sourceDirName":"administrators-guide/metrics","slug":"/administrators-guide/metrics/system-views","permalink":"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"System Views","sidebar_label":"System Views"},"sidebar":"tutorialSidebar","previous":{"title":"Available Metrics","permalink":"/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list"},"next":{"title":"Errors and Solutions","permalink":"/docs/ignite3/3.0.0/administrators-guide/handling-exceptions"}}');var d=t(74848),n=t(28453);const r={title:"System Views",sidebar_label:"System Views"},l="System Views",h={},c=[{value:"Getting Data",id:"getting-data",level:2},{value:"Available Views",id:"available-views",level:2},{value:"COMPUTE_JOBS",id:"compute_jobs",level:3},{value:"GLOBAL_PARTITION_STATES",id:"global_partition_states",level:3},{value:"INDEXES",id:"indexes",level:3},{value:"LOCKS",id:"locks",level:3},{value:"LOCAL_PARTITION_STATES",id:"local_partition_states",level:3},{value:"SQL_QUERIES",id:"sql_queries",level:3},{value:"SYSTEM_VIEWS",id:"system_views",level:3},{value:"SYSTEM_VIEW_COLUMNS",id:"system_view_columns",level:3},{value:"TRANSACTIONS",id:"transactions",level:3},{value:"ZONES",id:"zones",level:3}];function x(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:["\n",(0,d.jsx)(s.header,{children:(0,d.jsx)(s.h1,{id:"system-views",children:"System Views"})}),"\n",(0,d.jsx)(s.p,{children:"Ignite provides a number of built-in SQL views that provide information on the cluster's state and provide real-time insight into the status of its components. These views are available in the SYSTEM schema."}),"\n",(0,d.jsx)(s.h2,{id:"getting-data",children:"Getting Data"}),"\n",(0,d.jsx)(s.p,{children:"You access system views in Ignite by using SQL and selecting data from the system view like you would from any other table. For example, you can get a list of all available system views in the following way:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-sql",children:"SELECT * FROM system.system_views\n"})}),"\n",(0,d.jsxs)(s.p,{children:["You can also use joins to combine data from multiple views. The example below returns all columns of a view that was found in the ",(0,d.jsx)(s.code,{children:"SYSTEM_VIEWS"})," view:"]}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-sql",children:"SELECT svc.*\r\n FROM system.system_view_columns svc\r\n JOIN system.system_views sv ON svc.view_id = sv.id\r\n WHERE sv.name = 'SYSTEM_VIEWS'\n"})}),"\n",(0,d.jsx)(s.h2,{id:"available-views",children:"Available Views"}),"\n",(0,d.jsx)(s.h3,{id:"compute_jobs",children:"COMPUTE_JOBS"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"ID"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The compute job ID."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"COORDINATOR_NODE_ID"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The job's coordinator node ID."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"STATUS"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The job status."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"CREATE_TIME"}),(0,d.jsx)(s.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,d.jsx)(s.td,{children:"The job creation timestamp."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"START_TIME"}),(0,d.jsx)(s.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,d.jsx)(s.td,{children:"The job start timestamp."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"FINISH_TIME"}),(0,d.jsx)(s.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,d.jsx)(s.td,{children:"The job finish timestamp."})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"global_partition_states",children:"GLOBAL_PARTITION_STATES"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"ZONE_NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the distribution zone the partition belongs to."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TABLE_NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the table stored in the partition."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TABLE_ID"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"The ID of the table stored in the partition."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"SCHEMA_NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the schema the table belongs to."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"PARTITION_ID"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"The unique identifier of the partition."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"STATE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsxs)(s.td,{children:["Partition status. Possible values: ",(0,d.jsx)(s.code,{children:"AVAILABLE"}),", ",(0,d.jsx)(s.code,{children:"DEGRADED"}),", ",(0,d.jsx)(s.code,{children:"READ_ONLY"}),", ",(0,d.jsx)(s.code,{children:"UNAVAILABLE"}),". See ",(0,d.jsx)(s.a,{href:"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery",children:"Disaster Recovery"})," documentation for more information."]})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"indexes",children:"INDEXES"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"INDEX_ID"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"Unique index identifier."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"INDEX_NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the index."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TABLE_ID"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"Unique table identifier."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TABLE_NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the table."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"SCHEMA_ID"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"Unique schema identifier."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"SCHEMA_NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the schema."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TYPE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsxs)(s.td,{children:["The type of the index. Possible values: ",(0,d.jsx)(s.code,{children:"HASH"}),", ",(0,d.jsx)(s.code,{children:"SORTED"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"IS_UNIQUE"}),(0,d.jsx)(s.td,{children:"BOOLEAN"}),(0,d.jsx)(s.td,{children:"If the index is unique."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"COLUMNS"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The list of indexed columns."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"STATUS"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsxs)(s.td,{children:["Current status of the index. Possible values:",(0,d.jsx)("br",{}),"* ",(0,d.jsx)(s.code,{children:"REGISTERED"})," - Index has been registered and is awaiting the start of building,",(0,d.jsx)("br",{}),"* ",(0,d.jsx)(s.code,{children:"BUILDING"})," - Index is being built,",(0,d.jsx)("br",{}),"* ",(0,d.jsx)(s.code,{children:"AVAILABLE"})," - Index is built and is ready to use,",(0,d.jsx)("br",{}),"* ",(0,d.jsx)(s.code,{children:"STOPPING"})," - DROP INDEX command has been executed, index is waiting for running transactions to finish."]})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"locks",children:"LOCKS"}),"\n",(0,d.jsx)(s.p,{children:"A node system view that lists the currently active locks."}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"OWNING_NODE_ID"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The ID of the node that owns the lock."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TX_ID"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The ID of the transaction that created the lock."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"OBJECT_ID"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The ID of the locked object."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"MODE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsxs)(s.td,{children:["The ",(0,d.jsx)(s.a,{href:"https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=211885498#IEP91:Transactionprotocol-Lockingmodel",children:"lock mode"}),". Possible values are:",(0,d.jsx)("br",{}),"* IS - intention shared lock",(0,d.jsx)("br",{}),"* S - shared lock",(0,d.jsx)("br",{}),"* IX - intention exclusive lock",(0,d.jsx)("br",{}),"* SIX - shared intention exclusive lock",(0,d.jsx)("br",{}),"* X - exclusive lock"]})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"local_partition_states",children:"LOCAL_PARTITION_STATES"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"ZONE_NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the distribution zone the partition belongs to."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TABLE_NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the table stored in the partition."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TABLE_ID"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"The ID of the table stored in the partition."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"SCHEMA"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the schema the table belongs to."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"PARTITION_ID"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"The unique identifier of the partition."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"STATE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsxs)(s.td,{children:["Partition status. Possible values: ",(0,d.jsx)(s.code,{children:"AVAILABLE"}),", ",(0,d.jsx)(s.code,{children:"DEGRADED"}),", ",(0,d.jsx)(s.code,{children:"READ_ONLY"}),", ",(0,d.jsx)(s.code,{children:"UNAVAILABLE"}),". See ",(0,d.jsx)(s.a,{href:"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery",children:"Disaster Recovery"})," documentation for more information."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"ESTIMATED_ROWS"}),(0,d.jsx)(s.td,{children:"INT64"}),(0,d.jsx)(s.td,{children:"The estimated number of rows in a partition."})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"sql_queries",children:"SQL_QUERIES"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"INITIATOR_NODE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the node that initiated the query."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"PHASE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsxs)(s.td,{children:["The query phase:",(0,d.jsx)("br",{}),"* INITIALIZATION - query registration and parsing",(0,d.jsx)("br",{}),"* OPTIMIZATION - query validation and plan optimization",(0,d.jsx)("br",{}),"* EXECUTION - query plan execution"]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TYPE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The query type: DDL, DML, QUERY, or SCRIPT."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"ID"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The query ID."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"USERNAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the user who started the query."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"PARENT_ID"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"ID of the script that initiated the query (NULL if the query was not initiated by a script)."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"SQL"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The SQL query's expression."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"START_TIME"}),(0,d.jsx)(s.td,{children:"TIMESTAMP"}),(0,d.jsx)(s.td,{children:"The date/time the query started."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"SCHEMA"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the default schema that was used to execute the query."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TRANSACTION_ID"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The ID of the transaction in which the query was executed."})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"system_views",children:"SYSTEM_VIEWS"}),"\n",(0,d.jsx)(s.p,{children:"Describes available system views."}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"ID"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"System view ID."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"SCHEMA"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsxs)(s.td,{children:["Name of the schema used. Default is ",(0,d.jsx)(s.code,{children:"SYSTEM"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"System view name."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TYPE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsxs)(s.td,{children:["System view type. Possible values:",(0,d.jsx)("br",{}),"* NODE - The view provides node-specific information. Data will be collected from all nodes, and represented in the view.",(0,d.jsx)("br",{}),"* CLUSTER - The view provides cluster-wide information. Data will be collected from one node, chosen to represent the cluster."]})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"system_view_columns",children:"SYSTEM_VIEW_COLUMNS"}),"\n",(0,d.jsx)(s.p,{children:"Describes available system view columns."}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"VIEW_ID"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"System view ID."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"Column name."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TYPE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsxs)(s.td,{children:["Column type. Can by any of the ",(0,d.jsx)(s.a,{href:"/docs/ignite3/3.0.0/sql-reference/data-types",children:"supported types"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"NULLABLE"}),(0,d.jsx)(s.td,{children:"BOOLEAN"}),(0,d.jsx)(s.td,{children:"Defines if the column can be empty."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"PRECISION"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"Maximum number of digits."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"SCALE"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"Maximum number of decimal places."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"LENGTH"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"Maximum length of the value. Symbols for string values or bytes for binary values."})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"transactions",children:"TRANSACTIONS"}),"\n",(0,d.jsx)(s.admonition,{type:"note",children:(0,d.jsx)(s.p,{children:"This view shows only the currently active transactions."})}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"COORDINATOR_NODE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the transaction's coordinator node."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"STATE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The transaction state. For read-only transactions, the value is always null (empty). For read-write transactions, the possible values are PENDING - the transaction is in progress - and FINISHING - the transaction is in the process of being finished."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"ID"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The transaction ID."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"START_TIME"}),(0,d.jsx)(s.td,{children:"TIMESTAMP"}),(0,d.jsx)(s.td,{children:"The transaction's start time."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"TYPE"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The transaction type: READ_ONLY or READ_WRITE."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"PRIORITY"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The transaction priority, which is used to resolve conflicts between transactions. Currently, this value cannot be explicitly set by the user. Possible values are LOW and NORMAL (default)."})]})]})]}),"\n",(0,d.jsx)(s.h3,{id:"zones",children:"ZONES"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Column"}),(0,d.jsx)(s.th,{children:"Data Type"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"NAME"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The name of the distribution zone."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"PARTITIONS"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"The number of partitions in the distribution zone."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"REPLICAS"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The number of copies of each partition in the distribution zone."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"DATA_NODES_AUTO_ADJUST_SCALE_UP"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"The delay in seconds between the new node joining and the start of data zone adjustment."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"DATA_NODES_AUTO_ADJUST_SCALE_DOWN"}),(0,d.jsx)(s.td,{children:"INT32"}),(0,d.jsx)(s.td,{children:"The delay in seconds between the node leaving the cluster and the start of data zone adjustment."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"DATA_NODES_FILTER"}),(0,d.jsx)(s.td,{children:"STRING"}),(0,d.jsx)(s.td,{children:"The filter that specifies what nodes will be used by the distribution zone."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:"IS_DEFAULT_ZONE"}),(0,d.jsx)(s.td,{children:"BOOLEAN"}),(0,d.jsx)(s.td,{children:"Defines if the data zone is used by default."})]})]})]})]})}function a(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,d.jsx)(s,{...e,children:(0,d.jsx)(x,{...e})}):x(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/0eb0485d.0dd9ee5c.js b/docs/ignite3/assets/js/0eb0485d.0dd9ee5c.js deleted file mode 100644 index 6fe12afaad..0000000000 --- a/docs/ignite3/assets/js/0eb0485d.0dd9ee5c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2035],{4660:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>S,frontMatter:()=>c,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"api-reference/sql-only-apis/odbc","title":"ODBC Driver","description":"The Apache Ignite 3 ODBC driver implements ODBC 3.8 standard for C and C++ applications. It provides SQL access through the standard ODBC API without requiring server-side libraries.","source":"@site/docs/api-reference/sql-only-apis/odbc.md","sourceDirName":"api-reference/sql-only-apis","slug":"/api-reference/sql-only-apis/odbc","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"ODBC Driver","id":"odbc","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"JDBC Driver","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc"},"next":{"title":"Python DB-API","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/python"}}');var t=r(74848),s=r(28453);const c={title:"ODBC Driver",id:"odbc",sidebar_position:2},l="ODBC Driver",d={},a=[{value:"Connection String Format",id:"connection-string-format",level:2},{value:"Configuration Parameters",id:"configuration-parameters",level:2},{value:"Connection Parameters",id:"connection-parameters",level:3},{value:"Authentication",id:"authentication",level:3},{value:"Schema Selection",id:"schema-selection",level:3},{value:"Performance Tuning",id:"performance-tuning",level:3},{value:"SSL Configuration",id:"ssl-configuration",level:3},{value:"DSN Configuration",id:"dsn-configuration",level:2},{value:"Windows",id:"windows",level:3},{value:"Linux",id:"linux",level:3},{value:"macOS",id:"macos",level:3},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Basic Connection",id:"basic-connection",level:3},{value:"DSN Connection",id:"dsn-connection",level:3},{value:"Connection with Authentication",id:"connection-with-authentication",level:3},{value:"Connection with SSL",id:"connection-with-ssl",level:3},{value:"Prepared Statements",id:"prepared-statements",level:3},{value:"Batch Operations",id:"batch-operations",level:3},{value:"Transaction Control",id:"transaction-control",level:3},{value:"Error Handling",id:"error-handling",level:3},{value:"Metadata Queries",id:"metadata-queries",level:3},{value:"Ignite-Specific Behavior",id:"ignite-specific-behavior",level:2},{value:"Type Mapping",id:"type-mapping",level:3},{value:"Result Set Characteristics",id:"result-set-characteristics",level:3},{value:"Pagination",id:"pagination",level:3},{value:"Connection Timeout",id:"connection-timeout",level:3},{value:"Query Timeout",id:"query-timeout",level:3},{value:"Connection String Examples",id:"connection-string-examples",level:2},{value:"Reference",id:"reference",level:2},{value:"ODBC Compliance",id:"odbc-compliance",level:3},{value:"Supported ODBC Functions",id:"supported-odbc-functions",level:3},{value:"Limitations",id:"limitations",level:3}];function o(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"odbc-driver",children:"ODBC Driver"})}),"\n",(0,t.jsx)(n.p,{children:"The Apache Ignite 3 ODBC driver implements ODBC 3.8 standard for C and C++ applications. It provides SQL access through the standard ODBC API without requiring server-side libraries."}),"\n",(0,t.jsx)(n.h2,{id:"connection-string-format",children:"Connection String Format"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"DRIVER={Apache Ignite 3};ADDRESS=host:port;param=value;param=value\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Parameters are semicolon-separated key-value pairs. The driver requires either ",(0,t.jsx)(n.code,{children:"ADDRESS"})," or both ",(0,t.jsx)(n.code,{children:"HOST"})," and ",(0,t.jsx)(n.code,{children:"PORT"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Default port: 10800\r\nDefault schema: PUBLIC"}),"\n",(0,t.jsx)(n.h2,{id:"configuration-parameters",children:"Configuration Parameters"}),"\n",(0,t.jsx)(n.h3,{id:"connection-parameters",children:"Connection Parameters"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"DRIVER"})," - ODBC driver name (required): ",(0,t.jsx)(n.code,{children:"{Apache Ignite 3}"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ADDRESS"})," - Host and port in format ",(0,t.jsx)(n.code,{children:"host:port"})," (can specify multiple comma-separated addresses)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"HOST"})," - Host address (alternative to ADDRESS)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"PORT"})," - Port number (alternative to ADDRESS, default: 10800)"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"authentication",children:"Authentication"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IDENTITY"})," - Username for authentication"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SECRET"})," - Password for authentication"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"schema-selection",children:"Schema Selection"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SCHEMA"})," - Default schema for queries (default: ",(0,t.jsx)(n.code,{children:"PUBLIC"}),")"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"performance-tuning",children:"Performance Tuning"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"PAGE_SIZE"})," - Number of rows fetched per request (default: 1024)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"TIMEZONE"})," - Client timezone for timestamp conversions"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"ssl-configuration",children:"SSL Configuration"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SSL_MODE"})," - SSL connection mode: ",(0,t.jsx)(n.code,{children:"disable"})," or ",(0,t.jsx)(n.code,{children:"require"})," (default: ",(0,t.jsx)(n.code,{children:"disable"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SSL_KEY_FILE"})," - Path to PEM-encoded private key file"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SSL_CERT_FILE"})," - Path to PEM-encoded certificate file"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SSL_CA_FILE"})," - Path to PEM-encoded CA certificate file"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"dsn-configuration",children:"DSN Configuration"}),"\n",(0,t.jsx)(n.p,{children:"Configure Data Source Names (DSN) through your system's ODBC administrator."}),"\n",(0,t.jsx)(n.h3,{id:"windows",children:"Windows"}),"\n",(0,t.jsxs)(n.p,{children:["Use ODBC Data Source Administrator (",(0,t.jsx)(n.code,{children:"odbcad32.exe"}),"):"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Open ODBC Data Source Administrator"}),"\n",(0,t.jsx)(n.li,{children:"Add new data source"}),"\n",(0,t.jsx)(n.li,{children:'Select "Apache Ignite 3" driver'}),"\n",(0,t.jsx)(n.li,{children:"Configure connection parameters"}),"\n",(0,t.jsx)(n.li,{children:"Test connection"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"linux",children:"Linux"}),"\n",(0,t.jsxs)(n.p,{children:["Edit ",(0,t.jsx)(n.code,{children:"/etc/odbc.ini"})," or ",(0,t.jsx)(n.code,{children:"~/.odbc.ini"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ini",children:"[IgniteDS]\r\nDriver=Apache Ignite 3\r\nADDRESS=localhost:10800\r\nSCHEMA=PUBLIC\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Configure driver location in ",(0,t.jsx)(n.code,{children:"/etc/odbcinst.ini"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ini",children:"[Apache Ignite 3]\r\nDescription=Apache Ignite 3 ODBC Driver\r\nDriver=/usr/local/lib/libignite-odbc.so\n"})}),"\n",(0,t.jsx)(n.h3,{id:"macos",children:"macOS"}),"\n",(0,t.jsxs)(n.p,{children:["Edit ",(0,t.jsx)(n.code,{children:"~/Library/ODBC/odbc.ini"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ini",children:"[IgniteDS]\r\nDriver=Apache Ignite 3\r\nADDRESS=localhost:10800\r\nSCHEMA=PUBLIC\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Configure driver in ",(0,t.jsx)(n.code,{children:"~/Library/ODBC/odbcinst.ini"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-ini",children:"[Apache Ignite 3]\r\nDescription=Apache Ignite 3 ODBC Driver\r\nDriver=/usr/local/lib/libignite-odbc.dylib\n"})}),"\n",(0,t.jsx)(n.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,t.jsx)(n.h3,{id:"basic-connection",children:"Basic Connection"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:'#include \r\n#include \r\n\r\nSQLHENV env;\r\nSQLHDBC dbc;\r\nSQLHSTMT stmt;\r\n\r\n// Allocate environment\r\nSQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);\r\nSQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);\r\n\r\n// Allocate connection\r\nSQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);\r\n\r\n// Connect\r\nSQLCHAR connStr[] = "DRIVER={Apache Ignite 3};ADDRESS=localhost:10800";\r\nSQLDriverConnect(dbc, NULL, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);\r\n\r\n// Allocate statement\r\nSQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\n// Execute query\r\nSQLExecDirect(stmt, (SQLCHAR*)"SELECT id, name FROM users", SQL_NTS);\r\n\r\n// Fetch results\r\nSQLINTEGER id;\r\nSQLCHAR name[256];\r\nSQLLEN idLen, nameLen;\r\n\r\nSQLBindCol(stmt, 1, SQL_C_LONG, &id, 0, &idLen);\r\nSQLBindCol(stmt, 2, SQL_C_CHAR, name, sizeof(name), &nameLen);\r\n\r\nwhile (SQLFetch(stmt) == SQL_SUCCESS) {\r\n printf("%d: %s\\n", id, name);\r\n}\r\n\r\n// Cleanup\r\nSQLFreeHandle(SQL_HANDLE_STMT, stmt);\r\nSQLDisconnect(dbc);\r\nSQLFreeHandle(SQL_HANDLE_DBC, dbc);\r\nSQLFreeHandle(SQL_HANDLE_ENV, env);\n'})}),"\n",(0,t.jsx)(n.h3,{id:"dsn-connection",children:"DSN Connection"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:'SQLCHAR dsn[] = "DSN=IgniteDS";\r\nSQLConnect(dbc, dsn, SQL_NTS, NULL, 0, NULL, 0);\n'})}),"\n",(0,t.jsx)(n.h3,{id:"connection-with-authentication",children:"Connection with Authentication"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:'SQLCHAR connStr[] = "DRIVER={Apache Ignite 3};ADDRESS=localhost:10800;IDENTITY=admin;SECRET=password";\r\nSQLDriverConnect(dbc, NULL, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);\n'})}),"\n",(0,t.jsx)(n.h3,{id:"connection-with-ssl",children:"Connection with SSL"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:'SQLCHAR connStr[] =\r\n "DRIVER={Apache Ignite 3};"\r\n "ADDRESS=localhost:10800;"\r\n "SSL_MODE=require;"\r\n "SSL_CERT_FILE=/path/to/client.pem;"\r\n "SSL_KEY_FILE=/path/to/client-key.pem;"\r\n "SSL_CA_FILE=/path/to/ca.pem";\r\n\r\nSQLDriverConnect(dbc, NULL, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);\n'})}),"\n",(0,t.jsx)(n.h3,{id:"prepared-statements",children:"Prepared Statements"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:'SQLCHAR sql[] = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";\r\nSQLPrepare(stmt, sql, SQL_NTS);\r\n\r\nSQLINTEGER id = 101;\r\nSQLCHAR name[] = "John Doe";\r\nSQLCHAR email[] = "john@example.com";\r\nSQLLEN idLen = 0, nameLen = SQL_NTS, emailLen = SQL_NTS;\r\n\r\nSQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, &idLen);\r\nSQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, name, 0, &nameLen);\r\nSQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, email, 0, &emailLen);\r\n\r\nSQLExecute(stmt);\n'})}),"\n",(0,t.jsx)(n.h3,{id:"batch-operations",children:"Batch Operations"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:'#define ARRAY_SIZE 100\r\n\r\nSQLINTEGER ids[ARRAY_SIZE];\r\nSQLCHAR names[ARRAY_SIZE][256];\r\nSQLLEN idLens[ARRAY_SIZE];\r\nSQLLEN nameLens[ARRAY_SIZE];\r\n\r\n// Set array size\r\nSQLULEN arraySize = ARRAY_SIZE;\r\nSQLSetStmtAttr(stmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)arraySize, 0);\r\n\r\n// Bind arrays\r\nSQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, ids, 0, idLens);\r\nSQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 256, 0, names, 256, nameLens);\r\n\r\n// Populate arrays\r\nfor (int i = 0; i < ARRAY_SIZE; i++) {\r\n ids[i] = i;\r\n sprintf((char*)names[i], "User %d", i);\r\n idLens[i] = 0;\r\n nameLens[i] = SQL_NTS;\r\n}\r\n\r\n// Execute batch\r\nSQLCHAR sql[] = "INSERT INTO users (id, name) VALUES (?, ?)";\r\nSQLExecDirect(stmt, sql, SQL_NTS);\n'})}),"\n",(0,t.jsx)(n.h3,{id:"transaction-control",children:"Transaction Control"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:'// Disable auto-commit\r\nSQLSetConnectAttr(dbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, 0);\r\n\r\n// Execute multiple statements\r\nSQLExecDirect(stmt, (SQLCHAR*)"INSERT INTO accounts (id, balance) VALUES (1, 1000)", SQL_NTS);\r\nSQLExecDirect(stmt, (SQLCHAR*)"INSERT INTO accounts (id, balance) VALUES (2, 2000)", SQL_NTS);\r\n\r\n// Commit\r\nSQLEndTran(SQL_HANDLE_DBC, dbc, SQL_COMMIT);\r\n\r\n// Or rollback on error\r\n// SQLEndTran(SQL_HANDLE_DBC, dbc, SQL_ROLLBACK);\r\n\r\n// Re-enable auto-commit\r\nSQLSetConnectAttr(dbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON, 0);\n'})}),"\n",(0,t.jsx)(n.h3,{id:"error-handling",children:"Error Handling"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:'SQLRETURN ret = SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM invalid_table", SQL_NTS);\r\n\r\nif (!SQL_SUCCEEDED(ret)) {\r\n SQLCHAR sqlState[6];\r\n SQLINTEGER nativeError;\r\n SQLCHAR message[SQL_MAX_MESSAGE_LENGTH];\r\n SQLSMALLINT messageLen;\r\n\r\n SQLGetDiagRec(SQL_HANDLE_STMT, stmt, 1, sqlState, &nativeError,\r\n message, sizeof(message), &messageLen);\r\n\r\n printf("Error: %s (%d): %s\\n", sqlState, nativeError, message);\r\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"metadata-queries",children:"Metadata Queries"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:'// List tables\r\nSQLTables(stmt, NULL, 0, NULL, 0, NULL, 0, (SQLCHAR*)"TABLE", SQL_NTS);\r\n\r\n// List columns for a table\r\nSQLColumns(stmt, NULL, 0, NULL, 0, (SQLCHAR*)"users", SQL_NTS, NULL, 0);\r\n\r\n// Get result metadata\r\nSQLCHAR columnName[256];\r\nSQLSMALLINT nameLen, dataType, decimalDigits, nullable;\r\nSQLULEN columnSize;\r\n\r\nfor (SQLSMALLINT i = 1; i <= columnCount; i++) {\r\n SQLDescribeCol(stmt, i, columnName, sizeof(columnName), &nameLen,\r\n &dataType, &columnSize, &decimalDigits, &nullable);\r\n\r\n printf("Column %d: %s, Type: %d, Size: %lu\\n",\r\n i, columnName, dataType, columnSize);\r\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"ignite-specific-behavior",children:"Ignite-Specific Behavior"}),"\n",(0,t.jsx)(n.h3,{id:"type-mapping",children:"Type Mapping"}),"\n",(0,t.jsx)(n.p,{children:"ODBC SQL types map to C types:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"SQL Type"}),(0,t.jsx)(n.th,{children:"ODBC SQL Type"}),(0,t.jsx)(n.th,{children:"C Type"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"BOOLEAN"}),(0,t.jsx)(n.td,{children:"SQL_BIT"}),(0,t.jsx)(n.td,{children:"SQL_C_BIT"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"TINYINT"}),(0,t.jsx)(n.td,{children:"SQL_TINYINT"}),(0,t.jsx)(n.td,{children:"SQL_C_STINYINT"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"SMALLINT"}),(0,t.jsx)(n.td,{children:"SQL_SMALLINT"}),(0,t.jsx)(n.td,{children:"SQL_C_SSHORT"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"INTEGER"}),(0,t.jsx)(n.td,{children:"SQL_INTEGER"}),(0,t.jsx)(n.td,{children:"SQL_C_SLONG"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"BIGINT"}),(0,t.jsx)(n.td,{children:"SQL_BIGINT"}),(0,t.jsx)(n.td,{children:"SQL_C_SBIGINT"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"FLOAT"}),(0,t.jsx)(n.td,{children:"SQL_FLOAT"}),(0,t.jsx)(n.td,{children:"SQL_C_FLOAT"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"REAL"}),(0,t.jsx)(n.td,{children:"SQL_REAL"}),(0,t.jsx)(n.td,{children:"SQL_C_FLOAT"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"DOUBLE"}),(0,t.jsx)(n.td,{children:"SQL_DOUBLE"}),(0,t.jsx)(n.td,{children:"SQL_C_DOUBLE"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"DECIMAL"}),(0,t.jsx)(n.td,{children:"SQL_DECIMAL"}),(0,t.jsx)(n.td,{children:"SQL_C_CHAR"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"DATE"}),(0,t.jsx)(n.td,{children:"SQL_TYPE_DATE"}),(0,t.jsx)(n.td,{children:"SQL_C_TYPE_DATE"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"TIME"}),(0,t.jsx)(n.td,{children:"SQL_TYPE_TIME"}),(0,t.jsx)(n.td,{children:"SQL_C_TYPE_TIME"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"TIMESTAMP"}),(0,t.jsx)(n.td,{children:"SQL_TYPE_TIMESTAMP"}),(0,t.jsx)(n.td,{children:"SQL_C_TYPE_TIMESTAMP"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"CHAR"}),(0,t.jsx)(n.td,{children:"SQL_CHAR"}),(0,t.jsx)(n.td,{children:"SQL_C_CHAR"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"VARCHAR"}),(0,t.jsx)(n.td,{children:"SQL_VARCHAR"}),(0,t.jsx)(n.td,{children:"SQL_C_CHAR"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"BINARY"}),(0,t.jsx)(n.td,{children:"SQL_BINARY"}),(0,t.jsx)(n.td,{children:"SQL_C_BINARY"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"VARBINARY"}),(0,t.jsx)(n.td,{children:"SQL_VARBINARY"}),(0,t.jsx)(n.td,{children:"SQL_C_BINARY"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"UUID"}),(0,t.jsx)(n.td,{children:"SQL_GUID"}),(0,t.jsx)(n.td,{children:"SQL_C_GUID"})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"result-set-characteristics",children:"Result Set Characteristics"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Cursor Type"}),": Forward-only (SQL_CURSOR_FORWARD_ONLY)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Concurrency"}),": Read-only"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Scrollable"}),": No (cursor moves forward only)"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"pagination",children:"Pagination"}),"\n",(0,t.jsx)(n.p,{children:"The driver fetches results in pages. Configure page size for performance:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:"// Set page size before executing query\r\nSQLUINTEGER pageSize = 2048;\r\nSQLSetStmtAttr(stmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)pageSize, 0);\n"})}),"\n",(0,t.jsx)(n.p,{children:"Default page size: 1024 rows."}),"\n",(0,t.jsx)(n.h3,{id:"connection-timeout",children:"Connection Timeout"}),"\n",(0,t.jsx)(n.p,{children:"Set connection timeout during allocation:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:"// Set 5-second connection timeout\r\nSQLINTEGER timeout = 5;\r\nSQLSetConnectAttr(dbc, SQL_ATTR_CONNECTION_TIMEOUT, (SQLPOINTER)timeout, 0);\n"})}),"\n",(0,t.jsx)(n.h3,{id:"query-timeout",children:"Query Timeout"}),"\n",(0,t.jsx)(n.p,{children:"Set query timeout on statement:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-c",children:"// Set 30-second query timeout\r\nSQLINTEGER timeout = 30;\r\nSQLSetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER)timeout, 0);\n"})}),"\n",(0,t.jsx)(n.h2,{id:"connection-string-examples",children:"Connection String Examples"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"# Basic\r\nDRIVER={Apache Ignite 3};ADDRESS=localhost:10800\r\n\r\n# With schema\r\nDRIVER={Apache Ignite 3};ADDRESS=localhost:10800;SCHEMA=analytics\r\n\r\n# With authentication\r\nDRIVER={Apache Ignite 3};ADDRESS=localhost:10800;IDENTITY=admin;SECRET=password\r\n\r\n# With SSL\r\nDRIVER={Apache Ignite 3};ADDRESS=localhost:10800;SSL_MODE=require;SSL_CERT_FILE=/opt/certs/client.pem;SSL_KEY_FILE=/opt/certs/client-key.pem;SSL_CA_FILE=/opt/certs/ca.pem\r\n\r\n# Multiple nodes\r\nDRIVER={Apache Ignite 3};ADDRESS=node1:10800,node2:10800,node3:10800\r\n\r\n# Complete configuration\r\nDRIVER={Apache Ignite 3};ADDRESS=node1:10800,node2:10800;SCHEMA=mySchema;IDENTITY=admin;SECRET=password;PAGE_SIZE=2048;SSL_MODE=require;SSL_CERT_FILE=/opt/certs/client.pem;SSL_KEY_FILE=/opt/certs/client-key.pem;SSL_CA_FILE=/opt/certs/ca.pem\n"})}),"\n",(0,t.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,t.jsx)(n.h3,{id:"odbc-compliance",children:"ODBC Compliance"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"ODBC 3.8 specification compliant"}),"\n",(0,t.jsx)(n.li,{children:"Core functions implemented (Level 1)"}),"\n",(0,t.jsx)(n.li,{children:"Supports SQLConnect, SQLDriverConnect, SQLExecDirect, SQLPrepare, SQLExecute"}),"\n",(0,t.jsx)(n.li,{children:"Supports SQLBindCol, SQLBindParameter, SQLFetch"}),"\n",(0,t.jsx)(n.li,{children:"Supports SQLGetInfo, SQLGetDiagRec for diagnostics"}),"\n",(0,t.jsx)(n.li,{children:"Implements metadata functions: SQLTables, SQLColumns, SQLPrimaryKeys"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"supported-odbc-functions",children:"Supported ODBC Functions"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Connection Management"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SQLAllocHandle, SQLFreeHandle"}),"\n",(0,t.jsx)(n.li,{children:"SQLConnect, SQLDriverConnect, SQLDisconnect"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Statement Management"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SQLAllocStmt, SQLFreeStmt"}),"\n",(0,t.jsx)(n.li,{children:"SQLPrepare, SQLExecute, SQLExecDirect"}),"\n",(0,t.jsx)(n.li,{children:"SQLCloseCursor"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Result Handling"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SQLBindCol, SQLFetch"}),"\n",(0,t.jsx)(n.li,{children:"SQLRowCount"}),"\n",(0,t.jsx)(n.li,{children:"SQLDescribeCol, SQLNumResultCols"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Parameter Binding"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SQLBindParameter"}),"\n",(0,t.jsx)(n.li,{children:"SQLNumParams"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Transaction Control"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SQLEndTran (commit/rollback)"}),"\n",(0,t.jsx)(n.li,{children:"SQLSetConnectAttr (auto-commit mode)"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Metadata"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SQLTables, SQLColumns"}),"\n",(0,t.jsx)(n.li,{children:"SQLPrimaryKeys, SQLForeignKeys"}),"\n",(0,t.jsx)(n.li,{children:"SQLGetInfo, SQLGetTypeInfo"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Scrollable cursors not supported (forward-only only)"}),"\n",(0,t.jsx)(n.li,{children:"Positioned updates/deletes not supported (read-only results)"}),"\n",(0,t.jsx)(n.li,{children:"Asynchronous execution not supported"}),"\n",(0,t.jsx)(n.li,{children:"Bookmarks not supported"}),"\n",(0,t.jsx)(n.li,{children:"Multiple active statements require multiple statement handles"}),"\n"]})]})}function S(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>c,x:()=>l});var i=r(96540);const t={},s=i.createContext(t);function c(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/0f12c4b6.a2cea451.js b/docs/ignite3/assets/js/0f12c4b6.a2cea451.js deleted file mode 100644 index 10956711c8..0000000000 --- a/docs/ignite3/assets/js/0f12c4b6.a2cea451.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6717],{11470:(e,n,t)=>{t.d(n,{A:()=>w});var o=t(96540),r=t(34164),s=t(17559),i=t(23104),a=t(56347),l=t(205),c=t(57485),d=t(31682),u=t(70679);function h(e){return o.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,o.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:o}})=>({value:e,label:n,attributes:t,default:o}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function b({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const t=(0,a.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(r),(0,o.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=p(e),[i,a]=(0,o.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!b({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s})),[c,d]=m({queryString:t,groupId:r}),[h,x]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,u.Dv)(n);return[t,(0,o.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),j=(()=>{const e=c??h;return b({value:e,tabValues:s})?e:null})();(0,l.A)(()=>{j&&a(j)},[j]);return{selectedValue:i,selectValue:(0,o.useCallback)(e=>{if(!b({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);a(e),d(e),x(e)},[d,x,s]),tabValues:s}}var j=t(92303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=t(74848);function f({className:e,block:n,selectedValue:t,selectValue:o,tabValues:s}){const a=[],{blockElementScrollPositionUntilNextRender:l}=(0,i.a_)(),c=e=>{const n=e.currentTarget,r=a.indexOf(n),i=s[r].value;i!==t&&(l(n),o(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:o})=>(0,y.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{a.push(e)},onKeyDown:d,onClick:c,...o,className:(0,r.A)("tabs__item",g.tabItem,o?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function N({lazy:e,children:n,selectedValue:t}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===t);return e?(0,o.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function v(e){const n=x(e);return(0,y.jsxs)("div",{className:(0,r.A)(s.G.tabs.container,"tabs-container",g.tabList),children:[(0,y.jsx)(f,{...n,...e}),(0,y.jsx)(N,{...n,...e})]})}function w(e){const n=(0,j.A)();return(0,y.jsx)(v,{...e,children:h(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>i});t(96540);var o=t(34164);const r={tabItem:"tabItem_Ymn6"};var s=t(74848);function i({children:e,hidden:n,className:t}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(96540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}},56728:(e,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/compute_job_statuses-53d7f77902c262ae8b36669ac7d8ef26.png"},71001:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"develop/work-with-data/compute","title":"Distributed Computing","description":"Apache Ignite lets you run your own code on the cluster in a distributed, balanced, and fault-tolerant way.","source":"@site/docs/develop/work-with-data/compute.md","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/compute","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/compute","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"compute","title":"Distributed Computing"},"sidebar":"tutorialSidebar","previous":{"title":"Streaming Data","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/streaming"},"next":{"title":"Object Serialization","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/serialization"}}');var r=t(74848),s=t(28453),i=t(11470),a=t(19365);const l={id:"compute",title:"Distributed Computing"},c=void 0,d={},u=[{value:"Compute Job Code Deployment",id:"compute-job-code-deployment",level:2},{value:"Configuring Jobs",id:"configuring-jobs",level:2},{value:"Job Target",id:"job-target",level:3},{value:"Job Descriptor",id:"job-descriptor",level:3},{value:"Deployment Unit Information",id:"deployment-unit-information",level:3},{value:"Executing Jobs",id:"executing-jobs",level:2},{value:"Single Node Execution",id:"single-node-execution",level:3},{value:"Multiple Node Execution",id:"multiple-node-execution",level:3},{value:"Colocated Execution",id:"colocated-execution",level:3},{value:"Using Qualified Table Names",id:"using-qualified-table-names",level:2},{value:".NET Compute Jobs",id:"net-compute-jobs",level:2},{value:".NET Compute Requirements",id:"net-compute-requirements",level:3},{value:"Implementing .NET Compute Jobs",id:"implementing-net-compute-jobs",level:3},{value:"Running .NET Compute Jobs",id:"running-net-compute-jobs",level:3},{value:"Job Ownership",id:"job-ownership",level:2},{value:"Job Execution States",id:"job-execution-states",level:2},{value:"Possible States and Transitions",id:"possible-states-and-transitions",level:3},{value:"Cancelling Executing Jobs",id:"cancelling-executing-jobs",level:3},{value:"Job Priority",id:"job-priority",level:3},{value:"Job Retries",id:"job-retries",level:3},{value:"Job Failover",id:"job-failover",level:2},{value:"Worker Node Shutdown",id:"worker-node-shutdown",level:3},{value:"Coordinator Node Shutdown",id:"coordinator-node-shutdown",level:3},{value:"Client Disconnect",id:"client-disconnect",level:3},{value:"MapReduce Tasks",id:"mapreduce-tasks",level:2},{value:"Understanding MapReduce Tasks",id:"understanding-mapreduce-tasks",level:3},{value:"Creating a Mapper Class",id:"creating-a-mapper-class",level:3},{value:"Executing a MapReduce Task",id:"executing-a-mapreduce-task",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"Apache Ignite lets you run your own code on the cluster in a distributed, balanced, and fault-tolerant way."}),"\n",(0,r.jsx)(n.p,{children:"Tasks can run on a single node, multiple nodes, or across the entire cluster, and you can choose between synchronous and asynchronous execution."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Apache Ignite compute engine now supports jobs implemented both in Java and in .NET. As .NET compute jobs require a bit of extra setup, see the ",(0,r.jsx)(n.a,{href:"#net-compute-jobs",children:".NET Compute Jobs"})," subsection for details."]})}),"\n",(0,r.jsxs)(n.p,{children:["In addition to standard compute tasks, Apache Ignite supports ",(0,r.jsx)(n.a,{href:"#colocated-execution",children:"Colocated Execution"}),". This means your tasks can run directly on the nodes that store the required data, reducing network overhead and improving performance.\r\nThe cluster also supports ",(0,r.jsx)(n.a,{href:"#mapreduce-tasks",children:"MapReduce Tasks"}),", allowing for efficient processing of large datasets. In this case, tasks will be executed on nodes that hold the data required for them."]}),"\n",(0,r.jsxs)(n.p,{children:["When sending code and data between nodes, objects are converted into a transferable format so they can be accurately rebuilt. Apache Ignite automatically handles marshalling for common types like tuples, POJOs, and native types, but for more complex or custom objects, you may need to implement your own ",(0,r.jsx)(n.a,{href:"./serialization",children:"marshalling"})," logic."]}),"\n",(0,r.jsx)(n.h2,{id:"compute-job-code-deployment",children:"Compute Job Code Deployment"}),"\n",(0,r.jsxs)(n.p,{children:["Before submitting your compute job, ensure that the required code is ",(0,r.jsx)(n.a,{href:"./code-deployment",children:"deployed"})," to the nodes where it will execute."]}),"\n",(0,r.jsxs)(n.p,{children:["If you are using ",(0,r.jsx)(n.a,{href:"/3.1.0/getting-started/embedded-mode",children:"embedded nodes"}),", any code that is included in the project classpath will also be available to your compute jobs."]}),"\n",(0,r.jsx)(n.h2,{id:"configuring-jobs",children:"Configuring Jobs"}),"\n",(0,r.jsxs)(n.p,{children:["In Apache Ignite, compute job's execution is defined by two key components: ",(0,r.jsx)(n.code,{children:"JobTarget"})," and ",(0,r.jsx)(n.code,{children:"JobDescriptor"}),". These components determine on which nodes the job will run and how it will be structured, including input and output types, marshallers, and the deployed class that represents the job."]}),"\n",(0,r.jsx)(n.h3,{id:"job-target",children:"Job Target"}),"\n",(0,r.jsxs)(n.p,{children:["Before submitting a job, you must create a ",(0,r.jsx)(n.code,{children:"JobTarget"})," object that specifies which nodes will execute the job. Job target can point to a specific node, any node on the cluster, or start a ",(0,r.jsx)(n.a,{href:"#colocated-execution",children:"colocated"})," compute job, that will be executed on nodes that hold a specific key. The following methods are available:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"JobTarget.anyNode()"})," - the job will be executed on any of the specified nodes."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"JobTarget.node()"})," - the job will be executed on the specific node."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"JobTarget.colocated()"})," - the job will be executed on a node that holds the specified key."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Use the ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget"})," object instead in case you want to execute a job across ",(0,r.jsx)(n.a,{href:"#multiple-node-execution",children:"multiple nodes"}),"."]})}),"\n",(0,r.jsx)(n.h3,{id:"job-descriptor",children:"Job Descriptor"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"JobDescriptor"})," object contains all the details required for job execution. The following arguments must be provided:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"The job descriptor is created using a builder that specifies the input type for the job arguments, the expected output type, and the fully qualified name of the job class to execute."}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"units"})," takes your deployment unit. You create it with the unit's name and specify ",(0,r.jsx)(n.code,{children:"Version.LATEST"})," so that your job always runs the most recently deployed version."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"resultClass"})," sets the expected result type so the system can correctly process the job's output."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"argumentMarshaller"})," and ",(0,r.jsx)(n.code,{children:"resultMarshaller"})," defines how to serialize the job's input argument and output result. For common types, you can omit the marshallers and pass ",(0,r.jsx)(n.code,{children:"null"})," to the builder since Apache Ignite automatically handles marshalling."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Examples below assumes that the ",(0,r.jsx)(n.code,{children:"NodeNameJob"})," class has been deployed to the node by using ",(0,r.jsx)(n.a,{href:"./code-deployment",children:"code deployment"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If you are working with common types, you don't need to define custom marshallers. Apache Ignite will handle them automatically. The following example shows a simpler job descriptor that uses built-in marshalling:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'String result = client.compute().execute(\r\n JobTarget.anyNode(client.cluster().nodes()),\r\n JobDescriptor.builder(WordPrintJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .resultClass(String.class)\r\n .build(),\r\n "Hello, Ignite!"\r\n);\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["This example shows how to create a custom job descriptor for a job that takes a user-defined ",(0,r.jsx)(n.code,{children:"MyJobArgument"}),", runs on a random cluster node, and returns a ",(0,r.jsx)(n.code,{children:"MyJobResult"})," object using custom marshallers:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'MyJobResult result = client.compute().execute(\r\n JobTarget.anyNode(client.cluster().nodes()),\r\n JobDescriptor.builder(WordPrintJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .resultClass(MyJobResult.class)\r\n .argumentMarshaller(new ArgMarshaller())\r\n .resultMarshaller(new ResultMarshaller())\r\n .build(),\r\n new MyJobArgument("Hello, Ignite!")\r\n);\n'})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"For more details on configuring jobs refer to the corresponding API section."}),"\n",(0,r.jsx)(n.h3,{id:"deployment-unit-information",children:"Deployment Unit Information"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"JobExecutionContext"})," object contains the information about the deployment units the job is using as a collection of ",(0,r.jsx)(n.code,{children:"DeploymentUnitInfo"})," for each deployment unit involved in the job."]}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.jsx)(n.code,{children:"DeploymentUnitInfo"})," object provides the following information:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"name()"})," - The name of the deployment unit"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"version()"})," - The version of the deployment unit"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"path()"})," - The filesystem path to the deployment unit contents"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public class DiagnosticJob implements ComputeJob {\r\n @Override\r\n public CompletableFuture executeAsync(JobExecutionContext context, Void input) {\r\n // Access deployment unit information\r\n String deploymentInfo = context.deploymentUnits().stream()\r\n .map(unit -> String.format("%s:%s at %s",\r\n unit.name(),\r\n unit.version(),\r\n unit.path()))\r\n .collect(Collectors.joining(", "));\r\n\r\n return CompletableFuture.completedFuture(deploymentInfo);\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"executing-jobs",children:"Executing Jobs"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite compute jobs can run on a specific node, any node, or using a colocated approach when job is executed on the node holding the relevant data key."}),"\n",(0,r.jsx)(n.h3,{id:"single-node-execution",children:"Single Node Execution"}),"\n",(0,r.jsx)(n.p,{children:"Often, you need to perform a job on one node in the cluster. In this case, there are multiple ways to start job execution:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"submitAsync()"})," - sends the job to the cluster and returns a future that will be completed with the ",(0,r.jsx)(n.code,{children:"JobExecution"})," object when the job is submitted for execution."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"executeAsync()"})," - sends the job to the cluster and returns a future that will be completed when job execution result is ready."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"execute()"})," - sends the job to the cluster and waits for the result of job execution."]}),"\n"]}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n) {\r\n\r\n System.out.println("\\nConfiguring compute job...");\r\n\r\n JobDescriptor job = JobDescriptor.builder(WordPrintJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n JobTarget jobTarget = JobTarget.anyNode(client.clusterNodes());\r\n\r\n\r\n for (String word : "Print words using runnable".split(" ")) {\r\n\r\n System.out.println("\\nExecuting compute job for word \'" + word + "\'...");\r\n\r\n client.compute().execute(jobTarget, job, word);\r\n }\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'ICompute compute = Client.Compute;\r\nIList nodes = await Client.GetClusterNodesAsync();\r\n\r\nIJobExecution execution = await compute.SubmitAsync(\r\nJobTarget.AnyNode(nodes),\r\nnew JobDescriptor("org.example.NodeNameJob"),\r\narg: "Hello");\r\n\r\nstring result = await execution.GetResultAsync();\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n.build();\r\n\r\njob_execution execution = comp.submit(job_target::any_node(nodes), job_desc, {std::string("Hello")}, {});\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"multiple-node-execution",children:"Multiple Node Execution"}),"\n",(0,r.jsxs)(n.p,{children:["To execute the compute task on multiple nodes, you use the same methods as for single node execution, except instead of creating a ",(0,r.jsx)(n.code,{children:"JobTarget"})," object to designate execution nodes you use the ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget"})," and specify the list of nodes that the job must be executed on."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget"})," object can specify the following:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"BroadcastJobTarget.nodes()"})," - the job will be executed on all nodes in the list."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"BroadcastJobTarget.table()"})," - the job will be executed on all nodes that hold partitions of the specified table."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"You can control what nodes the task is executed on by setting the list of nodes:"}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n) {\r\n\r\n System.out.println("\\nConfiguring compute job...");\r\n\r\n\r\n JobDescriptor job = JobDescriptor.builder(HelloMessageJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n BroadcastJobTarget target = BroadcastJobTarget.nodes(client.cluster().nodes());\r\n\r\n\r\n System.out.println("\\nExecuting compute job...");\r\n\r\n client.compute().execute(target, job, "John");\r\n\r\n System.out.println("\\nCompute job executed...");\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'ICompute compute = Client.Compute;\r\nIList nodes = await Client.GetClusterNodesAsync();\r\n\r\nIBroadcastExecution execution = await compute.SubmitBroadcastAsync(\r\nBroadcastJobTarget.Nodes(nodes),\r\nnew JobDescriptor("org.example.NodeNameJob"),\r\narg: "Hello");\r\n\r\nforeach (IJobExecution jobExecution in execution.JobExecutions)\r\n{\r\nstring jobResult = await jobExecution.GetResultAsync();\r\nConsole.WriteLine($"Job result from node {jobExecution.Node}: {jobResult}");\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n.build();\r\n\r\nbroadcast_execution execution = comp.submit_broadcast(broadcast_job_target::nodes(nodes), job_desc, {std::string("Hello")}, {});\r\nfor (auto &exec: execution.get_job_executions()) {\r\nstd::string result = exec.get_result()->get();\r\n}\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"colocated-execution",children:"Colocated Execution"}),"\n",(0,r.jsx)(n.p,{children:"In Apache Ignite, you can execute colocated computations by specifying a job target that directs the task to run on the node holding the required data."}),"\n",(0,r.jsxs)(n.p,{children:["In the example below, the job runs on the node that owns the partition for the row in the ",(0,r.jsx)(n.code,{children:"accounts"})," table identified by the primary key ",(0,r.jsx)(n.code,{children:"accountNumber"}),".\r\nWe pass the key both to ",(0,r.jsx)(n.code,{children:"JobTarget.colocated()"})," to select the node and as the\r\njob argument, so the job knows which record to read."]}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()) {\r\n\r\n System.out.println("\\nConfiguring compute job...");\r\n\r\n JobDescriptor job = JobDescriptor.builder(PrintAccountInfoJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n int accountNumber = ThreadLocalRandom.current().nextInt(ACCOUNTS_COUNT);\r\n\r\n JobTarget jobTarget = JobTarget.colocated("accounts", accountKey(accountNumber));\r\n client.compute().execute(jobTarget, job, accountNumber);\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'string table = "Person";\r\nstring key = "John";\r\n\r\nIJobExecution execution = await Client.Compute.SubmitAsync(\r\nJobTarget.Colocated(table, key),\r\nnew JobDescriptor("org.example.NodeNameJob"),\r\narg: "Hello");\r\n\r\nstring result = await execution.GetResultAsync();\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::string table{"Person"};\r\nstd::string key{"John"};\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n.build();\r\n\r\njob_execution execution = comp.submit(job_target::colocated(table, key), job_desc, {std::string("Hello")}, {});\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, you can execute the compute job on all nodes in the cluster that hold partitions for the specified table by creating a ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget.table()"})," target. In this case, Apache Ignite will automatically find all nodes that hold data partitions for the specified table and execute the job on all of them."]}),"\n",(0,r.jsx)(n.h2,{id:"using-qualified-table-names",children:"Using Qualified Table Names"}),"\n",(0,r.jsxs)(n.p,{children:["If you do not specify the table schema, the ",(0,r.jsx)(n.code,{children:"PUBLIC"})," schema will be used. To use a different schema, specify a fully qualified table name. You can provide it in a string or by creating the ",(0,r.jsx)(n.code,{children:"QualifiedName"})," object:"]}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'QualifiedName myTableName = QualifiedName.parse("PUBLIC.MY_QUALIFIED_TABLE");\r\nString executionResult = client.compute()\r\n.execute(\r\nJobTarget.colocated(myTableName, Tuple.create(Map.of("k", 1))),\r\nJobDescriptor.builder(NodeNameJob.class).build(),\r\nnull\r\n);\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.p,{children:"Not supported"})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.p,{children:"Not supported"})})]}),"\n",(0,r.jsxs)(n.p,{children:["Just like with execution on a single node, you can use the ",(0,r.jsx)(n.code,{children:"QualifiedName"})," object to specify a qualified table name and run a job on multiple nodes using ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget"}),":"]}),"\n",(0,r.jsx)(i.A,{children:(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'QualifiedName customSchemaTable = QualifiedName.parse("CUSTOM_SCHEMA.MY_QUALIFIED_TABLE");\r\n\r\nclient.compute().execute(BroadcastJobTarget.table(customSchemaTable), JobDescriptor.builder(HelloMessageJob.class).build(), null);\n'})})})}),"\n",(0,r.jsxs)(n.p,{children:["You can also use the ",(0,r.jsx)(n.code,{children:"of"})," method to instead specify the table name and the schema separately:"]}),"\n",(0,r.jsx)(i.A,{children:(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'QualifiedName customSchemaTableName = QualifiedName.of("PUBLIC", "MY_TABLE");\r\n\r\nclient.compute().execute(BroadcastJobTarget.table(customSchemaTableName), JobDescriptor.builder(HelloMessageJob.class).build(), null);\n'})})})}),"\n",(0,r.jsx)(n.p,{children:"The provided names must follow SQL syntax rules for identifiers:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:'Identifier must start from a character in the "Lu", "Ll", "Lt", "Lm", "Lo", or "Nl" Unicode categories;'}),"\n",(0,r.jsxs)(n.li,{children:["Identifier characters (except for the first one) may be ",(0,r.jsx)(n.code,{children:"U+00B7"})," (middle dot), ",(0,r.jsx)(n.code,{children:"U+0331"}),' (underscore), or any character in the "Mn", "Mc", "Nd", "Pc", or "Cf" Unicode categories;']}),"\n",(0,r.jsx)(n.li,{children:"Identifiers that contain any other characters must be quoted with double-quotes;"}),"\n",(0,r.jsx)(n.li,{children:"Double-quote inside the identifier must be 2 double-quote chars."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Any unquoted names will be cast to upper case. In this case, ",(0,r.jsx)(n.code,{children:"Person"})," and ",(0,r.jsx)(n.code,{children:"PERSON"})," names are equivalent. To avoid this, add escaped quotes around the name. For example, ",(0,r.jsx)(n.code,{children:'\\"Person\\"'})," will be encoded as a case-sensitive ",(0,r.jsx)(n.code,{children:"Person"})," name. If the name contains the ",(0,r.jsx)(n.code,{children:"U+2033"})," (double quote) symbol, it must be escaped as ",(0,r.jsx)(n.code,{children:'""'})," (2 double quote symbols)."]}),"\n",(0,r.jsx)(n.h2,{id:"net-compute-jobs",children:".NET Compute Jobs"}),"\n",(0,r.jsxs)(n.p,{children:["When working with compute jobs written in .NET, resulting binaries (DLL files) should be deployed to server nodes and invoked by the assembly-qualified type name. Every deployment unit combination is loaded into a separate ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/dependency-loading/understanding-assemblyloadcontext",children:"AssemblyLoadContext"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can have multiple versions of the same job (assembly) deployed to the cluster as Apache Ignite supports deployment unit isolation. One job can consist of multiple deployment units. Assemblies and types are looked up in the order you list them."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:[".NET compute jobs are executed in a separate process (",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/architecture/patterns/sidecar",children:"Sidecar"}),") on the server node. The process is started on the first .NET job call and then reused for subsequent jobs."]})}),"\n",(0,r.jsxs)(n.p,{children:["Compute job classes may implement ",(0,r.jsx)(n.code,{children:"IDisposable"})," and ",(0,r.jsx)(n.code,{children:"IAsyncDisposable"})," interfaces. Apache Ignite will call ",(0,r.jsx)(n.code,{children:"Dispose"})," or ",(0,r.jsx)(n.code,{children:"DisposeAsync"})," after job execution whether it succeeds or fails."]}),"\n",(0,r.jsx)(n.h3,{id:"net-compute-requirements",children:".NET Compute Requirements"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:".NET 8 Runtime or later (not SDK) is required on each server node."}),"\n",(0,r.jsx)(n.li,{children:"When using ZIP, DEB, RPM installation, you have to install .NET runtime yourself. Apache Ignite Docker image includes .NET 8 runtime, so you can run .NET jobs in Docker out of the box."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"implementing-net-compute-jobs",children:"Implementing .NET Compute Jobs"}),"\n",(0,r.jsx)(n.p,{children:"Below is an example on implementing a .NET compute job:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:['First, prepare a "class library" project for the job implementation using ',(0,r.jsx)(n.code,{children:"dotnet new classlib"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"In most cases, it is better to use a separate project for compute jobs to reduce deployment size."})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet new classlib -n MyComputeJobs\r\ncd MyComputeJobs\r\ndotnet add package Apache.Ignite\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Add a reference to ",(0,r.jsx)(n.code,{children:"Apache.Ignite"})," package to the class library project:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet add package Apache.Ignite\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Then create a class that implements ",(0,r.jsx)(n.code,{children:"IComputeJob"})," interface, for example:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'public class HelloJob : IComputeJob\r\n{\r\npublic ValueTask ExecuteAsync(IJobExecutionContext context, string arg, CancellationToken cancellationToken) =>\r\nValueTask.FromResult("Hello " + arg);\r\n}\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Publish the project by using the ",(0,r.jsx)(n.code,{children:"dotnet publish -c Release"})," command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet publish -c Release\r\nmkdir deploy\r\ncp bin/Release/net8.0/MyComputeJobs.dll deploy/\r\n# Exclude Ignite assemblies; no subdirectories allowed\r\nignite cluster unit deploy --name MyDotNetJobsUnit --path ./deploy\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Copy the resulting dll file and any extra dependencies to a separate directory, ",(0,r.jsx)(n.strong,{children:"excluding"})," Apache Ignite dlls."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"The directory with the dll must not contain any subdirectories."})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Use the Apache Ignite CLI command ",(0,r.jsx)(n.code,{children:"cluster unit deploy command"})," to ",(0,r.jsx)(n.a,{href:"./code-deployment",children:"deploy"})," the directory to the cluster as a deployment unit. The deployed code will be available on the cluster."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"running-net-compute-jobs",children:"Running .NET Compute Jobs"}),"\n",(0,r.jsxs)(n.p,{children:["You can execute .NET compute jobs from any client (.NET, Java, C++, etc) as long as you created a ",(0,r.jsx)(n.code,{children:"JobDescriptor"})," with the assembly-qualified job class name and set ",(0,r.jsx)(n.code,{children:"JobExecutionOptions"})," with ",(0,r.jsx)(n.code,{children:"JobExecutorType.DotNetSidecar"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"For example, this is how to run your job on a single node from .NET:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var jobTarget = JobTarget.AnyNode(await client.GetClusterNodesAsync());\r\nvar jobDesc = new JobDescriptor(\r\nJobClassName: typeof(HelloJob).AssemblyQualifiedName!,\r\nDeploymentUnits: [new DeploymentUnit("MyDeploymentUnit")],\r\nOptions: new JobExecutionOptions(ExecutorType: JobExecutorType.DotNetSidecar));\r\n\r\nIJobExecution jobExec = await client.Compute.SubmitAsync(jobTarget, jobDesc, "world");\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, use the ",(0,r.jsx)(n.code,{children:"JobDescriptor.Of"})," shortcut method to create a job descriptor from a job instance:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'JobDescriptor jobDesc = JobDescriptor.Of(new HelloJob())\r\nwith { DeploymentUnits = [new DeploymentUnit("MyDeploymentUnit")] };\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["You can call ",(0,r.jsx)(n.a,{href:"./compute",children:"Java computing jobs"})," from your .NET code, for example:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IList nodes = await client.GetClusterNodesAsync();\r\nIJobTarget> jobTarget = JobTarget.AnyNode(nodes);\r\n\r\nvar jobDesc = new JobDescriptor(JobClassName: "org.foo.bar.MyJob", DeploymentUnits: [new DeploymentUnit("MyDeploymentUnit")]);\r\n\r\nIJobExecution jobExecution = await client.Compute.SubmitAsync(jobTarget, jobDesc, "Job Arg");\r\n\r\nstring jobResult = await jobExecution.GetResultAsync();\n'})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"You can also run .NET compute jobs from Java client, for example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800")\r\n.build()\r\n) {\r\n\r\nJobDescriptor jobDesc = JobDescriptor.builder().jobClassName("MyNamespace.HelloJob, MyComputeJobsAssembly").deploymentUnits(new DeploymentUnit("MyDeploymentUnit")).executionOptions(new JobExecutionOptions().executorType(JobExecutorType.DotNetSidecar)).build();\r\n\r\nJobTarget jobTarget = JobTarget.anyNode(client.clusterNodes());\r\nfor (String word : "Print words using runnable".split(" ")) {\r\n\r\n System.out.println("\\nExecuting compute job for word \'" + word + "\'...");\r\n\r\n client.compute().execute(jobTarget, job, word);\r\n }\r\n}\n'})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"job-ownership",children:"Job Ownership"}),"\n",(0,r.jsxs)(n.p,{children:["If the cluster has ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-authentication",children:"Authentication"})," enabled, compute jobs are executed by a specific user. If user permissions are configured on the cluster, the user needs the appropriate ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-cluster-security",children:"distributed computing permissions"})," to work with distributed computing jobs. Only users with ",(0,r.jsx)(n.code,{children:"JOBS_ADMIN"})," action can interact with jobs of other users."]}),"\n",(0,r.jsx)(n.h2,{id:"job-execution-states",children:"Job Execution States"}),"\n",(0,r.jsx)(n.p,{children:"When using asynchronous API, you can keep track of the status of the job on the server and react to status changes. For example:"}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public static void example() throws ExecutionException, InterruptedException {\r\nIgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800").build();\r\n\r\nCompletableFuture> execution = client.compute().submitAsync(JobTarget.anyNode(client.cluster().nodes()), JobDescriptor.builder(WordPrintJob.class).build(), null);\r\n\r\nexecution.get().stateAsync().thenApply(state -> {\r\n if (state.status() == FAILED) {\r\n System.out.println("\\nJob failed...");\r\n }\r\n return null;\r\n });\r\n System.out.println(execution.resultAsync().get());\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IList nodes = await Client.GetClusterNodesAsync();\r\n\r\nIJobExecution execution = await Client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(nodes),\r\n new JobDescriptor("org.example.NodeNameJob"),\r\n arg: "Hello");\r\n\r\nJobState? state = await execution.GetStateAsync();\r\n\r\nif (state?.Status == JobStatus.Failed)\r\n{\r\n // Handle failure\r\n}\r\n\r\nstring result = await execution.GetResultAsync();\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n\t.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n\t.build();\r\n\r\njob_execution execution = comp.submit(job_target::any_node(nodes), job_desc, {std::string("Hello")}, {});\r\n\r\nstd::optional status = execution.get_status();\r\nif (status && status->state == job_state::FAILED)\r\n{\r\n // Handle failure\r\n}\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"possible-states-and-transitions",children:"Possible States and Transitions"}),"\n",(0,r.jsx)(n.p,{children:"The diagram below depicts the possible transitions of job statuses:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Compute Job Statuses",src:t(56728).A+"",width:"1659",height:"728"})}),"\n",(0,r.jsx)(n.p,{children:"The table below lists the possible job statuses:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Status"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Transitions to"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Queued"})}),(0,r.jsx)(n.td,{children:"The job was added to the queue and is waiting for execution."}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"Executing"}),", ",(0,r.jsx)(n.code,{children:"Canceled"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Executing"})}),(0,r.jsx)(n.td,{children:"The job is being executed."}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"Canceling"}),", ",(0,r.jsx)(n.code,{children:"Completed"}),", ",(0,r.jsx)(n.code,{children:"Queued"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Completed"})}),(0,r.jsx)(n.td,{children:"The job was executed successfully and the execution result was returned."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Failed"})}),(0,r.jsx)(n.td,{children:"The job was unexpectedly terminated during execution."}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Queued"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Canceling"})}),(0,r.jsx)(n.td,{children:"Job has received the cancel command, but is still running."}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"Completed"}),", ",(0,r.jsx)(n.code,{children:"Canceled"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Canceled"})}),(0,r.jsx)(n.td,{children:"Job was successfully cancelled."}),(0,r.jsx)(n.td,{})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["If all job execution threads are busy, new jobs received by the node are put into job queue according to their ",(0,r.jsx)(n.a,{href:"#job-priority",children:"Job Priority"}),". Apache Ignite sorts all incoming jobs first by priority, then by the time, executing jobs queued earlier first."]}),"\n",(0,r.jsx)(n.h3,{id:"cancelling-executing-jobs",children:"Cancelling Executing Jobs"}),"\n",(0,r.jsxs)(n.p,{children:["When the node receives the command to cancel the job in the ",(0,r.jsx)(n.code,{children:"Executing"})," status, it will immediately send an interrupt to the thread that is responsible for the job. In most cases, this will lead to the job being immediately canceled, however there are cases in which the job will continue. If this happens, the job will be in the ",(0,r.jsx)(n.code,{children:"Canceling"})," state. Depending on specific code being executed, the job may complete successfully, be canceled once the uninterruptible operation is finished, or remain in unfinished state (for example, if code is stuck in a loop). You can use the ",(0,r.jsx)(n.code,{children:"JobExecution.stateAsync()"})," method to keep track of what status the job is in, and react to status change."]}),"\n",(0,r.jsx)(n.p,{children:"To be able to cancel a compute job, you first create a cancel handler and retrieve a token from it. You can then use this token to cancel the compute job:"}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"CancelHandle cancelHandle = CancelHandle.create();\r\nCancellationToken cancelToken = cancelHandle.token();\r\n\r\nCompletableFuture execution = client.compute().executeAsync(JobTarget.anyNode(client.clusterNodes()), JobDescriptor.builder(NodeNameJob.class).build(), cancelToken, null);\r\n\r\ncancelHandle.cancel();\n"})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"var cts = new CancellationTokenSource();\r\nCancellationToken cancelToken = cts.Token;\r\n\r\nvar execution = client.Compute.ExecuteAsync(\r\nJobTarget.AnyNode(await client.GetClusterNodesAsync()),\r\nnew JobDescriptor(typeof(NodeNameJob)),\r\ncancelToken);\r\n\r\ncts.Cancel();\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Another way to cancel jobs is by using the SQL ",(0,r.jsx)(n.a,{href:"/3.1.0/sql/reference/data-types-and-functions/operational-commands#kill-compute",children:"KILL COMPUTE"})," command. The job id can be retrieved via the ",(0,r.jsx)(n.code,{children:"COMPUTE_JOBS"})," ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/monitoring/metrics-system-views",children:"system view"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"job-priority",children:"Job Priority"}),"\n",(0,r.jsxs)(n.p,{children:["You can specify a job priority by setting the ",(0,r.jsx)(n.code,{children:"JobExecutionOptions.priority"})," property. Jobs with a higher priority will be queued before jobs with lower priority (for example, a job with priority 4 will be executed before the job with priority 2)."]}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public static void example() throws ExecutionException, InterruptedException {\r\ntry (IgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800").build()) {\r\n\r\n // Create job execution options\r\n JobExecutionOptions options = JobExecutionOptions.builder().priority(1).build();\r\n\r\n String executionResult = client.compute().execute(JobTarget.anyNode(client.cluster().nodes()),\r\n JobDescriptor.builder(HighPriorityJob.class).options(options).build(), null\r\n );\r\n\r\n System.out.println(executionResult);\r\n }\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var options = JobExecutionOptions.Default with { Priority = 1 };\r\n\r\nIJobExecution execution = await Client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(await Client.GetClusterNodesAsync()),\r\n new JobDescriptor("org.example.NodeNameJob", Options: options),\r\n arg: "Hello");\r\n\r\nstring result = await execution.GetResultAsync();\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n\t.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n\t.build();\r\n\r\njob_execution_options options{1, 0};\r\njob_execution execution = comp.submit(job_target::any_node(nodes), job_desc, {std::string("Hello")}, std::move(options));\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"job-retries",children:"Job Retries"}),"\n",(0,r.jsxs)(n.p,{children:["You can set the number the job will be retried on failure by setting the ",(0,r.jsx)(n.code,{children:"JobExecutionOptions.maxRetries"})," property. If set, the failed job will be retried the specified number of times before moving to ",(0,r.jsx)(n.code,{children:"Failed"})," state."]}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public static void example() throws ExecutionException, InterruptedException {\r\ntry (IgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800").build()) {\r\n\r\n // Create job execution options with maxRetries set to 5.\r\n JobExecutionOptions options = JobExecutionOptions.builder()\r\n .maxRetries(5)\r\n .build();\r\n\r\n String executionResult = client.compute().execute(JobTarget.anyNode(client.clusterNodes()),\r\n JobDescriptor.builder(NodeNameJob.class).options(options).build(), null\r\n );\r\n\r\n System.out.println(executionResult);\r\n }\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var options = JobExecutionOptions.Default with { MaxRetries = 5 };\r\n\r\nIJobExecution execution = await Client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(await Client.GetClusterNodesAsync()),\r\n new JobDescriptor("org.example.NodeNameJob", Options: options),\r\n arg: "Hello");\r\n\r\nstring result = await execution.GetResultAsync();\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nstd::vector units{deployment_unit{"unitName", "1.1.1"}};\r\n\r\njob_execution_options options{0, 5};\r\njob_execution execution = comp.submit(nodes, units, NODE_NAME_JOB, {std::string("Hello")}, std::move(options));\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsx)(n.h2,{id:"job-failover",children:"Job Failover"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite implements mechanics to handle issues that happen during job execution. The following situations are handled:"}),"\n",(0,r.jsx)(n.h3,{id:"worker-node-shutdown",children:"Worker Node Shutdown"}),"\n",(0,r.jsx)(n.p,{children:"If the worker node is shut down, the coordinator node will redistribute all jobs assigned to worker to other viable nodes. If no nodes are found, the job will fail and an exception will be sent to the client."}),"\n",(0,r.jsx)(n.h3,{id:"coordinator-node-shutdown",children:"Coordinator Node Shutdown"}),"\n",(0,r.jsxs)(n.p,{children:["If the coordinator node shuts down, all jobs will be cancelled as soon as the node detects that the coordinator is shut down. Note that ",(0,r.jsx)(n.a,{href:"#cancelling-executing-jobs",children:"some jobs"})," may take a long time to cancel."]}),"\n",(0,r.jsx)(n.h3,{id:"client-disconnect",children:"Client Disconnect"}),"\n",(0,r.jsxs)(n.p,{children:["If the client disconnects, all jobs will be cancelled as soon as the coordinator node detects the disconnect. Note that ",(0,r.jsx)(n.a,{href:"#cancelling-executing-jobs",children:"some jobs"})," may take a long time to cancel."]}),"\n",(0,r.jsx)(n.h2,{id:"mapreduce-tasks",children:"MapReduce Tasks"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite provides an API for performing MapReduce operations in the cluster. This allows you to split your computing task between multiple nodes before aggregating the result and returning it to the user."}),"\n",(0,r.jsx)(n.h3,{id:"understanding-mapreduce-tasks",children:"Understanding MapReduce Tasks"}),"\n",(0,r.jsxs)(n.p,{children:["A MapReduce task must be executed on a node that has a ",(0,r.jsx)(n.a,{href:"./code-deployment",children:"deployed"})," class implementing the ",(0,r.jsx)(n.code,{children:"MapReduceTask"})," interface. This interface provides a way to implement custom map and reduce logic. A node that receives the task becomes a coordinator node, that will be responsible for both mapping tasks to other nodes, reducing their results and returning the final result to the client."]}),"\n",(0,r.jsxs)(n.p,{children:["The class must implement two methods: ",(0,r.jsx)(n.code,{children:"splitAsync"})," and ",(0,r.jsx)(n.code,{children:"reduceAsync"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"splitAsync()"})," method should be implemented to create compute jobs based on input parameters and map them to worker nodes. The method receives the execution context and your task arguments and returns a completable future containing the list of the job descriptors that will be sent to the worker nodes."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"reduceAsync()"})," method is called during the reduce step, when all the jobs have completed. The method receives a map from the worker node to the completed job result and returns the final result of the computation."]}),"\n",(0,r.jsx)(n.h3,{id:"creating-a-mapper-class",children:"Creating a Mapper Class"}),"\n",(0,r.jsxs)(n.p,{children:["All MapReduce jobs must be submitted to a node that has an appropriate class ",(0,r.jsx)(n.a,{href:"./code-deployment",children:"deployed"}),". Below is an example of a map reduce job:"]}),"\n",(0,r.jsx)(i.A,{children:(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public static class PhraseWordLengthCountMapReduceTask implements MapReduceTask {\r\n /** {@inheritDoc} */\r\n @Override\r\n public CompletableFuture>> splitAsync(\r\n TaskExecutionContext taskContext,\r\n String input) {\r\n assert input != null;\r\n\r\n var job = JobDescriptor.builder(WordLengthJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n List> jobs = new ArrayList<>();\r\n\r\n for (String word : input.split(" ")) {\r\n jobs.add(\r\n MapReduceJob.builder()\r\n .jobDescriptor(job)\r\n .nodes(taskContext.ignite().cluster().nodes())\r\n .args(word)\r\n .build()\r\n );\r\n }\r\n\r\n return completedFuture(jobs);\r\n }\r\n\r\n /** {@inheritDoc} */\r\n @Override\r\n public CompletableFuture reduceAsync(TaskExecutionContext taskContext, Map results) {\r\n return completedFuture(results.values().stream()\r\n .reduce(Integer::sum)\r\n .orElseThrow());\r\n }\r\n}\n'})})})}),"\n",(0,r.jsx)(n.h3,{id:"executing-a-mapreduce-task",children:"Executing a MapReduce Task"}),"\n",(0,r.jsx)(n.p,{children:"To execute the MapReduce task, you use one of the following methods:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"submitMapReduce()"})," - sends the MapReduce job to the cluster and returns the ",(0,r.jsx)(n.code,{children:"TaskExecution"})," object that can be used to monitor or modify the compute task execution."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"executeMapReduceAsync()"})," - sends the MapReduce job to the cluster in the cluster and gets the future for job execution results."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"executeMapReduce()"})," - sends the job to the cluster and waits for the result of job execution."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["The node that the MapReduce task is sent to must have a class implementing the ",(0,r.jsx)(n.code,{children:"MapReduceTask"})," interface."]}),"\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800").build()) {\r\n\r\n System.out.println("\\nConfiguring map reduce task...");\r\n\r\n\r\n TaskDescriptor taskDescriptor = TaskDescriptor.builder(PhraseWordLengthCountMapReduceTask.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n\r\n System.out.println("\\nExecuting map reduce task...");\r\n\r\n String phrase = "Count characters using map reduce";\r\n\r\n Integer result = client.compute().executeMapReduce(taskDescriptor, phrase);\r\n\r\n\r\n System.out.println("\\nTotal number of characters in the words is \'" + result + "\'.");\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'ICompute compute = Client.Compute;\r\nvar taskDescriptor = new TaskDescriptor("com.example.MapReduceNodeNameTask");\r\nITaskExecution exec = await compute.SubmitMapReduceAsync(taskDescriptor, "arg");\r\nstring result = await exec.GetResultAsync();\r\nConsole.WriteLine(result);\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.p,{children:"Not supported"})})]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/10d5c8a2.10332024.js b/docs/ignite3/assets/js/10d5c8a2.10332024.js deleted file mode 100644 index 7a741a299d..0000000000 --- a/docs/ignite3/assets/js/10d5c8a2.10332024.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9589],{20490:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>g,frontMatter:()=>s,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configure-and-operate/configuration/config-storage-rocksdb","title":"RocksDB Storage","description":"RocksDB is a persistent storage engine based on an LSM tree. It is best used in environments with a large number of write requests.","source":"@site/docs/configure-and-operate/configuration/storage-rocksdb.md","sourceDirName":"configure-and-operate/configuration","slug":"/configure-and-operate/configuration/config-storage-rocksdb","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"config-storage-rocksdb","title":"RocksDB Storage","sidebar_label":"RocksDB Storage"},"sidebar":"tutorialSidebar","previous":{"title":"Persistent Storage","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent"},"next":{"title":"Authentication","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication"}}');var o=t(74848),i=t(28453);const s={id:"config-storage-rocksdb",title:"RocksDB Storage",sidebar_label:"RocksDB Storage"},a=void 0,c={},d=[{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Configuration Example",id:"configuration-example",level:2}];function l(e){const n={code:"code",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"RocksDB is a persistent storage engine based on an LSM tree. It is best used in environments with a large number of write requests."}),"\n",(0,o.jsx)(n.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,o.jsx)(n.p,{children:"Each Apache Ignite storage engine can have several storage profiles. Each profile has the following properties:"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Default"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"engine"}),(0,o.jsx)(n.td,{}),(0,o.jsx)(n.td,{children:"The name of the storage engine."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"sizeBytes"}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"256 * 1024 * 1024"})}),(0,o.jsx)(n.td,{children:"Sets the space allocated to the storage profile, in bytes."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"writeBufferSizeBytes"}),(0,o.jsx)(n.td,{children:(0,o.jsx)(n.code,{children:"64 * 1024 * 1024"})}),(0,o.jsx)(n.td,{children:"Size of rocksdb write buffer."})]})]})]}),"\n",(0,o.jsx)(n.h2,{id:"configuration-example",children:"Configuration Example"}),"\n",(0,o.jsxs)(n.p,{children:['In Apache Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,o.jsx)(n.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node. The example below shows how to configure a storage profile with RocksDB storage:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "storage" : {\r\n "profiles" : [\r\n {\r\n "name" : "rocks_profile",\r\n "engine" : "rocksDb",\r\n "sizeBytes" : 2560000\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["You can then use the profile (in this case, ",(0,o.jsx)(n.code,{children:"rocks_profile"}),") in your distribution zone configuration."]})]})}function g(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var r=t(96540);const o={},i=r.createContext(o);function s(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/148ac273.faf51ddf.js b/docs/ignite3/assets/js/148ac273.faf51ddf.js deleted file mode 100644 index 3a5e56b96a..0000000000 --- a/docs/ignite3/assets/js/148ac273.faf51ddf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1824],{28453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>c});var l=s(96540);const i={},r=l.createContext(i);function a(e){const n=l.useContext(r);return l.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),l.createElement(r.Provider,{value:n},e.children)}},97674:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>t,contentTitle:()=>c,default:()=>o,frontMatter:()=>a,metadata:()=>l,toc:()=>d});const l=JSON.parse('{"id":"sql-reference/operators-and-functions","title":"Supported Operators and Functions","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-reference/operators-and-functions.md","sourceDirName":"sql-reference","slug":"/sql-reference/operators-and-functions","permalink":"/docs/ignite3/3.0.0/sql-reference/operators-and-functions","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Supported Operators and Functions","sidebar_label":"Operators and Functions"},"sidebar":"tutorialSidebar","previous":{"title":"Data Types","permalink":"/docs/ignite3/3.0.0/sql-reference/data-types"},"next":{"title":"Operational Commands","permalink":"/docs/ignite3/3.0.0/sql-reference/operational-commands"}}');var i=s(74848),r=s(28453);const a={title:"Supported Operators and Functions",sidebar_label:"Operators and Functions"},c=void 0,t={},d=[{value:"Aggregate Functions",id:"aggregate-functions",level:2},{value:"AVG",id:"avg",level:3},{value:"COUNT",id:"count",level:3},{value:"MAX",id:"max",level:3},{value:"MIN",id:"min",level:3},{value:"SUM",id:"sum",level:3},{value:"ANY_VALUE",id:"any_value",level:3},{value:"EVERY",id:"every",level:3},{value:"SOME",id:"some",level:3},{value:"GROUPING",id:"grouping",level:3},{value:"JSON Functions",id:"json-functions",level:2},{value:"JSON_TYPE",id:"json_type",level:3},{value:"FORMAT JSON",id:"format-json",level:3},{value:"JSON_VALUE",id:"json_value",level:3},{value:"JSON_QUERY",id:"json_query",level:3},{value:"JSON_TYPE",id:"json_type-1",level:3},{value:"JSON_EXISTS",id:"json_exists",level:3},{value:"JSON_DEPTH",id:"json_depth",level:3},{value:"JSON_KEYS",id:"json_keys",level:3},{value:"JSON_PRETTY",id:"json_pretty",level:3},{value:"JSON_LENGTH",id:"json_length",level:3},{value:"JSON_REMOVE",id:"json_remove",level:3},{value:"JSON_STORAGE_SIZE",id:"json_storage_size",level:3},{value:"JSON_OBJECT",id:"json_object",level:3},{value:"JSON_ARRAY",id:"json_array",level:3},{value:"IS JSON VALUE",id:"is-json-value",level:3},{value:"IS JSON OBJECT",id:"is-json-object",level:3},{value:"IS JSON ARRAY",id:"is-json-array",level:3},{value:"IS JSON SCALAR",id:"is-json-scalar",level:3},{value:"Regular Expression Functions",id:"regular-expression-functions",level:2},{value:"POSIX REGEX CASE INSENSITIVE",id:"posix-regex-case-insensitive",level:3},{value:"POSIX REGEX CASE SENSITIVE",id:"posix-regex-case-sensitive",level:3},{value:"REGEXP_REPLACE",id:"regexp_replace",level:3},{value:"Numeric Functions",id:"numeric-functions",level:2},{value:"MOD",id:"mod",level:3},{value:"EXP",id:"exp",level:3},{value:"POWER",id:"power",level:3},{value:"LN",id:"ln",level:3},{value:"LOG10",id:"log10",level:3},{value:"ABS",id:"abs",level:3},{value:"RAND",id:"rand",level:3},{value:"RAND_INTEGER",id:"rand_integer",level:3},{value:"ACOS",id:"acos",level:3},{value:"ASIN",id:"asin",level:3},{value:"ATAN",id:"atan",level:3},{value:"ATAN2",id:"atan2",level:3},{value:"SQRT",id:"sqrt",level:3},{value:"CBRT",id:"cbrt",level:3},{value:"COS",id:"cos",level:3},{value:"COSH",id:"cosh",level:3},{value:"COT",id:"cot",level:3},{value:"DEGREES",id:"degrees",level:3},{value:"RADIANS",id:"radians",level:3},{value:"ROUND",id:"round",level:3},{value:"SIGN",id:"sign",level:3},{value:"SIN",id:"sin",level:3},{value:"SINH",id:"sinh",level:3},{value:"TAN",id:"tan",level:3},{value:"TANH",id:"tanh",level:3},{value:"TRUNCATE",id:"truncate",level:3},{value:"PI",id:"pi",level:3},{value:"String Functions",id:"string-functions",level:2},{value:"UPPER",id:"upper",level:3},{value:"LOWER",id:"lower",level:3},{value:"INITCAP",id:"initcap",level:3},{value:"TO_BASE64",id:"to_base64",level:3},{value:"FROM_BASE64",id:"from_base64",level:3},{value:"MD5",id:"md5",level:3},{value:"SHA1",id:"sha1",level:3},{value:"SUBSTRING",id:"substring",level:3},{value:"LEFT",id:"left",level:3},{value:"RIGHT",id:"right",level:3},{value:"REPLACE",id:"replace",level:3},{value:"TRANSLATE",id:"translate",level:3},{value:"CHR",id:"chr",level:3},{value:"CHAR_LENGTH",id:"char_length",level:3},{value:"CHARACTER_LENGTH",id:"character_length",level:3},{value:"||",id:"",level:3},{value:"CONCAT",id:"concat",level:3},{value:"OVERLAY",id:"overlay",level:3},{value:"POSITION",id:"position",level:3},{value:"ASCII",id:"ascii",level:3},{value:"REPEAT",id:"repeat",level:3},{value:"SPACE",id:"space",level:3},{value:"STRCMP",id:"strcmp",level:3},{value:"SOUNDEX",id:"soundex",level:3},{value:"DIFFERENCE",id:"difference",level:3},{value:"REVERSE",id:"reverse",level:3},{value:"TRIM",id:"trim",level:3},{value:"LTRIM",id:"ltrim",level:3},{value:"RTRIM",id:"rtrim",level:3},{value:"SUBSTR",id:"substr",level:3},{value:"LENGTH",id:"length",level:3},{value:"OCTET_LENGTH",id:"octet_length",level:3},{value:"LIKE",id:"like",level:3},{value:"SIMILAR TO",id:"similar-to",level:3},{value:"Date/Time Functions",id:"datetime-functions",level:2},{value:"EXTRACT",id:"extract",level:3},{value:"FLOOR",id:"floor",level:3},{value:"CEIL",id:"ceil",level:3},{value:"TIMESTAMPDIFF",id:"timestampdiff",level:3},{value:"LAST_DAY",id:"last_day",level:3},{value:"DAYNAME",id:"dayname",level:3},{value:"MONTHNAME",id:"monthname",level:3},{value:"DAYOFMONTH",id:"dayofmonth",level:3},{value:"DAYOFWEEK",id:"dayofweek",level:3},{value:"DAYOFYEAR",id:"dayofyear",level:3},{value:"YEAR",id:"year",level:3},{value:"QUARTER",id:"quarter",level:3},{value:"MONTH",id:"month",level:3},{value:"WEEK",id:"week",level:3},{value:"HOUR",id:"hour",level:3},{value:"MINUTE",id:"minute",level:3},{value:"SECOND",id:"second",level:3},{value:"TIMESTAMP_SECONDS",id:"timestamp_seconds",level:3},{value:"TIMESTAMP_MILLIS",id:"timestamp_millis",level:3},{value:"TIMESTAMP_MICROS",id:"timestamp_micros",level:3},{value:"UNIX_SECONDS",id:"unix_seconds",level:3},{value:"UNIX_MILLIS",id:"unix_millis",level:3},{value:"UNIX_MICROS",id:"unix_micros",level:3},{value:"UNIX_DATE",id:"unix_date",level:3},{value:"DATE_FROM_UNIX_DATE",id:"date_from_unix_date",level:3},{value:"DATE",id:"date",level:3},{value:"CURRENT_TIMESTAMP",id:"current_timestamp",level:3},{value:"CURRENT_DATE",id:"current_date",level:3},{value:"LOCALTIME",id:"localtime",level:3},{value:"LOCALTIMESTAMP",id:"localtimestamp",level:3},{value:"Other Functions",id:"other-functions",level:2},{value:"CAST",id:"cast",level:3},{value:"COALESCE",id:"coalesce",level:3},{value:"GREATEST",id:"greatest",level:3},{value:"NULLIF",id:"nullif",level:3},{value:"NVL",id:"nvl",level:3},{value:"CASE",id:"case",level:3},{value:"DECODE",id:"decode",level:3},{value:"LEAST",id:"least",level:3},{value:"COMPRESS",id:"compress",level:3},{value:"TYPEOF",id:"typeof",level:3},{value:"RAND_UUID",id:"rand_uuid",level:3},{value:"SYSTEM_RANGE",id:"system_range",level:3},{value:"Security Functions",id:"security-functions",level:2},{value:"CURRENT_USER",id:"current_user",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["For more information on functions supported by Apache Calcite, see the ",(0,i.jsx)(n.a,{href:"https://calcite.apache.org/docs/reference.html#operators-and-functions",children:"product documentation"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"aggregate-functions",children:"Aggregate Functions"}),"\n",(0,i.jsx)(n.h3,{id:"avg",children:"AVG"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"AVG( [ ALL | DISTINCT ] numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the average (arithmetic mean) of numeric across all input values. When used, the type of data will be changed in the following way:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Input type"}),(0,i.jsx)(n.th,{children:"Result type"}),(0,i.jsx)(n.th,{children:"Minimum scale"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"DECIMAL"}),", ",(0,i.jsx)(n.code,{children:"BIGINT"}),", ",(0,i.jsx)(n.code,{children:"INTEGER"}),", ",(0,i.jsx)(n.code,{children:"SMALLINT"}),", ",(0,i.jsx)(n.code,{children:"TINYINT"})]}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"DECIMAL"})}),(0,i.jsx)(n.td,{children:"16"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"DOUBLE"}),", ",(0,i.jsx)(n.code,{children:"REAL"})]}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"DOUBLE"})}),(0,i.jsx)(n.td,{})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"count",children:"COUNT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COUNT( [ ALL | DISTINCT ] value [, value ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of input rows for which value is not null (wholly not null if value is composite)."}),"\n",(0,i.jsx)(n.h3,{id:"max",children:"MAX"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MAX( [ ALL | DISTINCT ] value)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the maximum value across all input values."}),"\n",(0,i.jsx)(n.h3,{id:"min",children:"MIN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MIN( [ ALL | DISTINCT ] value)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the minimum value across all input values."}),"\n",(0,i.jsx)(n.h3,{id:"sum",children:"SUM"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUM( [ ALL | DISTINCT ] numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the sum of numeric across all input values."}),"\n",(0,i.jsx)(n.h3,{id:"any_value",children:"ANY_VALUE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ANY_VALUE( [ ALL | DISTINCT ] value)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns one of the values of value across all input values; this is NOT specified in the SQL standard."}),"\n",(0,i.jsx)(n.h3,{id:"every",children:"EVERY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EVERY(condition)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns TRUE if all of the values of condition are TRUE."}),"\n",(0,i.jsx)(n.h3,{id:"some",children:"SOME"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SOME(condition)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns TRUE if one or more of the values of condition is TRUE."}),"\n",(0,i.jsx)(n.h3,{id:"grouping",children:"GROUPING"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"GROUPING(column_reference [,column_reference])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a bit vector of the given grouping expressions."}),"\n",(0,i.jsx)(n.h2,{id:"json-functions",children:"JSON Functions"}),"\n",(0,i.jsx)(n.h3,{id:"json_type",children:"JSON_TYPE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_TYPE(jsonValue)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a string value indicating the type of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"format-json",children:"FORMAT JSON"}),"\n",(0,i.jsx)(n.p,{children:"Indicates that the value is formatted as JSON."}),"\n",(0,i.jsx)(n.h3,{id:"json_value",children:"JSON_VALUE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_VALUE(jsonValue, path [ RETURNING type ] [ { ERROR | NULL | DEFAULT expr } ON EMPTY ] [ { ERROR | NULL | DEFAULT expr } ON ERROR ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extract an SQL scalar from a jsonValue using JSON path expression path."}),"\n",(0,i.jsx)(n.h3,{id:"json_query",children:"JSON_QUERY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_QUERY(jsonValue, path [ RETURNING type ] [ { WITHOUT [ ARRAY ] | WITH [ CONDITIONAL | UNCONDITIONAL ] [ ARRAY ] } WRAPPER ] [ { ERROR | NULL | EMPTY ARRAY | EMPTY OBJECT } ON EMPTY ] [ { ERROR | NULL | EMPTY ARRAY | EMPTY OBJECT } ON ERROR ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extract a JSON object or JSON array from jsonValue using the path JSON path expression."}),"\n",(0,i.jsx)(n.h3,{id:"json_type-1",children:"JSON_TYPE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_TYPE(jsonValue)\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Returns a string value indicating the type of ",(0,i.jsx)(n.code,{children:"jsonValue"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"json_exists",children:"JSON_EXISTS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_EXISTS(jsonValue, path [ { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether a jsonValue satisfies a search criterion described using JSON path expression path."}),"\n",(0,i.jsx)(n.h3,{id:"json_depth",children:"JSON_DEPTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_DEPTH(jsonValue)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns an integer value indicating the depth of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_keys",children:"JSON_KEYS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_KEYS(jsonValue [, path ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a string indicating the keys of a JSON jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_pretty",children:"JSON_PRETTY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_PRETTY(jsonValue)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a pretty-printing of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_length",children:"JSON_LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_LENGTH(jsonValue [, path ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a integer indicating the length of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_remove",children:"JSON_REMOVE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_REMOVE(jsonValue, path [, path ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Removes data from jsonValue using a series of path expressions and returns the result."}),"\n",(0,i.jsx)(n.h3,{id:"json_storage_size",children:"JSON_STORAGE_SIZE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_STORAGE_SIZE(jsonValue)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of bytes used to store the binary representation of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_object",children:"JSON_OBJECT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_OBJECT( jsonKeyVal [, jsonKeyVal ]* [ nullBehavior ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Construct JSON object using a series of key-value pairs."}),"\n",(0,i.jsx)(n.h3,{id:"json_array",children:"JSON_ARRAY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_ARRAY( [ jsonVal [, jsonVal ]* ] [ nullBehavior ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Construct a JSON array using a series of values."}),"\n",(0,i.jsx)(n.h3,{id:"is-json-value",children:"IS JSON VALUE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"jsonValue IS JSON [ VALUE ]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether jsonValue is a JSON value."}),"\n",(0,i.jsx)(n.h3,{id:"is-json-object",children:"IS JSON OBJECT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"jsonValue IS JSON OBJECT\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether jsonValue is a JSON object."}),"\n",(0,i.jsx)(n.h3,{id:"is-json-array",children:"IS JSON ARRAY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"jsonValue IS JSON ARRAY\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether jsonValue is a JSON array."}),"\n",(0,i.jsx)(n.h3,{id:"is-json-scalar",children:"IS JSON SCALAR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"jsonValue IS JSON SCALAR\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether jsonValue is a JSON scalar value."}),"\n",(0,i.jsx)(n.h2,{id:"regular-expression-functions",children:"Regular Expression Functions"}),"\n",(0,i.jsx)(n.h3,{id:"posix-regex-case-insensitive",children:"POSIX REGEX CASE INSENSITIVE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"value 1 POSIX REGEX CASE INSENSITIVE value 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"Case-sensitive POSIX regular expression."}),"\n",(0,i.jsx)(n.h3,{id:"posix-regex-case-sensitive",children:"POSIX REGEX CASE SENSITIVE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"value 1 POSIX REGEX CASE SENSITIVE value 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"Case-sensitive POSIX regular expression."}),"\n",(0,i.jsx)(n.h3,{id:"regexp_replace",children:"REGEXP_REPLACE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REGEXP_REPLACE(string, regexp, rep [, pos [, occurrence [, matchType]]])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces all substrings of string that match regexp with rep at the starting pos in expr (if omitted, the default is 1), occurrence specifies which occurrence of a match to search for (if omitted, the default is 1), matchType specifies how to perform matching"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REGEXP_REPLACE(string, regexp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces all substrings of value that match regexp with an empty string and returns modified value."}),"\n",(0,i.jsx)(n.h2,{id:"numeric-functions",children:"Numeric Functions"}),"\n",(0,i.jsx)(n.h3,{id:"mod",children:"MOD"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MOD(numeric1, numeric2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the remainder (modulus) of numeric1 divided by numeric2. The result is negative only if numeric1 is negative."}),"\n",(0,i.jsx)(n.h3,{id:"exp",children:"EXP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXP(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns e raised to the power of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"power",children:"POWER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POWER(numeric1, numeric2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns numeric1 raised to the power of numeric2."}),"\n",(0,i.jsx)(n.h3,{id:"ln",children:"LN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the natural logarithm (base e) of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"log10",children:"LOG10"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOG10(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the base 10 logarithm of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"abs",children:"ABS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ABS(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the absolute value of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"rand",children:"RAND"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RAND([seed])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Generates a random double between 0 and 1 inclusive, optionally initializing the random number generator with seed."}),"\n",(0,i.jsx)(n.h3,{id:"rand_integer",children:"RAND_INTEGER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RAND_INTEGER([seed, ] numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Generates a random integer between 0 and numeric - 1 inclusive, optionally initializing the random number generator with seed."}),"\n",(0,i.jsx)(n.h3,{id:"acos",children:"ACOS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ACOS(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the arc cosine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"asin",children:"ASIN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ASIN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the arc sine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"atan",children:"ATAN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ATAN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the arc tangent of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"atan2",children:"ATAN2"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ATAN2(numeric, numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the arc tangent of the numeric coordinates."}),"\n",(0,i.jsx)(n.h3,{id:"sqrt",children:"SQRT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SQRT(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the square root of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"cbrt",children:"CBRT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CBRT(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the cube root of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"cos",children:"COS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COS(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the cosine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"cosh",children:"COSH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COSH(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the hyperbolic cosine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"cot",children:"COT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COT(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the cotangent of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"degrees",children:"DEGREES"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DEGREES(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Converts numeric from radians to degrees."}),"\n",(0,i.jsx)(n.h3,{id:"radians",children:"RADIANS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RADIANS(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Converts numeric from degrees to radians."}),"\n",(0,i.jsx)(n.h3,{id:"round",children:"ROUND"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ROUND(numeric1 [, integer2])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Rounds numeric1 to optionally integer2 (if not specified 0) places right to the decimal point."}),"\n",(0,i.jsx)(n.h3,{id:"sign",children:"SIGN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SIGN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the signum of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"sin",children:"SIN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SIN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the sine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"sinh",children:"SINH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SINH(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the hyperbolic sine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"tan",children:"TAN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TAN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the tangent of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"tanh",children:"TANH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TANH(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the hyperbolic tangent of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"truncate",children:"TRUNCATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TRUNCATE(numeric1 [, integer2])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Truncates numeric1 to optionally integer2 (if not specified 0) places right to the decimal point."}),"\n",(0,i.jsx)(n.h3,{id:"pi",children:"PI"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"PI()\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a value that is closer than any other value to Pi."}),"\n",(0,i.jsx)(n.h2,{id:"string-functions",children:"String Functions"}),"\n",(0,i.jsx)(n.h3,{id:"upper",children:"UPPER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UPPER(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a character string converted to upper case."}),"\n",(0,i.jsx)(n.h3,{id:"lower",children:"LOWER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOWER(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a character string converted to lower case."}),"\n",(0,i.jsx)(n.h3,{id:"initcap",children:"INITCAP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"INITCAP(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns string with the first letter of each word converter to upper case and the rest to lower case. Words are sequences of alphanumeric characters separated by non-alphanumeric characters."}),"\n",(0,i.jsx)(n.h3,{id:"to_base64",children:"TO_BASE64"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TO_BASE64(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Converts the string to base-64 encoded form and returns an encoded string"}),"\n",(0,i.jsx)(n.h3,{id:"from_base64",children:"FROM_BASE64"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"FROM_BASE64(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the decoded result of a base-64 string as a string."}),"\n",(0,i.jsx)(n.h3,{id:"md5",children:"MD5"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MD5(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Calculates an MD5 128-bit checksum of string and returns it as a hex string."}),"\n",(0,i.jsx)(n.h3,{id:"sha1",children:"SHA1"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SHA1(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Calculates a SHA-1 hash value of string and returns it as a hex string."}),"\n",(0,i.jsx)(n.h3,{id:"substring",children:"SUBSTRING"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTRING(string FROM integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a substring of a character string starting at a given point."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTRING(string FROM integer FOR integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a substring of a character string starting at a given point with a given length."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTRING(binary FROM integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a substring of binary starting at a given point."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTRING(binary FROM integer FOR integer)\r\n\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a substring of binary starting at a given point with a given length."}),"\n",(0,i.jsx)(n.h3,{id:"left",children:"LEFT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LEFT(string, length)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the leftmost length characters from the string."}),"\n",(0,i.jsx)(n.h3,{id:"right",children:"RIGHT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RIGHT(string, length)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the rightmost length characters from the string."}),"\n",(0,i.jsx)(n.h3,{id:"replace",children:"REPLACE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REPLACE(char, search_string [, replace_string])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces search_string with replace_string."}),"\n",(0,i.jsx)(n.h3,{id:"translate",children:"TRANSLATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TRANSLATE(expr, fromString, toString)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns expr with all occurrences of each character in fromString replaced by its corresponding character in toString. Characters in expr that are not in fromString are not replaced."}),"\n",(0,i.jsx)(n.h3,{id:"chr",children:"CHR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CHR(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the character whose UTF-8 code is integer."}),"\n",(0,i.jsx)(n.h3,{id:"char_length",children:"CHAR_LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CHAR_LENGTH(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of characters in a character string."}),"\n",(0,i.jsx)(n.h3,{id:"character_length",children:"CHARACTER_LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CHARACTER_LENGTH(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of characters in a character string."}),"\n",(0,i.jsx)(n.h3,{id:"",children:"||"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"string || string\n"})}),"\n",(0,i.jsx)(n.p,{children:"Concatenates two character strings."}),"\n",(0,i.jsx)(n.h3,{id:"concat",children:"CONCAT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CONCAT(string, string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Concatenates two strings, returns null only when both string arguments are null, otherwise treats null as empty string."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CONCAT(string [, string ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Concatenates one or more strings, returns null if any of the arguments is null."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CONCAT(string [, string ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Concatenates one or more strings, null is treated as empty string."}),"\n",(0,i.jsx)(n.h3,{id:"overlay",children:"OVERLAY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"OVERLAY(string1 PLACING string2 FROM integer [ FOR integer2 ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces a substring of string1 with string2."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"OVERLAY(binary1 PLACING binary2 FROM integer [ FOR integer2 ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces a substring of binary1 with binary2."}),"\n",(0,i.jsx)(n.h3,{id:"position",children:"POSITION"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POSITION(substring IN string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the position of the first occurrence of substring in string."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POSITION(substring IN string FROM integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the position of the first occurrence of substring in string starting at a given point (not standard SQL)."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POSITION(binary1 IN binary2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the position of the first occurrence of binary1 in binary2."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POSITION(binary1 IN binary2 FROM integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the position of the first occurrence of binary1 in binary2 starting at a given point (not standard SQL)."}),"\n",(0,i.jsx)(n.h3,{id:"ascii",children:"ASCII"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ASCII(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the ASCII code of the first character of string; if the first character is a non-ASCII character, returns its Unicode code point; returns 0 if string is empty."}),"\n",(0,i.jsx)(n.h3,{id:"repeat",children:"REPEAT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REPEAT(string, integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a string consisting of string repeated of integer times; returns an empty string if integer is less than 1."}),"\n",(0,i.jsx)(n.h3,{id:"space",children:"SPACE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SPACE(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a string with an integer number of spaces; returns an empty string if integer is less than 1."}),"\n",(0,i.jsx)(n.h3,{id:"strcmp",children:"STRCMP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"STRCMP(string, string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns 0 if both of the strings are same and returns -1 when the first argument is smaller than the second and 1 when the second one is smaller than the first one."}),"\n",(0,i.jsx)(n.h3,{id:"soundex",children:"SOUNDEX"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SOUNDEX(string)\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Returns the phonetic representation of string; throws if string is encoded with multi-byte encoding such as UTF-8; or"}),"\n",(0,i.jsx)(n.li,{children:"Returns the phonetic representation of string; return original string if string is encoded with multi-byte encoding such as UTF-8"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"difference",children:"DIFFERENCE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DIFFERENCE(string, string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a measure of the similarity of two strings, namely the number of character positions that their SOUNDEX values have in common: 4 if the SOUNDEX values are same and 0 if the SOUNDEX values are totally different."}),"\n",(0,i.jsx)(n.h3,{id:"reverse",children:"REVERSE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REVERSE(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns string with the order of the characters reversed."}),"\n",(0,i.jsx)(n.h3,{id:"trim",children:"TRIM"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TRIM( { BOTH | LEADING | TRAILING } string1 FROM string2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Removes the longest string containing only the characters in string1 from the start/end/both ends of string1."}),"\n",(0,i.jsx)(n.h3,{id:"ltrim",children:"LTRIM"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LTRIM(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns string with all blanks removed from the start."}),"\n",(0,i.jsx)(n.h3,{id:"rtrim",children:"RTRIM"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RTRIM(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns string with all blanks removed from the end."}),"\n",(0,i.jsx)(n.h3,{id:"substr",children:"SUBSTR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTR(string, position [, substringLength ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a portion of string, beginning at character position, substringLength characters long. SUBSTR calculates lengths using characters as defined by the input character set."}),"\n",(0,i.jsx)(n.h3,{id:"length",children:"LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LENGTH(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to CHAR_LENGTH(string)."}),"\n",(0,i.jsx)(n.h3,{id:"octet_length",children:"OCTET_LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"OCTET_LENGTH(binary)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of bytes in binary."}),"\n",(0,i.jsx)(n.h3,{id:"like",children:"LIKE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"string1 LIKE string2 [ ESCAPE string3 ]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether string1 matches pattern string2."}),"\n",(0,i.jsx)(n.h3,{id:"similar-to",children:"SIMILAR TO"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"string1 SIMILAR TO string2 [ ESCAPE string3 ]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether string1 matches regular expression string2."}),"\n",(0,i.jsx)(n.h2,{id:"datetime-functions",children:"Date/Time Functions"}),"\n",(0,i.jsx)(n.h3,{id:"extract",children:"EXTRACT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXTRACT(timeUnit FROM datetime)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extracts and returns the value of a specified datetime field from a datetime value expression."}),"\n",(0,i.jsx)(n.h3,{id:"floor",children:"FLOOR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"FLOOR(datetime TO timeUnit)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Rounds datetime down to timeUnit."}),"\n",(0,i.jsx)(n.h3,{id:"ceil",children:"CEIL"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CEIL(datetime TO timeUnit)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Rounds datetime up to timeUnit."}),"\n",(0,i.jsx)(n.h3,{id:"timestampdiff",children:"TIMESTAMPDIFF"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TIMESTAMPDIFF(timeUnit, datetime, datetime2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the (signed) number of timeUnit intervals between datetime and datetime2. Equivalent to (datetime2 - datetime) timeUnit."}),"\n",(0,i.jsx)(n.h3,{id:"last_day",children:"LAST_DAY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LAST_DAY(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the date of the last day of the month in a value of datatype DATE; For example, it returns DATE'2020-02-29' for both DATE'2020-02-10' and TIMESTAMP'2020-02-10 10:10:10'."}),"\n",(0,i.jsx)(n.h3,{id:"dayname",children:"DAYNAME"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DAYNAME(datetime)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the name of the day of the week based on the datetime value."}),"\n",(0,i.jsx)(n.h3,{id:"monthname",children:"MONTHNAME"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MONTHNAME(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the name, in the connection's locale, of the month in datetime; for example, it returns '\u4e8c\u6708' for both DATE '2020-02-10' and TIMESTAMP '2020-02-10 10:10:10'."}),"\n",(0,i.jsx)(n.h3,{id:"dayofmonth",children:"DAYOFMONTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DAYOFMONTH(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(DAY FROM date). Returns an integer between 1 and 31."}),"\n",(0,i.jsx)(n.h3,{id:"dayofweek",children:"DAYOFWEEK"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DAYOFWEEK(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(DOW FROM date). Returns an integer between 1 and 7."}),"\n",(0,i.jsx)(n.h3,{id:"dayofyear",children:"DAYOFYEAR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DAYOFYEAR(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(DOY FROM date). Returns an integer between 1 and 366."}),"\n",(0,i.jsx)(n.h3,{id:"year",children:"YEAR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"YEAR(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(YEAR FROM date). Returns an integer."}),"\n",(0,i.jsx)(n.h3,{id:"quarter",children:"QUARTER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"QUARTER(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(QUARTER FROM date). Returns an integer between 1 and 4."}),"\n",(0,i.jsx)(n.h3,{id:"month",children:"MONTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MONTH(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(MONTH FROM date). Returns an integer between 1 and 12."}),"\n",(0,i.jsx)(n.h3,{id:"week",children:"WEEK"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"WEEK(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(WEEK FROM date). Returns an integer between 1 and 53."}),"\n",(0,i.jsx)(n.h3,{id:"hour",children:"HOUR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"HOUR(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(HOUR FROM date). Returns an integer between 0 and 23."}),"\n",(0,i.jsx)(n.h3,{id:"minute",children:"MINUTE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MINUTE(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(MINUTE FROM date). Returns an integer between 0 and 59."}),"\n",(0,i.jsx)(n.h3,{id:"second",children:"SECOND"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SECOND(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(SECOND FROM date). Returns an integer between 0 and 59."}),"\n",(0,i.jsx)(n.h3,{id:"timestamp_seconds",children:"TIMESTAMP_SECONDS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TIMESTAMP_SECONDS(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the TIMESTAMP that is integer seconds after 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"timestamp_millis",children:"TIMESTAMP_MILLIS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TIMESTAMP_MILLIS(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the TIMESTAMP that is integer milliseconds after 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"timestamp_micros",children:"TIMESTAMP_MICROS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TIMESTAMP_MICROS(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the TIMESTAMP that is integer microseconds after 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"unix_seconds",children:"UNIX_SECONDS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UNIX_SECONDS(timestamp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of seconds since 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"unix_millis",children:"UNIX_MILLIS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UNIX_MILLIS(timestamp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of milliseconds since 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"unix_micros",children:"UNIX_MICROS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UNIX_MICROS(timestamp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of microseconds since 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"unix_date",children:"UNIX_DATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UNIX_DATE(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of days since 1970-01-01"}),"\n",(0,i.jsx)(n.h3,{id:"date_from_unix_date",children:"DATE_FROM_UNIX_DATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE_FROM_UNIX_DATE(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the DATE that is integer days after 1970-01-01."}),"\n",(0,i.jsx)(n.h3,{id:"date",children:"DATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(timestamp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extracts the DATE from a timestamp."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(timestampLtz)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extracts the DATE from timestampLtz (an instant; BigQuery's TIMESTAMP type), assuming UTC."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(timestampLtz, timeZone)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extracts the DATE from timestampLtz (an instant; BigQuery's TIMESTAMP type) in timeZone."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to CAST(string AS DATE)."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(year, month, day)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a DATE value for year, month, and day (all of type INTEGER)."}),"\n",(0,i.jsx)(n.h3,{id:"current_timestamp",children:"CURRENT_TIMESTAMP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CURRENT_TIMESTAMP\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone, in a value of datatype TIMESTAMP WITH LOCAL TIME ZONE."}),"\n",(0,i.jsx)(n.h3,{id:"current_date",children:"CURRENT_DATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CURRENT_DATE\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date in the session time zone, in a value of datatype DATE."}),"\n",(0,i.jsx)(n.h3,{id:"localtime",children:"LOCALTIME"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOCALTIME\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone in a value of datatype TIME."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOCALTIME(precision)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone in a value of datatype TIME, with precision digits of precision."}),"\n",(0,i.jsx)(n.h3,{id:"localtimestamp",children:"LOCALTIMESTAMP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOCALTIMESTAMP\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone in a value of datatype TIMESTAMP."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOCALTIMESTAMP(precision)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone in a value of datatype TIMESTAMP, with precision digits of precision."}),"\n",(0,i.jsx)(n.h2,{id:"other-functions",children:"Other Functions"}),"\n",(0,i.jsx)(n.h3,{id:"cast",children:"CAST"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CAST(value AS type)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Converts a value to a given type. Casts between integer types truncate towards 0."}),"\n",(0,i.jsx)(n.h3,{id:"coalesce",children:"COALESCE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COALESCE(value, value [, value ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Provides a value if the first value is null. For example, COALESCE(NULL, 5) returns 5."}),"\n",(0,i.jsx)(n.h3,{id:"greatest",children:"GREATEST"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"GREATEST(expr [, expr ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the greatest of the expressions."}),"\n",(0,i.jsx)(n.h3,{id:"nullif",children:"NULLIF"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"NULLIF(value, value)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns NULL if the values are the same. For example, NULLIF(5, 5) returns NULL; NULLIF(5, 0) returns 5."}),"\n",(0,i.jsx)(n.h3,{id:"nvl",children:"NVL"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"NVL(value1, value2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns value1 if value1 is not null, otherwise value2."}),"\n",(0,i.jsx)(n.h3,{id:"case",children:"CASE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CASE value\r\nWHEN value1 [, value11 ]* THEN result1\r\n[ WHEN valueN [, valueN1 ]* THEN resultN ]*\r\n[ ELSE resultZ ]\r\nEND\n"})}),"\n",(0,i.jsx)(n.p,{children:"Simple case."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CASE\r\nWHEN condition1 THEN result1\r\n[ WHEN conditionN THEN resultN ]*\r\n[ ELSE resultZ ]\r\nEND\n"})}),"\n",(0,i.jsx)(n.p,{children:"Searched case."}),"\n",(0,i.jsx)(n.h3,{id:"decode",children:"DECODE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DECODE(value, value1, result1 [, valueN, resultN ]* [, default ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Compares value to each valueN value one by one; if value is equal to a valueN, returns the corresponding resultN, else returns default, or NULL if default is not specified."}),"\n",(0,i.jsx)(n.h3,{id:"least",children:"LEAST"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LEAST(expr [, expr ]* )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the least of the expressions."}),"\n",(0,i.jsx)(n.h3,{id:"compress",children:"COMPRESS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COMPRESS(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Compresses a string using zlib compression and returns the result as a binary string."}),"\n",(0,i.jsx)(n.h3,{id:"typeof",children:"TYPEOF"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TYPEOF value\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the type of the specified value."}),"\n",(0,i.jsx)(n.h3,{id:"rand_uuid",children:"RAND_UUID"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RAND_UUID\n"})}),"\n",(0,i.jsx)(n.p,{children:"Generates a random UUID."}),"\n",(0,i.jsx)(n.h3,{id:"system_range",children:"SYSTEM_RANGE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SYSTEM_RANGE(start, end[, increment])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a range from the table, with an optional increment."}),"\n",(0,i.jsx)(n.h2,{id:"security-functions",children:"Security Functions"}),"\n",(0,i.jsx)(n.h3,{id:"current_user",children:"CURRENT_USER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CURRENT_USER\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the name of the current database user. When security is disabled, returns the system user name instead."})]})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/14965a6a.3e457c4c.js b/docs/ignite3/assets/js/14965a6a.3e457c4c.js deleted file mode 100644 index f2b7e4beae..0000000000 --- a/docs/ignite3/assets/js/14965a6a.3e457c4c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[960],{11590:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"develop/work-with-data/events","title":"Working with Events","description":"Apache Ignite can generate events for a variety of operations happening in the cluster and notify your application about those operations. There are many types of events, including cache events, node discovery events, distributed task execution events, and many more.","source":"@site/docs/develop/work-with-data/events.md","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/events","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/events","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"events","title":"Working with Events"},"sidebar":"tutorialSidebar","previous":{"title":"Code Deployment","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/code-deployment"},"next":{"title":"Available Events","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/events-list"}}');var i=t(74848),s=t(28453);const l={id:"events",title:"Working with Events"},d=void 0,o={},c=[{value:"Enabling Events",id:"enabling-events",level:2},{value:"Sink Structure",id:"sink-structure",level:2},{value:"Channel Structure",id:"channel-structure",level:2},{value:"Event Structure",id:"event-structure",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Apache Ignite can generate events for a variety of operations happening in the cluster and notify your application about those operations. There are many types of events, including cache events, node discovery events, distributed task execution events, and many more."}),"\n",(0,i.jsx)(n.h2,{id:"enabling-events",children:"Enabling Events"}),"\n",(0,i.jsxs)(n.p,{children:["In Ignite 3, events are configured cluster-wide, in ",(0,i.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes",children:"cluster configuration"}),". Events are organized in ",(0,i.jsx)(n.strong,{children:"channels"}),", each channel tracking one or more event types. You cannot enable or disable individual events, instead you need to disable event channels."]}),"\n",(0,i.jsx)(n.p,{children:"To create an event channel:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'cluster config update ignite.eventlog.channels.exampleChannel.events=["USER_AUTHENTICATION_SUCCESS"]\n'})}),"\n",(0,i.jsxs)(n.p,{children:["This channel will track the ",(0,i.jsx)(n.code,{children:"USER_AUTHENTICATION_SUCCESS"}),", but not trigger yet. For the events to trigger, a ",(0,i.jsx)(n.strong,{children:"sink"})," must be configured. It sends the event information to the configured logger category at the configured level. Currently, only the ",(0,i.jsx)(n.code,{children:"log"})," sink type is supported, and it writes output to Apache Ignite log. Here is how you can enable log sink by using the CLI tool:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'cluster config update ignite.eventlog.sinks.exampleSink = {type="log", channel="exampleChannel"}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Now, the authorization events will be written to the log. Here is how the event may look like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'2024-06-04 16:19:29:840 +0300 [INFO][%defaultNode%sql-execution-pool-1][EventLog] {"type":"USER_AUTHORIZATION_SUCCESS","timestamp":1717507169840,"productVersion":"3.0.0","user":{"username":"ignite","authenticationProvider":"basic"},"fields":{"privileges":[{"action":"CREATE_TABLE","on":{"objectType":"TABLE","objectName":"TEST2","schema":"PUBLIC"}}],"roles":["system"]}}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Below is the cluster configuration config in JSON."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "eventlog" : {\r\n "channels" : [ {\r\n "enabled" : true,\r\n "events" : [ "USER_AUTHENTICATION_SUCCESS" ],\r\n "name" : "exampleChannel"\r\n } ],\r\n "sinks" : [ {\r\n "channel" : "exampleChannel",\r\n "criteria" : "EventLog",\r\n "format" : "JSON",\r\n "level" : "INFO",\r\n "name" : "sampleSink",\r\n "type" : "log"\r\n } ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"sink-structure",children:"Sink Structure"}),"\n",(0,i.jsx)(n.p,{children:"Data sink configuration in Apache Ignite 3 has the following structure:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "channel" : "exampleChannel",\r\n "criteria" : "EventLog",\r\n "format" : "JSON",\r\n "level" : "INFO",\r\n "name" : "sampleSink",\r\n "type" : "log"\r\n}\n'})}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Field"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"channel"}),(0,i.jsx)(n.td,{children:"The name of the event channel the data sink logs data for."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"criteria"}),(0,i.jsx)(n.td,{children:"Logging criteria. By default, only EventLog messages are logged."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"format"}),(0,i.jsxs)(n.td,{children:["Output format. Currently, only ",(0,i.jsx)(n.code,{children:"JSON"})," messages are supported."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"level"}),(0,i.jsxs)(n.td,{children:["The level the messages are posted to the log at. Supported values: ",(0,i.jsx)(n.code,{children:"ALL"}),", ",(0,i.jsx)(n.code,{children:"TRACE"}),", ",(0,i.jsx)(n.code,{children:"DEBUG"}),", ",(0,i.jsx)(n.code,{children:"INFO"}),", ",(0,i.jsx)(n.code,{children:"WARNING"}),", ",(0,i.jsx)(n.code,{children:"ERROR"}),", ",(0,i.jsx)(n.code,{children:"OFF"}),". Default value: ",(0,i.jsx)(n.code,{children:"INFO"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"name"}),(0,i.jsx)(n.td,{children:"Arbitrary sink name."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"type"}),(0,i.jsxs)(n.td,{children:["Type of event sink. Currently, only ",(0,i.jsx)(n.code,{children:"log"})," sink is supported, and is used to write events to log."]})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"channel-structure",children:"Channel Structure"}),"\n",(0,i.jsx)(n.p,{children:"Event channel configuration in Apache Ignite 3 has the following structure:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "enabled" : true,\r\n "events" : [ "USER_AUTHENTICATION_SUCCESS" ],\r\n "name" : "exampleChannel"\r\n}\n'})}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Field"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"enabled"}),(0,i.jsx)(n.td,{children:"Defines if this event channel is enabled."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"events"}),(0,i.jsxs)(n.td,{children:["The list of events tracked by the event channel. For the full list of event types, see ",(0,i.jsx)(n.a,{href:"./events-list",children:"Events List"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"name"}),(0,i.jsx)(n.td,{children:"Arbitrary channel name."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"event-structure",children:"Event Structure"}),"\n",(0,i.jsxs)(n.p,{children:["All events in Apache Ignite 3 follow the same basic structure described below. Some events provide additional context in the ",(0,i.jsx)(n.code,{children:"data"})," field."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "type": "AUTHENTICATION",\r\n "user": { "username": "John", "authenticationProvider": "basic" },\r\n "timestamp": 1715169617,\r\n "productVersion": "3.0.0",\r\n "fields": {}\r\n}\n'})}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Field"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"type"}),(0,i.jsxs)(n.td,{children:["The type of the event. For the full list of event types, see ",(0,i.jsx)(n.a,{href:"./events-list",children:"Events List"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"user"}),(0,i.jsxs)(n.td,{children:["The name of the user, and the ",(0,i.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-authentication",children:"authentication"})," provider used to authorize."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"timestamp"}),(0,i.jsx)(n.td,{children:"Even time in UNIX epoch time."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"productVersion"}),(0,i.jsx)(n.td,{children:"Apache Ignite version used by the client."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"fields"}),(0,i.jsx)(n.td,{children:"Event-specific data."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>d});var r=t(96540);const i={},s=r.createContext(i);function l(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/14ca7f3e.d4579383.js b/docs/ignite3/assets/js/14ca7f3e.d4579383.js deleted file mode 100644 index 8180da5a58..0000000000 --- a/docs/ignite3/assets/js/14ca7f3e.d4579383.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[19],{28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>c});var i=t(96540);const s={},r=i.createContext(s);function a(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:n},e.children)}},59482:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"sql/fundamentals/index","title":"SQL Fundamentals","description":"Core concepts and architecture of the Apache Ignite 3 SQL engine.","source":"@site/docs/sql/fundamentals/index.mdx","sourceDirName":"sql/fundamentals","slug":"/sql/fundamentals/","permalink":"/docs/ignite3/3.1.0/sql/fundamentals/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"SQL Fundamentals"},"sidebar":"tutorialSidebar","previous":{"title":"SQL","permalink":"/docs/ignite3/3.1.0/sql/"},"next":{"title":"Engine Architecture","permalink":"/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture"}}');var s=t(74848),r=t(28453);const a={title:"SQL Fundamentals"},c="SQL Fundamentals",d={},l=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function o(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components},{IIcon:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"sql-fundamentals",children:"SQL Fundamentals"})}),"\n",(0,s.jsx)(n.p,{children:"Core concepts and architecture of the Apache Ignite 3 SQL engine."}),"\n",(0,s.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsx)("div",{className:"card-container",children:(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(t,{icon:"mdi:engine-outline",height:"24"})," SQL Engine Architecture"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Understanding the SQL engine, query processing pipeline, and distributed query execution."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./fundamentals/engine-architecture",children:"Learn more \u2192"})})]})}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"working-with-sql",children:"SQL Operations"})," - Execute queries and work with system views"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"reference",children:"SQL Reference"})," - Complete language reference"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"advanced",children:"Advanced SQL"})," - Performance tuning and optimization"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/15d99295.86e6461a.js b/docs/ignite3/assets/js/15d99295.86e6461a.js deleted file mode 100644 index 9971e293ec..0000000000 --- a/docs/ignite3/assets/js/15d99295.86e6461a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8983],{28453:(e,i,r)=>{r.d(i,{R:()=>a,x:()=>d});var t=r(96540);const s={},n=t.createContext(s);function a(e){const i=t.useContext(n);return t.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(n.Provider,{value:i},e.children)}},29179:(e,i,r)=>{r.r(i),r.d(i,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"getting-started/index","title":"Getting Started","description":"Learn the basics of Apache Ignite 3 and get your first cluster running.","source":"@site/docs/getting-started/index.mdx","sourceDirName":"getting-started","slug":"/getting-started/","permalink":"/docs/ignite3/3.1.0/getting-started/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Apache Ignite 3 Documentation","permalink":"/docs/ignite3/3.1.0/"},"next":{"title":"Introduction","permalink":"/docs/ignite3/3.1.0/getting-started/intro"}}');var s=r(74848),n=r(28453);const a={},d="Getting Started",c={},o=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const i={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components},{IIcon:r}=i;return r||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"getting-started",children:"Getting Started"})}),"\n",(0,s.jsx)(i.p,{children:"Learn the basics of Apache Ignite 3 and get your first cluster running."}),"\n",(0,s.jsx)(i.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:information-outline",height:"24"})," Introduction to Apache Ignite 3"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Overview of Apache Ignite 3 capabilities, use cases, and core features for distributed data processing."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./getting-started/intro",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:rocket-launch",height:"24"})," Quick Start Guide"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Get started with Ignite in 5 minutes. Download, install, and execute your first queries."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./getting-started/quick-start",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:server-network",height:"24"})," Start Your First Cluster"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Launch a local cluster, connect using clients, and verify cluster topology."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./getting-started/start-cluster",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:database-search",height:"24"})," Work with SQL"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Execute SQL queries, create tables, insert data, and perform data manipulation operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./getting-started/work-with-sql",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:table",height:"24"})," Use the Key-Value API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Work with data using the Table API for key-value and record-based operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./getting-started/key-value-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:application-brackets",height:"24"})," Run in Embedded Mode"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Embed Ignite nodes directly in your application for local data processing."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./getting-started/embedded-mode",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:lightbulb-outline",height:"24"})," Best Practices"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Production deployment tips, configuration recommendations, and performance optimization guidance."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./getting-started/best-practices",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:swap-horizontal",height:"24"})," Migrate from Ignite 2"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Migration guide for Ignite 2 users covering API changes and feature mapping."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./getting-started/migrate-from-ignite-2",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(i.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsx)(i.p,{children:"After completing the getting started tutorials, explore:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"develop",children:"Develop"})," - Build applications with Ignite"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"sql",children:"SQL"})," - Learn about SQL capabilities"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"configure-and-operate",children:"Configure and Operate"})," - Set up production clusters"]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/16d50cfe.8faa975a.js b/docs/ignite3/assets/js/16d50cfe.8faa975a.js deleted file mode 100644 index 904701a553..0000000000 --- a/docs/ignite3/assets/js/16d50cfe.8faa975a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6927],{28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>o});var i=n(96540);const r={},a=i.createContext(r);function s(e){const t=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(a.Provider,{value:t},e.children)}},32058:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"develop/integrate/index","title":"Integrate","description":"Framework integrations for Apache Ignite 3.","source":"@site/docs/develop/integrate/index.mdx","sourceDirName":"develop/integrate","slug":"/develop/integrate/","permalink":"/docs/ignite3/3.1.0/develop/integrate/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Integrate"},"sidebar":"tutorialSidebar","previous":{"title":"Java Client Logging","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging"},"next":{"title":"Spring Boot Integration","permalink":"/docs/ignite3/3.1.0/develop/integrate/spring-boot"}}');var r=n(74848),a=n(28453);const s={title:"Integrate"},o="Integrate",d={},c=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const t={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components},{IIcon:n}=t;return n||function(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"integrate",children:"Integrate"})}),"\n",(0,r.jsx)(t.p,{children:"Framework integrations for Apache Ignite 3."}),"\n",(0,r.jsx)(t.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,r.jsxs)("div",{className:"card-container",children:[(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:leaf",height:"24"})," Spring Boot"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Auto-configured IgniteClient bean with property-based configuration and programmatic customization."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./integrate/spring-boot",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:database-arrow-right",height:"24"})," Spring Data"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Spring Data JDBC repositories with CrudRepository, pagination, derived queries, and Query by Example."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./integrate/spring-data",children:"Learn more \u2192"})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"work-with-data",children:"Work with Data"})," - Core data operations"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"../api-reference",children:"API Reference"})," - Complete API documentation"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"../getting-started",children:"Getting Started"})," - Quick start guides"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/18c7933a.9805f683.js b/docs/ignite3/assets/js/18c7933a.9805f683.js deleted file mode 100644 index 5d4b5c05ff..0000000000 --- a/docs/ignite3/assets/js/18c7933a.9805f683.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6626],{28453:(e,r,c)=>{c.d(r,{R:()=>s,x:()=>a});var t=c(96540);const n={},i=t.createContext(n);function s(e){const r=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),t.createElement(i.Provider,{value:r},e.children)}},79121:(e,r,c)=>{c.r(r),c.d(r,{assets:()=>d,contentTitle:()=>a,default:()=>l,frontMatter:()=>s,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"understand/architecture/index","title":"Architecture","description":"Apache Ignite 3 architecture deep dive.","source":"@site/docs/understand/architecture/index.mdx","sourceDirName":"understand/architecture","slug":"/understand/architecture/","permalink":"/docs/ignite3/3.1.0/understand/architecture/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Architecture"},"sidebar":"tutorialSidebar","previous":{"title":"Compute and Events","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events"},"next":{"title":"Architecture Overview","permalink":"/docs/ignite3/3.1.0/understand/architecture/architecture-overview"}}');var n=c(74848),i=c(28453);const s={title:"Architecture"},a="Architecture",d={},o=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function h(e){const r={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components},{IIcon:c}=r;return c||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"architecture",children:"Architecture"})}),"\n",(0,n.jsx)(r.p,{children:"Apache Ignite 3 architecture deep dive."}),"\n",(0,n.jsx)(r.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,n.jsxs)("div",{className:"card-container",children:[(0,n.jsxs)("div",{className:"card",children:[(0,n.jsx)("div",{className:"card__header",children:(0,n.jsxs)("h3",{children:[(0,n.jsx)(c,{icon:"mdi:sitemap",height:"24"})," Architecture Overview"]})}),(0,n.jsx)("div",{className:"card__body",children:(0,n.jsx)("p",{children:"System architecture, node components, and cluster coordination."})}),(0,n.jsx)("div",{className:"card__footer",children:(0,n.jsx)("a",{href:"./architecture/architecture-overview",children:"Learn more \u2192"})})]}),(0,n.jsxs)("div",{className:"card",children:[(0,n.jsx)("div",{className:"card__header",children:(0,n.jsxs)("h3",{children:[(0,n.jsx)(c,{icon:"mdi:harddisk",height:"24"})," Storage Architecture"]})}),(0,n.jsx)("div",{className:"card__body",children:(0,n.jsx)("p",{children:"Storage layers, profiles, and persistence mechanisms."})}),(0,n.jsx)("div",{className:"card__footer",children:(0,n.jsx)("a",{href:"./architecture/storage-architecture",children:"Learn more \u2192"})})]}),(0,n.jsxs)("div",{className:"card",children:[(0,n.jsx)("div",{className:"card__header",children:(0,n.jsxs)("h3",{children:[(0,n.jsx)(c,{icon:"mdi:database-cog-outline",height:"24"})," Storage Engines"]})}),(0,n.jsx)("div",{className:"card__body",children:(0,n.jsx)("p",{children:"AIMemory, AIPersist, and RocksDB storage engine details."})}),(0,n.jsx)("div",{className:"card__footer",children:(0,n.jsx)("a",{href:"./architecture/storage-engines/",children:"Learn more \u2192"})})]}),(0,n.jsxs)("div",{className:"card",children:[(0,n.jsx)("div",{className:"card__header",children:(0,n.jsxs)("h3",{children:[(0,n.jsx)(c,{icon:"mdi:shield-lock-outline",height:"24"})," Security Architecture"]})}),(0,n.jsx)("div",{className:"card__body",children:(0,n.jsx)("p",{children:"Authentication, SSL/TLS encryption, and security configuration."})}),(0,n.jsx)("div",{className:"card__footer",children:(0,n.jsx)("a",{href:"./architecture/security",children:"Learn more \u2192"})})]})]}),"\n",(0,n.jsx)(r.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.a,{href:"core-concepts",children:"Core Concepts"})," - Fundamental concepts"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.a,{href:"performance",children:"Performance"})," - Performance understanding"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.a,{href:"../configure-and-operate/configuration",children:"Configuration"})," - Configure storage"]}),"\n"]})]})}function l(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/19ff637c.c2caaa65.js b/docs/ignite3/assets/js/19ff637c.c2caaa65.js deleted file mode 100644 index eef80ca5c9..0000000000 --- a/docs/ignite3/assets/js/19ff637c.c2caaa65.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4182],{11774:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"quick-start/java-api","title":"Getting Started with Ignite 3 Using Java API","description":"{/*","source":"@site/versioned_docs/version-3.0.0/quick-start/java-api.md","sourceDirName":"quick-start","slug":"/quick-start/java-api","permalink":"/docs/ignite3/3.0.0/quick-start/java-api","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Getting Started with Ignite 3 Using Java API","sidebar_label":"Java API"},"sidebar":"tutorialSidebar","previous":{"title":"Persist Data","permalink":"/docs/ignite3/3.0.0/quick-start/persist-data"},"next":{"title":"Embedded Mode","permalink":"/docs/ignite3/3.0.0/quick-start/embedded-mode"}}');var t=i(74848),a=i(28453);const l={title:"Getting Started with Ignite 3 Using Java API",sidebar_label:"Java API"},s=void 0,o={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Setting Up Ignite 3 Cluster",id:"setting-up-ignite-3-cluster",level:2},{value:"Starting and Initializing the Cluster",id:"starting-and-initializing-the-cluster",level:3},{value:"Setting Up Your Java Project",id:"setting-up-your-java-project",level:2},{value:"Create a Maven Project",id:"create-a-maven-project",level:3},{value:"Configure Maven Dependencies",id:"configure-maven-dependencies",level:3},{value:"Building Your Java Application",id:"building-your-java-application",level:2},{value:"Main Application Class",id:"main-application-class",level:3},{value:"Running the Application",id:"running-the-application",level:2},{value:"Expected Output",id:"expected-output",level:2},{value:"Understanding Table Views in Ignite 3",id:"understanding-table-views-in-ignite-3",level:2},{value:"RecordView Pattern",id:"recordview-pattern",level:3},{value:"KeyValueView Pattern",id:"keyvalueview-pattern",level:3},{value:"Cleaning Up",id:"cleaning-up",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:["\n",(0,t.jsx)(n.p,{children:"This guide walks you through creating a Java application that connects to an Ignite 3 cluster, demonstrating key patterns for working with data using Ignite Java API."}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"JDK 17 or later;"}),"\n",(0,t.jsx)(n.li,{children:"Maven;"}),"\n",(0,t.jsx)(n.li,{children:"Up-to-date versions of Docker and Docker Compose."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"setting-up-ignite-3-cluster",children:"Setting Up Ignite 3 Cluster"}),"\n",(0,t.jsx)(n.p,{children:"Create a Docker Compose file to run a three-node Ignite cluster:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# docker-compose.yml\r\nname: ignite3\r\n\r\nx-ignite-def: &ignite-def\r\n image: apacheignite/ignite:3.0.0\r\n environment:\r\n JVM_MAX_MEM: "4g"\r\n JVM_MIN_MEM: "4g"\r\n configs:\r\n - source: node_config\r\n target: /opt/ignite/etc/ignite-config.conf\r\n\r\nservices:\r\n node1:\r\n <<: *ignite-def\r\n command: --node-name node1\r\n ports:\r\n - "10300:10300" # REST API port\r\n - "10800:10800" # Client port\r\n node2:\r\n <<: *ignite-def\r\n command: --node-name node2\r\n ports:\r\n - "10301:10300"\r\n - "10801:10800"\r\n node3:\r\n <<: *ignite-def\r\n command: --node-name node3\r\n ports:\r\n - "10302:10300"\r\n - "10802:10800"\r\n\r\nconfigs:\r\n node_config:\r\n content: |\r\n ignite {\r\n network {\r\n port: 3344\r\n nodeFinder.netClusterNodes = ["node1:3344", "node2:3344", "node3:3344"]\r\n }\r\n }\n'})}),"\n",(0,t.jsx)(n.h3,{id:"starting-and-initializing-the-cluster",children:"Starting and Initializing the Cluster"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Start the cluster:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"Run the Ignite CLI and initialize the cluster:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run --rm -it --network=host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 apacheignite/ignite:3.0.0 cli\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsx)(n.li,{children:"Inside the CLI, confirm the connection to the default node."}),"\n",(0,t.jsx)(n.li,{children:"Initialize the cluster:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cluster init --name=ignite3 --metastorage-group=node1,node2,node3\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"5",children:["\n",(0,t.jsx)(n.li,{children:"Enter the SQL mode:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sql\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"6",children:["\n",(0,t.jsx)(n.li,{children:"Create a sample table and insert data:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"CREATE TABLE Person (id INT PRIMARY KEY, name VARCHAR);\r\nINSERT INTO Person (id, name) VALUES (1, 'John');\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"7",children:["\n",(0,t.jsx)(n.li,{children:"Exit the SQL mode and CLI tool:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"exit;\r\nexit\n"})}),"\n",(0,t.jsx)(n.h2,{id:"setting-up-your-java-project",children:"Setting Up Your Java Project"}),"\n",(0,t.jsx)(n.h3,{id:"create-a-maven-project",children:"Create a Maven Project"}),"\n",(0,t.jsx)(n.p,{children:"First, create a simple Maven project. Below is the example of the project we will be using:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"ignite3-java-demo/\r\n\u251c\u2500\u2500 pom.xml\r\n\u2514\u2500\u2500 src/\r\n \u2514\u2500\u2500 main/\r\n \u2514\u2500\u2500 java/\r\n \u2514\u2500\u2500 com/\r\n \u2514\u2500\u2500 example/\r\n \u2514\u2500\u2500 Main.java\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configure-maven-dependencies",children:"Configure Maven Dependencies"}),"\n",(0,t.jsxs)(n.p,{children:["Include the Ignite client dependency in your ",(0,t.jsx)(n.code,{children:"pom.xml"})," file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-xml",children:"\r\n \x3c!-- Ignite 3 Client --\x3e\r\n \r\n org.apache.ignite\r\n ignite-client\r\n 3.0.0\r\n \r\n\n"})}),"\n",(0,t.jsx)(n.h2,{id:"building-your-java-application",children:"Building Your Java Application"}),"\n",(0,t.jsx)(n.p,{children:"Now, let's create a Java application that connects to our Ignite cluster and performs various data operations."}),"\n",(0,t.jsx)(n.h3,{id:"main-application-class",children:"Main Application Class"}),"\n",(0,t.jsxs)(n.p,{children:["Create a ",(0,t.jsx)(n.code,{children:"Main.java"})," file with the following code:"]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsx)(n.p,{children:"See the structure example above for the expected file location. This example contains the full class file."})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package com.example;\r\n\r\nimport org.apache.ignite.catalog.ColumnType;\r\nimport org.apache.ignite.catalog.definitions.ColumnDefinition;\r\nimport org.apache.ignite.catalog.definitions.TableDefinition;\r\nimport org.apache.ignite.client.IgniteClient;\r\nimport org.apache.ignite.table.KeyValueView;\r\nimport org.apache.ignite.table.RecordView;\r\nimport org.apache.ignite.table.Table;\r\nimport org.apache.ignite.table.Tuple;\r\n\r\n/**\r\n * This example demonstrates connecting to an Ignite 3 cluster\r\n * and working with data using different table view patterns.\r\n */\r\npublic class Main {\r\n public static void main(String[] args) {\r\n // Create an array of connection addresses for fault tolerance\r\n String[] addresses = {\r\n "localhost:10800",\r\n "localhost:10801",\r\n "localhost:10802"\r\n };\r\n\r\n // Connect to the Ignite cluster using the client builder pattern\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses(addresses)\r\n .build()) {\r\n\r\n System.out.println("Connected to the cluster: " + client.connections());\r\n\r\n // Demonstrate querying existing data using SQL API\r\n queryExistingTable(client);\r\n\r\n // Create a new table using Java API\r\n Table table = createTable(client);\r\n\r\n // Demonstrate different ways to interact with tables\r\n populateTableWithDifferentViews(table);\r\n\r\n // Query the new table using SQL API\r\n queryNewTable(client);\r\n }\r\n }\r\n\r\n /**\r\n * Queries the pre-created Person table using SQL\r\n */\r\n private static void queryExistingTable(IgniteClient client) {\r\n System.out.println("\\n--- Querying Person table ---");\r\n client.sql().execute(null, "SELECT * FROM Person")\r\n .forEachRemaining(row -> System.out.println("Person: " + row.stringValue("name")));\r\n }\r\n\r\n /**\r\n * Creates a new table using the Java API\r\n */\r\n private static Table createTable(IgniteClient client) {\r\n System.out.println("\\n--- Creating Person2 table ---");\r\n return client.catalog().createTable(\r\n TableDefinition.builder("Person2")\r\n .ifNotExists()\r\n .columns(\r\n ColumnDefinition.column("ID", ColumnType.INT32),\r\n ColumnDefinition.column("NAME", ColumnType.VARCHAR))\r\n .primaryKey("ID")\r\n .build());\r\n }\r\n\r\n /**\r\n * Demonstrates different ways to interact with tables\r\n */\r\n private static void populateTableWithDifferentViews(Table table) {\r\n System.out.println("\\n--- Populating Person2 table using different views ---");\r\n\r\n // 1. Using RecordView with Tuples\r\n RecordView recordView = table.recordView();\r\n recordView.upsert(null, Tuple.create().set("id", 2).set("name", "Jane"));\r\n System.out.println("Added record using RecordView with Tuple");\r\n\r\n // 2. Using RecordView with POJOs\r\n RecordView pojoView = table.recordView(Person.class);\r\n pojoView.upsert(null, new Person(3, "Jack"));\r\n System.out.println("Added record using RecordView with POJO");\r\n\r\n // 3. Using KeyValueView with Tuples\r\n KeyValueView keyValueView = table.keyValueView();\r\n keyValueView.put(null, Tuple.create().set("id", 4), Tuple.create().set("name", "Jill"));\r\n System.out.println("Added record using KeyValueView with Tuples");\r\n\r\n // 4. Using KeyValueView with Native Types\r\n KeyValueView keyValuePojoView = table.keyValueView(Integer.class, String.class);\r\n keyValuePojoView.put(null, 5, "Joe");\r\n System.out.println("Added record using KeyValueView with Native Types");\r\n }\r\n\r\n /**\r\n * Queries the newly created Person2 table using SQL\r\n */\r\n private static void queryNewTable(IgniteClient client) {\r\n System.out.println("\\n--- Querying Person2 table ---");\r\n client.sql().execute(null, "SELECT * FROM Person2")\r\n .forEachRemaining(row -> System.out.println("Person2: " + row.stringValue("name")));\r\n }\r\n\r\n /**\r\n * POJO class representing a Person\r\n */\r\n public static class Person {\r\n // Default constructor required for serialization\r\n public Person() { }\r\n\r\n public Person(Integer id, String name) {\r\n this.id = id;\r\n this.name = name;\r\n }\r\n\r\n Integer id;\r\n String name;\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"running-the-application",children:"Running the Application"}),"\n",(0,t.jsx)(n.p,{children:"To run your application:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Make sure your Ignite cluster is up and running;"}),"\n",(0,t.jsx)(n.li,{children:"Compile and run your Java application:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'mvn compile exec:java -Dexec.mainClass="com.example.Main"\n'})}),"\n",(0,t.jsx)(n.h2,{id:"expected-output",children:"Expected Output"}),"\n",(0,t.jsx)(n.p,{children:"You should see output similar to this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"Connected to the cluster: Connections{active=1, total=1}\r\n\r\n--- Querying Person table ---\r\nPerson: John\r\n\r\n--- Creating Person2 table ---\r\n\r\n--- Populating Person2 table using different views ---\r\nAdded record using RecordView with Tuple\r\nAdded record using RecordView with POJO\r\nAdded record using KeyValueView with Tuples\r\nAdded record using KeyValueView with Native Types\r\n\r\n--- Querying Person2 table ---\r\nPerson2: Jane\r\nPerson2: Jack\r\nPerson2: Jill\r\nPerson2: Joe\n"})}),"\n",(0,t.jsx)(n.h2,{id:"understanding-table-views-in-ignite-3",children:"Understanding Table Views in Ignite 3"}),"\n",(0,t.jsxs)(n.p,{children:["Ignite 3 provides multiple view patterns for interacting with tables on top of providing a robust SQL API. Examples below showcase how you can work with Ignite tables from your project without SQL. For examples of working with SQL, see the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/quick-start/explore-sql",children:"Getting Started with SQL"})," tutorial."]}),"\n",(0,t.jsx)(n.h3,{id:"recordview-pattern",children:"RecordView Pattern"}),"\n",(0,t.jsx)(n.p,{children:"RecordView treats tables as a collection of records, perfect for operations that work with entire rows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'// Get RecordView for Tuple objects (schema-less)\r\nRecordView recordView = table.recordView();\r\nrecordView.upsert(null, Tuple.create().set("id", 2).set("name", "Jane"));\r\n\r\n// Get RecordView for mapped POJO objects (type-safe)\r\nRecordView pojoView = table.recordView(Person.class);\r\npojoView.upsert(null, new Person(3, "Jack"));\n'})}),"\n",(0,t.jsx)(n.h3,{id:"keyvalueview-pattern",children:"KeyValueView Pattern"}),"\n",(0,t.jsx)(n.p,{children:"KeyValueView treats tables as a key-value store, ideal for simple lookups:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'// Get KeyValueView for Tuple objects\r\nKeyValueView keyValueView = table.keyValueView();\r\nkeyValueView.put(null, Tuple.create().set("id", 4), Tuple.create().set("name", "Jill"));\r\n\r\n// Get KeyValueView for native Java types\r\nKeyValueView keyValuePojoView = table.keyValueView(Integer.class, String.class);\r\nkeyValuePojoView.put(null, 5, "Joe");\n'})}),"\n",(0,t.jsx)(n.h2,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,t.jsx)(n.p,{children:"To stop your cluster when you are done:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose down\n"})}),"\n",(0,t.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsx)(n.p,{children:"If you encounter connection issues:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Verify your Docker containers are running with ",(0,t.jsx)(n.code,{children:"docker compose ps"})," command;"]}),"\n",(0,t.jsx)(n.li,{children:"Check if the exposed ports match those in your client configuration;"}),"\n",(0,t.jsxs)(n.li,{children:["Ensure that the ",(0,t.jsx)(n.code,{children:"localhost"})," interface can access the Docker container network."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,t.jsx)(n.p,{children:"Now that you've explored the basics of connecting to Ignite and interacting with data:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Try implementing transactions;"}),"\n",(0,t.jsx)(n.li,{children:"Experiment with more complex schemas and data types;"}),"\n",(0,t.jsx)(n.li,{children:"Explore data partitioning strategies;"}),"\n",(0,t.jsx)(n.li,{children:"Investigate distributed computing capabilities."}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>s});var r=i(96540);const t={},a=r.createContext(t);function l(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/1aa4865b.f2ef20e6.js b/docs/ignite3/assets/js/1aa4865b.f2ef20e6.js deleted file mode 100644 index e3d9c18284..0000000000 --- a/docs/ignite3/assets/js/1aa4865b.f2ef20e6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3821],{28453:(e,r,t)=>{t.d(r,{R:()=>o,x:()=>c});var n=t(96540);const i={},s=n.createContext(i);function o(e){const r=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(s.Provider,{value:r},e.children)}},57144:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/jmc-metrics-61452f47960883d0cee84f0f949ef28e.png"},64598:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"administrators-guide/metrics/configuring-metrics","title":"Configuring Metrics","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/metrics/configuring-metrics.md","sourceDirName":"administrators-guide/metrics","slug":"/administrators-guide/metrics/configuring-metrics","permalink":"/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Configuring Metrics","sidebar_label":"Configuring Metrics"},"sidebar":"tutorialSidebar","previous":{"title":"Authentication","permalink":"/docs/ignite3/3.0.0/administrators-guide/security/authentication"},"next":{"title":"Configuring Metrics","permalink":"/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics"}}');var i=t(74848),s=t(28453);const o={title:"Configuring Metrics",sidebar_label:"Configuring Metrics"},c="Configuring Metrics",l={},d=[{value:"Listing Metric Sources",id:"listing-metric-sources",level:2},{value:"Listing Metrics",id:"listing-metrics",level:2},{value:"Enabling Metric Sources",id:"enabling-metric-sources",level:2},{value:"Disabling Metric Sources",id:"disabling-metric-sources",level:2},{value:"Configuring Metrics Exporters",id:"configuring-metrics-exporters",level:2},{value:"JMX",id:"jmx",level:3},{value:"Log Exporter",id:"log-exporter",level:3},{value:"OpenTelemetry",id:"opentelemetry",level:3},{value:"Connection to Grafana",id:"connection-to-grafana",level:4},{value:"Connection to Prometheus",id:"connection-to-prometheus",level:4}];function a(e){const r={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(r.header,{children:(0,i.jsx)(r.h1,{id:"configuring-metrics",children:"Configuring Metrics"})}),"\n",(0,i.jsxs)(r.p,{children:["Metric management is performed through the ",(0,i.jsx)(r.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool",children:"Ignite CLI tool"}),"."]}),"\n",(0,i.jsx)(r.h2,{id:"listing-metric-sources",children:"Listing Metric Sources"}),"\n",(0,i.jsx)(r.p,{children:"You can list all available metric sources for a node or for the entire cluster."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"node metric source list\r\ncluster metric source list\n"})}),"\n",(0,i.jsx)(r.h2,{id:"listing-metrics",children:"Listing Metrics"}),"\n",(0,i.jsx)(r.p,{children:"You can list all metrics for a node."}),"\n",(0,i.jsx)(r.admonition,{type:"note",children:(0,i.jsxs)(r.p,{children:["To see the list of metrics, you need to enable the relevant metric sources - see ",(0,i.jsx)(r.a,{href:"#enabling-metric-sources",children:"Enabling Metric Sources"}),"."]})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"node metric list\n"})}),"\n",(0,i.jsx)(r.p,{children:"The above command returns the list of all currently available metrics organized with their exporters."}),"\n",(0,i.jsx)(r.h2,{id:"enabling-metric-sources",children:"Enabling Metric Sources"}),"\n",(0,i.jsx)(r.p,{children:"Metric collection might affect the performance of an application. Therefore, by default, all metric sources are disabled."}),"\n",(0,i.jsx)(r.p,{children:"Metric sources can be enabled:"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:["On per-node basis - you can specify the node to interact with by using the ",(0,i.jsx)(r.code,{children:"-u"})," parameter to specify node URL or ",(0,i.jsx)(r.code,{children:"-n"})," parameter to specify node name."]}),"\n",(0,i.jsx)(r.li,{children:"For the entire cluster."}),"\n"]}),"\n",(0,i.jsx)(r.p,{children:"For example:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"node metric source enable -n=defaultNode jvm\r\ncluster metric source enable jvm\n"})}),"\n",(0,i.jsx)(r.h2,{id:"disabling-metric-sources",children:"Disabling Metric Sources"}),"\n",(0,i.jsx)(r.p,{children:"Metric sources can be disabled:"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:["On per-node basis - you can specify the node to interact with by using the ",(0,i.jsx)(r.code,{children:"-u"})," parameter to specify node URL or ",(0,i.jsx)(r.code,{children:"-n"})," parameter to specify node name."]}),"\n",(0,i.jsx)(r.li,{children:"For the entire cluster."}),"\n"]}),"\n",(0,i.jsx)(r.p,{children:"For example:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"node metric source disable -n=defaultNode jvm\r\ncluster metric source disable jvm\n"})}),"\n",(0,i.jsx)(r.h2,{id:"configuring-metrics-exporters",children:"Configuring Metrics Exporters"}),"\n",(0,i.jsx)(r.p,{children:"To access the collected metrics with external tools, you need to configure metrics exporters."}),"\n",(0,i.jsx)(r.h3,{id:"jmx",children:"JMX"}),"\n",(0,i.jsx)(r.p,{children:"The JMX exporter provides information about Ignite nodes in JMX(Java Management Extensions) format. When the exporter is enabled, the node exposes the metrics to monitoring tools."}),"\n",(0,i.jsx)(r.p,{children:"You can enable the JMX exporter in the following way:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"cluster config update ignite.metrics.exporters.myJmxExporter.exporterName=jmx\n"})}),"\n",(0,i.jsx)(r.p,{children:"After you do, JMX monitoring tools will be able to collect enabled metrics from the specified nodes:"}),"\n",(0,i.jsx)(r.p,{children:(0,i.jsx)(r.img,{alt:"JMX Metrics",src:t(57144).A+"",width:"1079",height:"769"})}),"\n",(0,i.jsx)(r.p,{children:"You can also open internal JDK modules required for JMX, enable the remote JMX agent, configure the connection port, authentication, and SSL.\r\nAdd the following JVM options to your Ignite node configuration:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED\r\n\r\n-Dcom.sun.management.jmxremote\r\n-Dcom.sun.management.jmxremote.port=\r\n-Dcom.sun.management.jmxremote.authenticate=true|false\r\n-Dcom.sun.management.jmxremote.ssl=true|false\n"})}),"\n",(0,i.jsx)(r.h3,{id:"log-exporter",children:"Log Exporter"}),"\n",(0,i.jsx)(r.p,{children:"Log exporter writes metrics data to the application log, so they can be consumed by log collectors or inspected manually. To configure it, use the following parameters:"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Name"}),(0,i.jsx)(r.th,{children:"Description"}),(0,i.jsx)(r.th,{children:"Default value"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"periodMillis"}),(0,i.jsx)(r.td,{children:"Export interval for the metrics, in milliseconds."}),(0,i.jsx)(r.td,{children:"30000"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"oneLinePerMetricSource"}),(0,i.jsx)(r.td,{children:"Define whether to print all metrics from one metric source on a single log line."}),(0,i.jsx)(r.td,{children:"true"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"enabledMetrics"}),(0,i.jsxs)(r.td,{children:["List of enabled metric sources. If this list is non-empty, only the listed metric sources will be printed, all others will be skipped. A wildcard can be used to match a prefix (for example, ",(0,i.jsx)(r.code,{children:"jvm.*"}),"). By default, the metrics of some background activities are printed."]}),(0,i.jsx)(r.td,{children:'"metastorage", "placement-driver", "resource.vacuum"'})]})]})]}),"\n",(0,i.jsxs)(r.p,{children:["To add log exporter to cluster exporters list, run the following command and define all the metrics to print in ",(0,i.jsx)(r.code,{children:"enabledMetrics"})," list:"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'cluster config update ignite.metrics.exporters.logPush \'{"exporterName":"logPush","periodMillis":30000,"oneLinePerMetricSource":true,"enabledMetrics":[]}\'\n'})}),"\n",(0,i.jsx)(r.p,{children:"Updated exporters configuration should look like this:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{children:"exporters=[\r\n {\r\n enabledMetrics=[]\r\n exporterName=logPush\r\n name=logPush\r\n oneLinePerMetricSource=true\r\n periodMillis=30000\r\n }\r\n]\n"})}),"\n",(0,i.jsx)(r.h3,{id:"opentelemetry",children:"OpenTelemetry"}),"\n",(0,i.jsxs)(r.p,{children:["The ",(0,i.jsx)(r.a,{href:"https://opentelemetry.io/",children:"OpenTelemetry"})," exporter connects to an OpenTelemetry service that is provided in configuration and sends cluster information to it. Each node sends metrics independently, and requires access to the specified endpoint."]}),"\n",(0,i.jsx)(r.p,{children:"The example below shows the basic OpenTelemetry configuration. As OpenTelemetry services require different URL formats and may require headers, this example may not work for your environment."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'cluster config update ignite.metrics.exporters.test: {exporterName:otlp, endpoint:"http://localhost:9090/api/v1/otlp/v1/metrics", protocol:"http/protobuf"}\n'})}),"\n",(0,i.jsx)(r.p,{children:"OpenTelemetry exporter created by this command will look like this:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{children:'{\r\n compression=gzip\r\n endpoint="http://localhost:9090/api/v1/otlp/v1/metrics"\r\n exporterName=otlp\r\n headers=[]\r\n name=test\r\n periodMillis=30000\r\n protocol="http/protobuf"\r\n ssl {\r\n ciphers=""\r\n clientAuth=none\r\n enabled=false\r\n keyStore {\r\n password="********"\r\n path=""\r\n type=PKCS12\r\n }\r\n trustStore {\r\n password="********"\r\n path=""\r\n type=PKCS12\r\n }\r\n }\r\n },\n'})}),"\n",(0,i.jsx)(r.p,{children:"Below are the descriptions of configuration parameters:"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Name"}),(0,i.jsx)(r.th,{children:"Description"}),(0,i.jsx)(r.th,{children:"Default value"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"compression"}),(0,i.jsxs)(r.td,{children:["How the payload is compressed. Possible values: ",(0,i.jsx)(r.code,{children:"none"}),", ",(0,i.jsx)(r.code,{children:"gzip"}),"."]}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"gzip"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"endpoint"}),(0,i.jsx)(r.td,{children:"The OpenTelemetry endpoint. Each node resolves the endpoint individually."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"exporterName"}),(0,i.jsxs)(r.td,{children:["Exporter name. Must be ",(0,i.jsx)(r.code,{children:"otlp"})," to use OpenTelemetry."]}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"headers"}),(0,i.jsx)(r.td,{children:"Request headers, if any."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"name"}),(0,i.jsx)(r.td,{children:"User-defined exporter name, used to refer to it in Ignite."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"periodMillis"}),(0,i.jsx)(r.td,{children:"Export interval for the metrics, in milliseconds."}),(0,i.jsx)(r.td,{children:"30000"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"protocol"}),(0,i.jsxs)(r.td,{children:["The protocol that is used to send OpenTelemetry data. Possible values: ",(0,i.jsx)(r.code,{children:"grpc"}),", ",(0,i.jsx)(r.code,{children:"http/protobuf"}),"."]}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"grpc"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.ciphers"}),(0,i.jsx)(r.td,{children:"List of ciphers to enable, comma-separated. Empty for automatic cipher selection."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.clientAuth"}),(0,i.jsx)(r.td,{children:"Whether the SSL client authentication is enabled and whether it is mandatory."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.enabled"}),(0,i.jsx)(r.td,{children:"Defines if SSL is enabled."}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"false"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.keyStore.password"}),(0,i.jsx)(r.td,{children:"SSL keystore password."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.keyStore.path"}),(0,i.jsx)(r.td,{children:"Path to the SSL keystore."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.keyStore.type"}),(0,i.jsx)(r.td,{children:"Keystore type."}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"PKCS12"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.trustStore.password"}),(0,i.jsx)(r.td,{children:"Truststore password."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.trustStore.path"}),(0,i.jsx)(r.td,{children:"Path to the truststore."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.trustStore.type"}),(0,i.jsx)(r.td,{children:"Truststore type."}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"PKCS12"})})]})]})]}),"\n",(0,i.jsx)(r.h4,{id:"connection-to-grafana",children:"Connection to Grafana"}),"\n",(0,i.jsx)(r.p,{children:"When connecting to Grafana Cloud, you need to use the protobuf protocol and pass the authorization header in the configuration:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{children:'cluster config update ignite.metrics.exporters.test: {exporterName:otlp, endpoint:"https://otlp-gateway-prod-eu-west-2.grafana.net/otlp", protocol:"http/protobuf", headers {Authorization.header="Basic myBasicAuthKey"}}\n'})}),"\n",(0,i.jsx)(r.h4,{id:"connection-to-prometheus",children:"Connection to Prometheus"}),"\n",(0,i.jsxs)(r.p,{children:["When connecting to Prometheus, you need to use the protobuf protocol and send metrics to the ",(0,i.jsx)(r.code,{children:"/api/v1/otlp/v1/metrics"})," after the OTLP metrics receiver is enabled as described in ",(0,i.jsx)(r.a,{href:"https://prometheus.io/docs/guides/opentelemetry/",children:"Prometheus documentation"}),":"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{children:'cluster config update ignite.metrics.exporters.test: {exporterName:otlp, endpoint:"http://localhost:9090/api/v1/otlp/v1/metrics", protocol:"http/protobuf"}\n'})})]})}function h(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/1bfb13ba.3686dc10.js b/docs/ignite3/assets/js/1bfb13ba.3686dc10.js deleted file mode 100644 index c71683c67f..0000000000 --- a/docs/ignite3/assets/js/1bfb13ba.3686dc10.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8653],{28453:(e,r,n)=>{n.d(r,{R:()=>o,x:()=>l});var i=n(96540);const t={},s=i.createContext(t);function o(e){const r=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(s.Provider,{value:r},e.children)}},85774:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"understand/architecture/storage-engines/rocksdb","title":"RocksDB Storage Engine","description":"RocksDB support is experimental.","source":"@site/docs/understand/architecture/storage-engines/rocksdb.md","sourceDirName":"understand/architecture/storage-engines","slug":"/understand/architecture/storage-engines/rocksdb","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"id":"rocksdb","title":"RocksDB Storage Engine","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"AIPersist Storage Engine","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist"},"next":{"title":"Security Architecture","permalink":"/docs/ignite3/3.1.0/understand/architecture/security"}}');var t=n(74848),s=n(28453);const o={id:"rocksdb",title:"RocksDB Storage Engine",sidebar_position:2},l="RocksDB Storage Engine",d={},a=[{value:"LSM Tree Architecture",id:"lsm-tree-architecture",level:2},{value:"When to Use RocksDB",id:"when-to-use-rocksdb",level:2},{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Engine Configuration",id:"engine-configuration",level:2},{value:"Configuration Example",id:"configuration-example",level:2},{value:"Usage",id:"usage",level:2}];function c(e){const r={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",mermaid:"mermaid",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"rocksdb-storage-engine",children:"RocksDB Storage Engine"})}),"\n",(0,t.jsx)(r.admonition,{type:"warning",children:(0,t.jsx)(r.p,{children:"RocksDB support is experimental."})}),"\n",(0,t.jsxs)(r.p,{children:["The RocksDB engine (",(0,t.jsx)(r.code,{children:"rocksdb"}),") uses the RocksDB library with Log-Structured Merge (LSM) tree storage. LSM trees optimize for write throughput by buffering writes in memory and periodically flushing them to sorted disk files."]}),"\n",(0,t.jsx)(r.h2,{id:"lsm-tree-architecture",children:"LSM Tree Architecture"}),"\n",(0,t.jsx)(r.mermaid,{value:'flowchart TB\r\n subgraph "Memory"\r\n WB[Write Buffer
                                                              64 MB default]\r\n IMM[Immutable MemTable]\r\n end\r\n\r\n subgraph "Disk (Levels)"\r\n L0[Level 0
                                                              Unsorted SST Files]\r\n L1[Level 1
                                                              Sorted, Non-overlapping]\r\n L2[Level 2
                                                              Sorted, Non-overlapping]\r\n LN[Level N...]\r\n end\r\n\r\n Write[Write Operation] --\x3e WB\r\n WB --\x3e|"Buffer Full"| IMM\r\n IMM --\x3e|"Flush"| L0\r\n L0 --\x3e|"Compaction"| L1\r\n L1 --\x3e|"Compaction"| L2\r\n L2 --\x3e|"Compaction"| LN'}),"\n",(0,t.jsx)(r.p,{children:"LSM tree characteristics:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Write path"}),": Writes go to an in-memory buffer, then flush to Level 0 as sorted string table (SST) files"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Compaction"}),": Background process merges SST files and moves data to lower levels"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Read path"}),": Reads check the write buffer, then search levels from L0 downward"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Write amplification"}),": Data may be rewritten multiple times during compaction"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Space amplification"}),": Multiple versions exist temporarily during compaction"]}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"when-to-use-rocksdb",children:"When to Use RocksDB"}),"\n",(0,t.jsx)(r.p,{children:"RocksDB is suited for:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"Write-heavy workloads where sequential disk writes improve throughput"}),"\n",(0,t.jsx)(r.li,{children:"Time-series data with append-mostly patterns"}),"\n",(0,t.jsx)(r.li,{children:"Workloads tolerant of read amplification (multiple disk reads per query)"}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"Consider aipersist for:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"Read-heavy or balanced workloads"}),"\n",(0,t.jsx)(r.li,{children:"Point lookups requiring consistent latency"}),"\n",(0,t.jsx)(r.li,{children:"Workloads sensitive to write amplification"}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Default"}),(0,t.jsx)(r.th,{children:"Description"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"engine"})}),(0,t.jsx)(r.td,{children:"-"}),(0,t.jsxs)(r.td,{children:["Must be ",(0,t.jsx)(r.code,{children:'"rocksdb"'})]})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"sizeBytes"})}),(0,t.jsx)(r.td,{children:"Dynamic"}),(0,t.jsxs)(r.td,{children:["Storage allocation. Defaults to ",(0,t.jsx)(r.code,{children:"max(256 MB, 20% of physical RAM)"})]})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"writeBufferSizeBytes"})}),(0,t.jsx)(r.td,{children:"67108864"}),(0,t.jsx)(r.td,{children:"Write buffer size (64 MB)"})]})]})]}),"\n",(0,t.jsx)(r.h2,{id:"engine-configuration",children:"Engine Configuration"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Default"}),(0,t.jsx)(r.th,{children:"Description"})]})}),(0,t.jsx)(r.tbody,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"flushDelayMillis"})}),(0,t.jsx)(r.td,{children:"100"}),(0,t.jsx)(r.td,{children:"Delay before RAFT-triggered flush"})]})})]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"# Configure flush delay\r\nnode config update ignite.storage.engines.rocksdb.flushDelayMillis=50\n"})}),"\n",(0,t.jsx)(r.h2,{id:"configuration-example",children:"Configuration Example"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-json",children:'{\r\n "ignite": {\r\n "storage": {\r\n "profiles": [\r\n {\r\n "engine": "rocksdb",\r\n "name": "write_heavy_profile",\r\n "sizeBytes": 4294967296,\r\n "writeBufferSizeBytes": 134217728\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:'# CLI equivalent\r\nnode config update "ignite.storage.profiles:{write_heavy_profile{engine:rocksdb,sizeBytes:4294967296,writeBufferSizeBytes:134217728}}"\n'})}),"\n",(0,t.jsx)(r.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-sql",children:"-- Create a zone for write-heavy tables\r\nCREATE ZONE logging_zone\r\n WITH PARTITIONS=10, REPLICAS=2,\r\n STORAGE PROFILES ['write_heavy_profile'];\r\n\r\n-- Create a table for event logging\r\nCREATE TABLE events (\r\n event_id BIGINT PRIMARY KEY,\r\n event_type VARCHAR,\r\n payload VARCHAR,\r\n created_at TIMESTAMP\r\n) ZONE logging_zone STORAGE PROFILE 'write_heavy_profile';\n"})})]})}function h(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/1c440c53.01f48e3a.js b/docs/ignite3/assets/js/1c440c53.01f48e3a.js deleted file mode 100644 index 16f26ab4b7..0000000000 --- a/docs/ignite3/assets/js/1c440c53.01f48e3a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9496],{3536:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>d,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"develop/work-with-data/index","title":"Work with Data","description":"Core data manipulation and processing capabilities in Apache Ignite 3.","source":"@site/docs/develop/work-with-data/index.mdx","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Work with Data"},"sidebar":"tutorialSidebar","previous":{"title":"Python Database API Driver","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/python"},"next":{"title":"Table API","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/table-api"}}');var r=i(74848),n=i(28453);const d={title:"Work with Data"},t="Work with Data",c={},o=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const a={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components},{IIcon:i}=a;return i||function(e,a){throw new Error("Expected "+(a?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.header,{children:(0,r.jsx)(a.h1,{id:"work-with-data",children:"Work with Data"})}),"\n",(0,r.jsx)(a.p,{children:"Core data manipulation and processing capabilities in Apache Ignite 3."}),"\n",(0,r.jsx)(a.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,r.jsxs)("div",{className:"card-container",children:[(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:table",height:"24"})," Table API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Key-value and record-based operations using the Table API for direct data access."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/table-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:swap-horizontal-circle",height:"24"})," Transactions"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"ACID transactions with MVCC support for consistent data operations across the cluster."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/transactions",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:waves",height:"24"})," Data Streaming"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"High-throughput data ingestion using the streaming API for bulk data loading."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/streaming",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:server-network",height:"24"})," Compute"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Distributed computing with colocated processing for efficient data-local operations."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/compute",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:code-braces",height:"24"})," Serialization"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Custom object serialization for efficient data transfer and storage."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/serialization",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:package-variant-closed",height:"24"})," Code Deployment"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Deploy custom code units to cluster nodes for distributed execution."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/code-deployment",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:bell-outline",height:"24"})," Events"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"React to cluster events and data changes with the events API."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/events",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:format-list-bulleted",height:"24"})," Events List"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Complete reference of all available event types and their parameters."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/events-list",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"simple-icons:openjdk",height:"24"})," Java to Tables"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Create and manage tables programmatically from Java code."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/java-to-tables",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:file-document-outline",height:"24"})," Java Client Logging"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Configure logging for the Java thin client using System.Logger or popular frameworks."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./work-with-data/java-client-logging",children:"Learn more \u2192"})})]})]}),"\n",(0,r.jsx)(a.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(a.ul,{children:["\n",(0,r.jsxs)(a.li,{children:[(0,r.jsx)(a.a,{href:"connect-to-ignite",children:"Connect to Ignite"})," - Connection methods"]}),"\n",(0,r.jsxs)(a.li,{children:[(0,r.jsx)(a.a,{href:"../sql",children:"SQL Reference"})," - SQL operations"]}),"\n",(0,r.jsxs)(a.li,{children:[(0,r.jsx)(a.a,{href:"../api-reference",children:"API Reference"})," - Detailed API documentation"]}),"\n"]})]})}function h(e={}){const{wrapper:a}={...(0,n.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,a,i)=>{i.d(a,{R:()=>d,x:()=>t});var s=i(96540);const r={},n=s.createContext(r);function d(e){const a=s.useContext(n);return s.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function t(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/1c5cff81.7127c5f6.js b/docs/ignite3/assets/js/1c5cff81.7127c5f6.js deleted file mode 100644 index d0abbb3ffc..0000000000 --- a/docs/ignite3/assets/js/1c5cff81.7127c5f6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6946],{28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>l});var r=t(96540);const i={},s=r.createContext(i);function a(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:n},e.children)}},45599:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"configure-and-operate/installation/install-kubernetes","title":"Install on Kubernetes","description":"You can install Apache Ignite 3 and run an Apache Ignite cluster on Kubernetes cluster. This section describes all the necessary steps, as well as provides the configurations and manifests that you can copy and paste into your environment.","source":"@site/docs/configure-and-operate/installation/kubernetes.md","sourceDirName":"configure-and-operate/installation","slug":"/configure-and-operate/installation/install-kubernetes","permalink":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"install-kubernetes","title":"Install on Kubernetes","sidebar_label":"Kubernetes"},"sidebar":"tutorialSidebar","previous":{"title":"Docker","permalink":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker"},"next":{"title":"Configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/"}}');var i=t(74848),s=t(28453);const a={id:"install-kubernetes",title:"Install on Kubernetes",sidebar_label:"Kubernetes"},l=void 0,o={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Recommended Kubernetes Version",id:"recommended-kubernetes-version",level:3},{value:"Installation Steps",id:"installation-steps",level:2},{value:"Create ConfigMaps",id:"create-configmaps",level:3},{value:"Create and Deploy the Service",id:"create-and-deploy-the-service",level:3},{value:"Deploy the StatefulSet",id:"deploy-the-statefulset",level:3},{value:"Wait for Pods to Start",id:"wait-for-pods-to-start",level:3},{value:"Deploy the Job",id:"deploy-the-job",level:3},{value:"Installation Verification",id:"installation-verification",level:2},{value:"Installation Troubleshooting",id:"installation-troubleshooting",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"You can install Apache Ignite 3 and run an Apache Ignite cluster on Kubernetes cluster. This section describes all the necessary steps, as well as provides the configurations and manifests that you can copy and paste into your environment."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Using a Helm chart is recommended for production deployments, however, if you choose not to use Helm, this guide will walk you through installing Apache Ignite on Kubernetes manually."})}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsx)(n.h3,{id:"recommended-kubernetes-version",children:"Recommended Kubernetes Version"}),"\n",(0,i.jsx)(n.p,{children:"Apache Ignite 3 requires Kubernetes 1.20 or later."}),"\n",(0,i.jsx)(n.h2,{id:"installation-steps",children:"Installation Steps"}),"\n",(0,i.jsx)(n.h3,{id:"create-configmaps",children:"Create ConfigMaps"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Create the Apache Ignite configuration file. The minimum node configuration is as follows:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="ignite-config.conf"',children:'ignite: {\r\n network: {\r\n # Apache Ignite 3 node port\r\n port = 3344\r\n nodeFinder = {\r\n netClusterNodes = [\r\n # Kubernetes service to access the Apache Ignite 3 cluster on the Kubernetes network\r\n "ignite-svc-headless:3344"\r\n ]\r\n }\r\n }\r\n\r\n storage: {\r\n profiles = [\r\n {\r\n engine = "aipersist"\r\n name = "default"\r\n replacementMode = "CLOCK"\r\n # Explicit storage size configuration\r\n sizeBytes = 2147483648\r\n }\r\n ]\r\n }\r\n}\n'})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Create the ConfigMap object for Apache Ignite configuration:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl create configmap ignite-config -n --from-file=ignite-config.conf\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Replace ",(0,i.jsx)(n.code,{children:""})," with the name of the namespace where you want to deploy Apache Ignite."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:["In Kubernetes deployments, the ",(0,i.jsx)(n.code,{children:"ignite-config.conf"})," file is mounted as a read-only ConfigMap, so any attempt to update it with the ",(0,i.jsx)(n.code,{children:"node config update"})," command will fail."]}),(0,i.jsx)(n.p,{children:"To update Apache Ignite node configuration, modify the existing ConfigMap and restart all Apache Ignite pods."})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Modify previously configured ConfigMap object:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"kubectl edit configmap ignite-config -n \n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Restart Apache Ignite pod, repeat for every pod:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"kubectl delete pod -n \n"})}),"\n",(0,i.jsx)(n.h3,{id:"create-and-deploy-the-service",children:"Create and Deploy the Service"}),"\n",(0,i.jsx)(n.p,{children:"Depending on your requirements, define and deploy a Kubernetes service. Apache Ignite 3 use two types of services: one for internal cluster discovery, and the other for external client access."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["First, choose a type of service you need and prepare the ",(0,i.jsx)(n.code,{children:"service.yaml"})," file."]}),"\n"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["For communication inside the Kubernetes cluster, Use a headless service by setting the ",(0,i.jsx)(n.code,{children:"clusterIP"})," parameter to ",(0,i.jsx)(n.code,{children:"None"}),". This will expose each pod's IP, enabling Apache Ignite to be partition-aware: clients discover every node's address, determine which partition resides on which node, and send requests directly where the data is located."]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="service.yaml"',children:"apiVersion: v1\r\nkind: Service\r\nmetadata:\r\n # The name must be equal to netClusterNodes.\r\n name: ignite-svc-headless\r\n # Place your namespace name here.\r\n namespace: \r\nspec:\r\n clusterIP: None\r\n internalTrafficPolicy: Cluster\r\n ipFamilies:\r\n - IPv4\r\n ipFamilyPolicy: SingleStack\r\n ports:\r\n - name: management\r\n port: 10300\r\n protocol: TCP\r\n targetPort: 10300\r\n - name: rest\r\n port: 10800\r\n protocol: TCP\r\n targetPort: 10800\r\n - name: cluster\r\n port: 3344\r\n protocol: TCP\r\n targetPort: 3344\r\n selector:\r\n # Must be equal to the label set for pods.\r\n app: ignite\r\n # Include not-yet-ready nodes.\r\n publishNotReadyAddresses: True\r\n sessionAffinity: None\r\n type: ClusterIP\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Use a ",(0,i.jsx)(n.code,{children:"LoadBalancer"})," service to allow external clients to connect. Keep in mind, that with this option you giving up partition awareness."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["If your environments does not support ",(0,i.jsx)(n.code,{children:"LoadBalancer"}),", you can use ",(0,i.jsx)(n.code,{children:"type: NodePort"})," instead. Refer to the Kubernetes ",(0,i.jsx)(n.a,{href:"https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/",children:"documentation"})," for details."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"apiVersion: v1\r\nkind: Service\r\nmetadata:\r\n name: ignite-loadbalancer\r\n labels:\r\n app: ignite\r\nspec:\r\n type: LoadBalancer\r\n selector:\r\n app: ignite\r\n ports:\r\n - name: rest\r\n protocol: TCP\r\n port: 10800\r\n targetPort: 10800\r\n - name: client\r\n port: 10300\r\n protocol: TCP\r\n targetPort: 10300\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Then apply the ",(0,i.jsx)(n.code,{children:"service.yaml"})," file to set up this service:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl apply -f service.yaml\n"})}),"\n",(0,i.jsx)(n.h3,{id:"deploy-the-statefulset",children:"Deploy the StatefulSet"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Prepare the ",(0,i.jsx)(n.code,{children:"statefulset.yaml"})," file for StatefulSet deployment:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="statefulset.yaml"',children:'apiVersion: apps/v1\r\nkind: StatefulSet\r\nmetadata:\r\n # The cluster name.\r\n name: ignite-cluster\r\n # Place your namespace name.\r\n namespace: \r\nspec:\r\n # The initial number of pods to be started by Kubernetes.\r\n replicas: 2\r\n # Kubernetes service to access the Ignite 3 cluster on the Kubernetes network.\r\n serviceName: ignite-svc-headless\r\n selector:\r\n matchLabels:\r\n app: ignite\r\n template:\r\n metadata:\r\n labels:\r\n app: ignite\r\n spec:\r\n terminationGracePeriodSeconds: 60000\r\n containers:\r\n # Custom pod name.\r\n - name: ignite-node\r\n # Limits and requests for the Ignite container.\r\n resources:\r\n limits:\r\n cpu: "4"\r\n memory: 4Gi\r\n requests:\r\n cpu: "4"\r\n memory: 4Gi\r\n env:\r\n # Must be specified to ensure that Apache Ignite 3 cluster replicas are visible to each other.\r\n - name: IGNITE_NODE_NAME\r\n valueFrom:\r\n fieldRef:\r\n fieldPath: metadata.name\r\n # Apache Ignite 3 working directory.\r\n - name: IGNITE_WORK_DIR\r\n value: /ai3-work\r\n # Apache Ignite Docker image and its version.\r\n image: apache/ignite3:{version}\r\n ports:\r\n - containerPort: 10300\r\n - containerPort: 10800\r\n - containerPort: 3344\r\n volumeMounts:\r\n # The config will be placed at this path in the container.\r\n - mountPath: /opt/ignite/etc/ignite-config.conf\r\n name: config-vol\r\n subPath: ignite-config.conf\r\n # Ignite 3 working directory.\r\n - mountPath: /ai3-work\r\n name: persistence\r\n volumes:\r\n - name: config-vol\r\n configMap:\r\n name: ignite-config\r\n volumeClaimTemplates:\r\n - apiVersion: v1\r\n kind: PersistentVolumeClaim\r\n metadata:\r\n name: persistence\r\n spec:\r\n accessModes:\r\n - ReadWriteOnce\r\n resources:\r\n requests:\r\n storage: 10Gi # Provide enough space for your application data.\r\n volumeMode: Filesystem\n'})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Apply the ",(0,i.jsx)(n.code,{children:"statefulset.yaml"})," file to deploy the main components of Apache Ignite 3:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl apply -f statefulset.yaml\n"})}),"\n",(0,i.jsx)(n.h3,{id:"wait-for-pods-to-start",children:"Wait for Pods to Start"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Monitor the status of the pods:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl get pods -n -w\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Ensure that all pods' ",(0,i.jsx)(n.code,{children:"STATUS"})," is ",(0,i.jsx)(n.code,{children:"Running"})," before proceeding."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"deploy-the-job",children:"Deploy the Job"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Prepare the ",(0,i.jsx)(n.code,{children:"job.yaml"})," file for deploying the job:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="job.yaml"',children:"apiVersion: batch/v1\r\nkind: Job\r\nmetadata:\r\n name: cluster-init\r\n # Place your namespace name here.\r\n namespace: \r\nspec:\r\n template:\r\n spec:\r\n containers:\r\n # Command to init the cluster. URL and host must be the name of the service you created before. Port is 10300 as the management port.\r\n - args:\r\n - -ec\r\n - |\r\n apt update && apt-get install -y bind9-host\r\n IGNITE_NODES=$(host -tsrv _cluster._tcp.ignite-svc-headless | grep 'SRV record' | awk '{print $8}' | awk -F. '{print $1}' | paste -sd ',')\r\n /opt/ignite3cli/bin/ignite3 cluster init --name=ignite --url=http://ignite-svc-headless:10300\r\n command:\r\n - /bin/sh\r\n # Specify the Docker image with the Apache Ignite 3 CLI and its version.\r\n image: apache/ignite3:{version}\r\n imagePullPolicy: IfNotPresent\r\n name: cluster-init\r\n resources: {}\r\n restartPolicy: Never\r\n terminationGracePeriodSeconds: 120\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Apply the ",(0,i.jsx)(n.code,{children:"job.yaml"})," file to complete installation:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl apply -f job.yaml\n"})}),"\n",(0,i.jsx)(n.h2,{id:"installation-verification",children:"Installation Verification"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Check the status of all resources in your namespace:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl get all -n \n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Ensure that all components are running as expected, without errors, and that the initialization job is in the ",(0,i.jsx)(n.code,{children:"Completed"})," status."]}),"\n",(0,i.jsx)(n.li,{children:"Verify that your cluster is initialized and running:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl exec -it ignite-cluster-0 bash -n \r\n/opt/ignite3cli/bin/ignite3 cluster status\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The command output must include the name of your cluster and the number of nodes. The status must be ",(0,i.jsx)(n.code,{children:"ACTIVE"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"installation-troubleshooting",children:"Installation Troubleshooting"}),"\n",(0,i.jsx)(n.p,{children:"If any issues occur during the installation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Check the logs of specific pods:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl logs -n \n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Review events in the namespace:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl get events -n \n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/1d166f75.09cb10d9.js b/docs/ignite3/assets/js/1d166f75.09cb10d9.js deleted file mode 100644 index 3874f9b436..0000000000 --- a/docs/ignite3/assets/js/1d166f75.09cb10d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[965],{28453:(t,e,i)=>{i.d(e,{R:()=>r,x:()=>a});var s=i(96540);const n={},h=s.createContext(n);function r(t){const e=s.useContext(h);return s.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function a(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:r(t.components),s.createElement(h.Provider,{value:e},t.children)}},63367:(t,e,i)=>{i.d(e,{A:()=>W});var s=i(96540);const n={},h=!1,r=8,a=10,o="railroad-diagram",d=!0,l="center",c=8.5,w=7;class m{constructor(t,e,i){this.children=i||[],this.tagName=t,this.attrs=O(e,{})}format(t,e,i){}addTo(t){if(t instanceof m)return t.children.push(this),this;var e=this.toSVG();return t.appendChild(e),e}toSVG(){var t=function(t,e,i){e=e||{},i=i||"";var s=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e)"xlink:href"===n?s.setAttributeNS("http://www.w3.org/1999/xlink","href",e[n]):s.setAttribute(n,e[n]);return s.textContent=i,s}(this.tagName,this.attrs);return"string"==typeof this.children?t.textContent=this.children:this.children.forEach(function(e){t.appendChild(e.toSVG())}),t}toString(){var t="<"+this.tagName,e="g"==this.tagName||"svg"==this.tagName;for(var i in this.attrs)t+=" "+i+'="'+(this.attrs[i]+"").replace(/&/g,"&").replace(/"/g,""")+'"';return t+=">",e&&(t+="\n"),"string"==typeof this.children?t+=this.children.replace(/[*_\`\[\]<&]/g,function(t){return"&#"+t.charCodeAt(0)+";"}):this.children.forEach(function(e){t+=e}),t+="\n"}walk(t){t(this)}}class u extends m{constructor(t,e){super("path"),this.attrs.d="M"+t+" "+e}m(t,e){return this.attrs.d+="m"+t+" "+e,this}h(t){return this.attrs.d+="h"+t,this}right(t){return this.h(Math.max(0,t))}left(t){return this.h(-Math.max(0,t))}v(t){return this.attrs.d+="v"+t,this}down(t){return this.v(Math.max(0,t))}up(t){return this.v(-Math.max(0,t))}arc(t){var e,i=a,s=a;return"e"!=t[0]&&"w"!=t[1]||(i*=-1),"s"!=t[0]&&"n"!=t[1]||(s*=-1),e="ne"==t||"es"==t||"sw"==t||"wn"==t?1:0,this.attrs.d+="a"+a+" "+a+" 0 0 "+e+" "+i+" "+s,this}arc_8(t,e){const i=a,s=1/Math.sqrt(2)*i,n=i-s;let h="a "+i+" "+i+" 0 0 "+("cw"==e?"1":"0")+" ";const r=t+e;return h+=("ncw"==r?[s,n]:"necw"==r?[n,s]:"ecw"==r?[-n,s]:"secw"==r?[-s,n]:"scw"==r?[-s,-n]:"swcw"==r?[-n,-s]:"wcw"==r?[n,-s]:"nwcw"==r?[s,-n]:"nccw"==r?[-s,n]:"nwccw"==r?[-n,s]:"wccw"==r?[n,s]:"swccw"==r?[s,n]:"sccw"==r?[s,-n]:"seccw"==r?[n,-s]:"eccw"==r?[-n,-s]:"neccw"==r?[-s,-n]:null).join(" "),this.attrs.d+=h,this}l(t,e){return this.attrs.d+="l"+t+" "+e,this}format(){return this.attrs.d+="h.5",this}}class p extends m{constructor(t,e,i,s){super(t,i,s),this.items=e.map(L)}walk(t){t(this),this.items.forEach(e=>e.walk(t))}}class g extends p{constructor(...t){super("svg",t,{class:o}),this.items[0]instanceof y||this.items.unshift(new y),this.items[this.items.length-1]instanceof P||this.items.push(new P),this.up=this.down=this.height=this.width=0;for(const e of this.items)this.width+=e.width+(e.needsSpace?20:0),this.up=Math.max(this.up,e.up-this.height),this.height+=e.height,this.down=Math.max(this.down-e.height,e.down);this.formatted=!1}format(t,e,i,s){t=O(t,20),e=O(e,t,20),i=O(i,t,20);var n=s=O(s,e,20),h=t;h+=this.up;for(var r=new m("g",d?{transform:"translate(.5 .5)"}:{}),a=0;anew g(...t);class x extends m{constructor(...t){var e=new g(...t);return e.items[0]=new y({type:"complex"}),e.items[e.items.length-1]=new P({type:"complex"}),e}}n.ComplexDiagram=(...t)=>new x(...t);class f extends p{constructor(...t){super("g",t);this.items.length;this.needsSpace=!0,this.up=this.down=this.height=this.width=0;for(var e=0;e0&&(new u(t,e).h(10).addTo(this),t+=10),h.format(t,e,h.width).addTo(this),t+=h.width,e+=h.height,h.needsSpace&&nnew f(...t);class T extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("Stack() must have at least one child.");this.width=Math.max.apply(null,this.items.map(function(t){return t.width+(t.needsSpace?20:0)})),this.items.length>1&&(this.width+=2*a),this.needsSpace=!0,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=0;for(var e=this.items.length-1,i=0;i0&&(this.height+=Math.max(2*a,s.up+r)),i1&&(new u(t,e).h(a).addTo(this),t+=a);for(var h=0;h1?2*a:0);o.format(t,e,d).addTo(this),t+=d,e+=o.height,h!==this.items.length-1&&(new u(t,e).arc("ne").down(Math.max(0,o.down+r-2*a)).arc("es").left(d).arc("nw").down(Math.max(0,this.items[h+1].up+r-2*a)).arc("ws").addTo(this),e+=Math.max(o.down+r,2*a)+Math.max(this.items[h+1].up+r,2*a),t=n+a)}return this.items.length>1&&(new u(t,e).h(a).addTo(this),t+=a),new u(t,e).h(s[1]).addTo(this),this}}n.Stack=(...t)=>new T(...t);class E extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("OptionalSequence() must have at least one child.");if(1===t.length)return new f(t);var e=a;this.needsSpace=!1,this.width=0,this.up=0,this.height=q(this.items,function(t){return t.height}),this.down=this.items[0].down;for(var i=0,s=0;s0&&(this.down=Math.max(this.height+this.down,i+Math.max(2*e,n.down+r))-this.height);var o=(n.needsSpace?10:0)+n.width;this.width+=0===s?e+Math.max(o,e):2*e+Math.max(o,e)+e}h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="optseq")}format(t,e,i){var s=a,n=_(i,this.width);new u(t,e).right(n[0]).addTo(this),new u(t+n[0]+this.width,e+this.height).right(n[1]).addTo(this),t+=n[0];for(var h=e-this.up,o=this.items.length-1,d=0;dnew E(...t);class j extends p{constructor(...t){if(super("g",t),1===t.length)return new f(t);if(2!==t.length)throw new RangeError("AlternatingSequence() must have one or two children.");this.needsSpace=!1;const e=a,i=r,s=Math.max,n=this.items[0],o=this.items[1],d=1/Math.sqrt(2)*e*2,l=(1-1/Math.sqrt(2))*e*2,c=Math.max(e,r),w=c-l+d,m=s(e+e,c/2+e+e,c/2+i+n.down);this.up=m+n.height+n.up;const u=s(e+e,c/2+e+e,c/2+i+o.up);this.down=u+o.height+o.down,this.height=0;const p=2*(n.needsSpace?10:0)+n.width,g=2*(o.needsSpace?10:0)+o.width;this.width=2*e+s(p,w,g)+2*e,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="altseq")}format(t,e,i){const s=a,n=_(i,this.width);new u(t,e).right(n[0]).addTo(this),t+=n[0],new u(t+this.width,e).right(n[1]).addTo(this);const h=this.items[0],o=this.items[1],d=this.up-h.up,l=this.up-h.up-h.height;new u(t,e).arc("se").up(d-2*s).arc("wn").addTo(this),h.format(t+2*s,e-d,this.width-4*s).addTo(this),new u(t+this.width-2*s,e-l).arc("ne").down(l-2*s).arc("ws").addTo(this);const c=this.down-o.down-o.height,w=this.down-o.down;new u(t,e).arc("ne").down(c-2*s).arc("ws").addTo(this),o.format(t+2*s,e+c,this.width-4*s).addTo(this),new u(t+this.width-2*s,e+w).arc("se").up(w-2*s).arc("wn").addTo(this);const m=1/Math.sqrt(2)*s*2,p=(1-1/Math.sqrt(2))*s*2,g=Math.max(s,r),x=g-p+m,f=(this.width-4*s-x)/2;return new u(t+s,e-g/2-s).arc("ws").right(f).arc_8("n","cw").l(x-m,g-p).arc_8("sw","ccw").right(f).arc("ne").addTo(this),new u(t+s,e+g/2+s).arc("wn").right(f).arc_8("s","ccw").l(x-m,-(g-p)).arc_8("nw","cw").right(f).arc("se").addTo(this),this}}n.AlternatingSequence=(...t)=>new j(...t);class S extends p{constructor(t,...e){if(super("g",e),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of Choice() must be an integer.");if(t<0||t>=e.length)throw new RangeError("The first argument of Choice() must be an index for one of the items.");this.normal=t;var i,s=e.length-1;this.width=Math.max.apply(null,this.items.map(function(t){return t.width}))+4*a,this.height=this.items[t].height,this.up=this.items[0].up;for(var n=0;n=0;d--){let i=this.items[d];d==this.normal-1&&(n=Math.max(2*a,this.items[this.normal].up+r+i.down+i.height)),new u(t,e).arc("se").up(n-2*a).arc("wn").addTo(this),i.format(t+2*a,e-n,o).addTo(this),new u(t+2*a+o,e-n+i.height).arc("ne").down(n-i.height+this.height-2*a).arc("ws").addTo(this),n+=Math.max(a,i.up+r+(0===d?0:this.items[d-1].down+this.items[d-1].height))}for(new u(t,e).right(2*a).addTo(this),this.items[this.normal].format(t+2*a,e,o).addTo(this),new u(t+2*a+o,e+this.height).right(2*a).addTo(this),d=this.normal+1;d<=h;d++){let i=this.items[d];d==this.normal+1&&(n=Math.max(2*a,this.height+this.items[this.normal].down+r+i.up)),new u(t,e).arc("ne").down(n-2*a).arc("ws").addTo(this),i.format(t+2*a,e+n,o).addTo(this),new u(t+2*a+o,e+n+i.height).arc("se").up(n-2*a+i.height-this.height).arc("wn").addTo(this),n+=Math.max(a,i.height+i.down+r+(d==h?0:this.items[d+1].up))}return this}}n.Choice=(...t)=>new S(...t);class v extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("HorizontalChoice() must have at least one child.");if(1===t.length)return new f(t);const e=this.items.slice(0,-1),i=this.items.slice(1,-1),s=this.items[0],n=this.items[this.items.length-1];this.needsSpace=!1,this.width=a,this.width+=2*a*(this.items.length-1),this.width+=q(this.items,t=>t.width+(t.needsSpace?20:0)),this.width+=n.height>0?a:0,this.width+=a,this.height=0,this._upperTrack=Math.max(2*a,r,F(e,t=>t.up)+r),this.up=Math.max(this._upperTrack,n.up),this._lowerTrack=Math.max(r,F(i,t=>t.height+Math.max(t.down+r,2*a)),n.height+n.down+r),s.heightt.width+(t.needsSpace?20:0))+(this.items.length-2)*a*2-a;new u(t,e).arc("se").v(-(this._upperTrack-2*a)).arc("wn").h(o).addTo(this);var d=q(r,t=>t.width+(t.needsSpace?20:0))+(this.items.length-2)*a*2+(h.height>0?a:0)-a,l=t+a+n.width+(n.needsSpace?20:0)+2*a;new u(l,e+this._lowerTrack).h(d).arc("se").v(-(this._lowerTrack-2*a)).arc("wn").addTo(this);for(const[w,m]of function*(t){var e=0;for(const i of t)yield[e,i],e++}(this.items)){0===w?(new u(t,e).h(a).addTo(this),t+=a):(new u(t,e-this._upperTrack).arc("ne").v(this._upperTrack-2*a).arc("ws").addTo(this),t+=2*a);var c=m.width+(m.needsSpace?20:0);m.format(t,e,c).addTo(this),t+=c,w===this.items.length-1?0===m.height?new u(t,e).h(a).addTo(this):new u(t,e+m.height).arc("se").addTo(this):0===w&&m.height>this._lowerTrack?m.height-this._lowerTrack>=2*a?new u(t,e+m.height).arc("se").v(this._lowerTrack-m.height+2*a).arc("wn").addTo(this):new u(t,e+m.height).l(2*a,this._lowerTrack-m.height).addTo(this):new u(t,e+m.height).arc("ne").v(this._lowerTrack-m.height-2*a).arc("ws").addTo(this)}return this}}n.HorizontalChoice=(...t)=>new v(...t);class R extends p{constructor(t,e,...i){if(super("g",i),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of MultipleChoice() must be an integer.");if(t<0||t>=i.length)throw new RangeError("The first argument of MultipleChoice() must be an index for one of the items.");if(this.normal=t,"any"!=e&&"all"!=e)throw new SyntaxError("The second argument of MultipleChoice must be 'any' or 'all'.");this.type=e,this.needsSpace=!0,this.innerWidth=F(this.items,function(t){return t.width}),this.width=30+a+this.innerWidth+a+20,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=this.items[t].height;for(var s=0;st&&(this.down+=Math.max(e,i.up+r+this.items[s-1].down+this.items[s-1].height))}this.down-=this.items[t].height,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="multiplechoice")}format(t,e,i){var s=_(i,this.width);new u(t,e).right(s[0]).addTo(this),new u(t+s[0]+this.width,e+this.height).right(s[1]).addTo(this),t+=s[0];for(var n,h=this.items[this.normal],o=this.normal-1;o>=0;o--){var d=this.items[o];o==this.normal-1&&(n=Math.max(10+a,h.up+r+d.down+d.height)),new u(t+30,e).up(n-a).arc("wn").addTo(this),d.format(t+30+a,e-n,this.innerWidth).addTo(this),new u(t+30+a+this.innerWidth,e-n+d.height).arc("ne").down(n-d.height+this.height-a-10).addTo(this),0!==o&&(n+=Math.max(a,d.up+r+this.items[o-1].down+this.items[o-1].height))}for(new u(t+30,e).right(a).addTo(this),h.format(t+30+a,e,this.innerWidth).addTo(this),new u(t+30+a+this.innerWidth,e+this.height).right(a).addTo(this),o=this.normal+1;onew R(...t);class b extends m{constructor(t,e){if(void 0===e)return new S(1,new D,t);if("skip"===e)return new S(0,new D,t);throw"Unknown value for Optional()'s 'skip' argument."}}n.Optional=(...t)=>new b(...t);class N extends m{constructor(t,e){super("g"),e=e||new D,this.item=L(t),this.rep=L(e),this.width=Math.max(this.item.width,this.rep.width)+2*a,this.height=this.item.height,this.up=this.item.up,this.down=Math.max(2*a,this.item.down+r+this.rep.up+this.rep.height+this.rep.down),this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="oneormore")}format(t,e,i){var s=_(i,this.width);new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e+this.height).h(s[1]).addTo(this),t+=s[0],new u(t,e).right(a).addTo(this),this.item.format(t+a,e,this.width-2*a).addTo(this),new u(t+this.width-a,e+this.height).right(a).addTo(this);var n=Math.max(2*a,this.item.height+this.item.down+r+this.rep.up);return new u(t+a,e).arc("nw").down(n-2*a).arc("ws").addTo(this),this.rep.format(t+a,e+n,this.width-2*a).addTo(this),new u(t+this.width-a,e+n+this.rep.height).arc("se").up(n-2*a+this.rep.height-this.item.height).arc("en").addTo(this),this}walk(t){t(this),this.item.walk(t),this.rep.walk(t)}}n.OneOrMore=(...t)=>new N(...t);class M extends m{constructor(t,e,i){return new b(new N(t,e),i)}}n.ZeroOrMore=(...t)=>new M(...t);class I extends m{constructor(t,e){super("g"),this.item=L(t),this.label=e instanceof m?e:e?new C(e):void 0,this.width=Math.max(this.item.width+(this.item.needsSpace?20:0),this.label?this.label.width:0,2*a),this.height=this.item.height,this.boxUp=this.up=Math.max(this.item.up+r,a),this.label&&(this.up+=this.label.up+this.label.height+this.label.down),this.down=Math.max(this.item.down+r,a),this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="group")}format(t,e,i){var s=_(i,this.width);return new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e+this.height).h(s[1]).addTo(this),t+=s[0],new m("rect",{x:t,y:e-this.boxUp,width:this.width,height:this.boxUp+this.height+this.down,rx:a,ry:a,class:"group-box"}).addTo(this),this.item.format(t,e,this.width).addTo(this),this.label&&this.label.format(t,e-(this.boxUp+this.label.down+this.label.height),this.label.width).addTo(this),this}walk(t){t(this),this.item.walk(t),this.label.walk(t)}}n.Group=(...t)=>new I(...t);class y extends m{constructor({type:t="simple",label:e}={}){super("g"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,e&&(this.label=""+e,this.width=Math.max(20,this.label.length*c+10)),h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="start")}format(t,e){let i=new u(t,e-10);return"complex"===this.type?i.down(20).m(0,-10).right(this.width).addTo(this):i.down(20).m(10,-20).down(20).m(-10,-10).right(this.width).addTo(this),this.label&&new m("text",{x:t,y:e-15,style:"text-anchor:start"},this.label).addTo(this),this}}n.Start=(...t)=>new y(...t);class P extends m{constructor({type:t="simple"}={}){super("path"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="end")}format(t,e){return"complex"===this.type?this.attrs.d="M "+t+" "+e+" h 20 m 0 -10 v 20":this.attrs.d="M "+t+" "+e+" h 20 m -10 -10 v 20 m 10 -20 v 20",this}}n.End=(...t)=>new P(...t);class U extends m{constructor(t,{href:e,title:i,cls:s}={}){super("g",{class:["terminal",s].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=s,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="terminal")}format(t,e,i){var s=_(i,this.width);new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e).h(s[1]).addTo(this),t+=s[0],new m("rect",{x:t,y:e-11,width:this.width,height:this.up+this.down,rx:10,ry:10}).addTo(this);var n=new m("text",{x:t+this.width/2,y:e+4},this.text);return this.href?new m("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new m("title",{},[this.title]).addTo(this),this}}n.Terminal=(...t)=>new U(...t);class A extends m{constructor(t,{href:e,title:i,cls:s=""}={}){super("g",{class:["non-terminal",s].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=s,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="nonterminal")}format(t,e,i){var s=_(i,this.width);new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e).h(s[1]).addTo(this),t+=s[0],new m("rect",{x:t,y:e-11,width:this.width,height:this.up+this.down}).addTo(this);var n=new m("text",{x:t+this.width/2,y:e+4},this.text);return this.href?new m("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new m("title",{},[this.title]).addTo(this),this}}n.NonTerminal=(...t)=>new A(...t);class C extends m{constructor(t,{href:e,title:i,cls:s=""}={}){super("g",{class:["comment",s].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=s,this.width=this.text.length*w+10,this.height=0,this.up=8,this.down=8,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="comment")}format(t,e,i){var s=_(i,this.width);new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e+this.height).h(s[1]).addTo(this),t+=s[0];var n=new m("text",{x:t+this.width/2,y:e+5,class:"comment"},this.text);return this.href?new m("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new m("title",{},this.title).addTo(this),this}}n.Comment=(...t)=>new C(...t);class D extends m{constructor(){super("g"),this.width=0,this.height=0,this.up=0,this.down=0,this.needsSpace=!1,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="skip")}format(t,e,i){return new u(t,e).right(i).addTo(this),this}}n.Skip=(...t)=>new D(...t);class k extends m{constructor({width:t=50,up:e=15,height:i=25,down:s=15,needsSpace:n=!0}={}){super("g"),this.width=t,this.height=i,this.up=e,this.down=s,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="block")}format(t,e,i){var s=_(i,this.width);return new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e).h(s[1]).addTo(this),t+=s[0],new m("rect",{x:t,y:e-this.up,width:this.width,height:this.up+this.height+this.down}).addTo(this),this}}function O(...t){return t.reduce(function(t,e){return void 0!==t?t:e})}function _(t,e){var i=t-e;switch(l){case"left":return[0,i];case"right":return[i,0];default:return[i/2,i/2]}}function L(t){return t instanceof m?t:new U(""+t)}function q(t,e){return e||(e=function(t){return t}),t.map(e).reduce(function(t,e){return t+e},0)}function F(t,e){return e||(e=function(t){return t}),Math.max.apply(null,t.map(e))}n.Block=(...t)=>new k(...t);var V=i(74848);function W({children:t}){const e=(0,s.useRef)(null),i=(0,s.useRef)(null),[n,h]=(0,s.useState)(!1),r=e=>{if(e.current)try{const s=(...t)=>new g(...t),n=(...t)=>new U(...t),h=(...t)=>new A(...t),r=(...t)=>new b(...t),a=(...t)=>new f(...t),o=(...t)=>new S(...t),d=(...t)=>new D(...t),l=(...t)=>new C(...t),c=(...t)=>new N(...t),w=(...t)=>new M(...t),m=t.replace(/ComplexDiagram\(/g,"Diagram(").replace(/Start\([^)]*\),?\s*/g,"").replace(/,?\s*End\([^)]*\)/g,"").trim();try{const t=new Function("Diagram","Terminal","NonTerminal","Optional","Sequence","Choice","Skip","Comment","OneOrMore","ZeroOrMore",`'use strict'; return ${m};`)(s,n,h,r,a,o,d,l,c,w);if(!t||"function"!=typeof t.toSVG)throw new Error("Diagram function did not return a valid diagram object");e.current.innerHTML="";const i=t.toSVG();i.querySelectorAll("a[*|href]").forEach(t=>{const e=t.getAttributeNS("http://www.w3.org/1999/xlink","href");e&&t.setAttribute("href",e)}),e.current.appendChild(i)}catch(i){throw console.error("Error in diagram generation:",i),i}}catch(s){console.error("Error rendering railroad diagram:",s),e.current.innerHTML='

                                                              Error rendering diagram. Check console for details.

                                                              '}};(0,s.useEffect)(()=>{r(e)},[t]),(0,s.useEffect)(()=>{if(n){r(i);const t=t=>{"Escape"===t.key&&h(!1)};return document.addEventListener("keydown",t),document.body.style.overflow="hidden",()=>{document.removeEventListener("keydown",t),document.body.style.overflow=""}}},[n,t]);return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)("div",{className:"railroad-diagram-wrapper",children:[(0,V.jsx)("button",{className:"railroad-expand-button",onClick:()=>h(!0),"aria-label":"Expand diagram",title:"View full size",children:(0,V.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:(0,V.jsx)("path",{d:"M1.5 1a.5.5 0 0 0-.5.5v4a.5.5 0 0 1-1 0v-4A1.5 1.5 0 0 1 1.5 0h4a.5.5 0 0 1 0 1h-4zM10 .5a.5.5 0 0 1 .5-.5h4A1.5 1.5 0 0 1 16 1.5v4a.5.5 0 0 1-1 0v-4a.5.5 0 0 0-.5-.5h-4a.5.5 0 0 1-.5-.5zM.5 10a.5.5 0 0 1 .5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 1 0 1h-4A1.5 1.5 0 0 1 0 14.5v-4a.5.5 0 0 1 .5-.5zm15 0a.5.5 0 0 1 .5.5v4a1.5 1.5 0 0 1-1.5 1.5h-4a.5.5 0 0 1 0-1h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 1 .5-.5z"})})}),(0,V.jsx)("div",{ref:e,className:"railroad-diagram-container"})]}),n&&(0,V.jsx)("div",{className:"railroad-modal-overlay",onClick:t=>{t.target===t.currentTarget&&h(!1)},children:(0,V.jsxs)("div",{className:"railroad-modal-content",children:[(0,V.jsx)("button",{className:"railroad-modal-close",onClick:()=>h(!1),"aria-label":"Close",title:"Close (ESC)",children:"\xd7"}),(0,V.jsx)("div",{ref:i,className:"railroad-diagram-container railroad-diagram-modal"})]})})]})}},93213:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>d,contentTitle:()=>o,default:()=>w,frontMatter:()=>a,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"sql/advanced/explain-statement","title":"EXPLAIN Statement","description":"The EXPLAIN command is used to display the execution plan of an SQL query, showing how the query will be processed by the SQL engine.","source":"@site/docs/sql/advanced/explain-statement.mdx","sourceDirName":"sql/advanced","slug":"/sql/advanced/explain-statement","permalink":"/docs/ignite3/3.1.0/sql/advanced/explain-statement","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"id":"explain-statement","title":"EXPLAIN Statement","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Advanced SQL","permalink":"/docs/ignite3/3.1.0/sql/advanced/"},"next":{"title":"Performance Tuning","permalink":"/docs/ignite3/3.1.0/sql/advanced/performance-tuning"}}');var n=i(74848),h=i(28453),r=i(63367);const a={id:"explain-statement",title:"EXPLAIN Statement",sidebar_position:2},o="EXPLAIN Command",d={},l=[{value:"Syntax",id:"syntax",level:2},{value:"Understanding The Output",id:"understanding-the-output",level:2},{value:"Operator Naming",id:"operator-naming",level:3},{value:"Hierarchical Plan Structure",id:"hierarchical-plan-structure",level:3},{value:"Examples",id:"examples",level:2},{value:"Example: Complex Join",id:"example-complex-join",level:3},{value:"Example: Query Mapping",id:"example-query-mapping",level:3}];function c(t){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,h.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"explain-command",children:"EXPLAIN Command"})}),"\n",(0,n.jsxs)(e.p,{children:["The ",(0,n.jsx)(e.code,{children:"EXPLAIN"})," command is used to display the execution plan of an SQL query, showing how the query will be processed by the SQL engine.\r\nIt provides insights into the relational operators used, their configuration, and the estimated number of rows processed at each step.\r\nThis information is essential for diagnosing performance bottlenecks and understanding query optimization decisions."]}),"\n",(0,n.jsx)(e.h2,{id:"syntax",children:"Syntax"}),"\n",(0,n.jsx)(r.A,{children:"\nDiagram(\nTerminal('EXPLAIN'),\nOptional(\nSequence(\nChoice(\n0,\nTerminal('PLAN'),\nTerminal('MAPPING')\n),\nTerminal('FOR')\n)\n),\nNonTerminal('query_or_dml')\n)\n"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"EXPLAIN [PLAN | MAPPING FOR] query_or_dml\n"})}),"\n",(0,n.jsxs)(e.p,{children:["If neither ",(0,n.jsx)(e.code,{children:"PLAN"})," nor ",(0,n.jsx)(e.code,{children:"MAPPING"})," is specified, then ",(0,n.jsx)(e.code,{children:"PLAN"})," is implicit."]}),"\n",(0,n.jsx)(e.p,{children:"Parameters:"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"PLAN"})," - explains query in terms of relational operators tree.\r\nThis representation is suitable for investigation of performance issues related to the optimizer."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"MAPPING"})," - explains query in terms of mapping of query fragment to a particular node of the cluster.\r\nThis representation is suitable for investigation of performance issues related to the data colocation."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"Examples:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"EXPLAIN SELECT * FROM lineitem;\r\nEXPLAIN PLAN FOR SELECT * FROM lineitem;\r\nEXPLAIN MAPPING FOR SELECT * FROM lineitem;\n"})}),"\n",(0,n.jsx)(e.h2,{id:"understanding-the-output",children:"Understanding The Output"}),"\n",(0,n.jsxs)(e.p,{children:["Each query plan is represented as a tree-like structure composed of ",(0,n.jsx)(e.a,{href:"/3.1.0/understand/performance/explain-operators",children:(0,n.jsx)(e.strong,{children:"relational operators"})}),"."]}),"\n",(0,n.jsx)(e.p,{children:"A node in the plan includes:"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:["A ",(0,n.jsx)(e.strong,{children:"name"}),", indicating the relational operator (e.g., ",(0,n.jsx)(e.code,{children:"TableScan"}),", ",(0,n.jsx)(e.code,{children:"IndexScan"}),", ",(0,n.jsx)(e.code,{children:"Sort"}),", ",(0,n.jsx)(e.code,{children:"Join"})," types)"]}),"\n",(0,n.jsxs)(e.li,{children:["A set of ",(0,n.jsx)(e.strong,{children:"attributes"}),", relevant to that specific operator"]}),"\n"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-text",children:"OperatorName\r\n attribute1: value1\r\n attribute2: value2\n"})}),"\n",(0,n.jsx)(e.p,{children:"Examples:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-text",children:"TableScan // Full table access\r\n table: PUBLIC.EMP\r\n fieldNames: [NAME, SALARY]\r\n est: (rows=1)\r\n\r\nIndexScan // Index-based access\r\n table: PUBLIC.EMP\r\n index: EMP_NAME_DESC_IDX\r\n type: SORTED\r\n fields: [NAME]\r\n collation: [NAME DESC]\r\n est: (rows=1)\r\n\r\nSort // Sort rows\r\n collation: [NAME DESC NULLS LAST]\r\n est: (rows=1)\n"})}),"\n",(0,n.jsx)(e.h3,{id:"operator-naming",children:"Operator Naming"}),"\n",(0,n.jsx)(e.p,{children:"The operator name reflects the specific algorithm or strategy used.\r\nFor example:"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"TableScan"})," \u2013 Full scan of a base table."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"IndexScan"})," \u2013 Access via index, possibly sorted."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"Sort"})," \u2013 Explicit sorting step."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"HashJoin"}),", ",(0,n.jsx)(e.code,{children:"MergeJoin"}),", ",(0,n.jsx)(e.code,{children:"NestedLoopJoin"})," \u2013 Types of join algorithms."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"Limit"}),", ",(0,n.jsx)(e.code,{children:"Project"}),", ",(0,n.jsx)(e.code,{children:"Exchange"})," \u2013 Execution-related transformations and controls."]}),"\n"]}),"\n",(0,n.jsx)(e.h3,{id:"hierarchical-plan-structure",children:"Hierarchical Plan Structure"}),"\n",(0,n.jsxs)(e.p,{children:["The plan is structured as a ",(0,n.jsx)(e.strong,{children:"tree"}),", where:"]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.strong,{children:"Leaf nodes"})," represent data sources (e.g., ",(0,n.jsx)(e.code,{children:"TableScan"}),")"]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.strong,{children:"Internal nodes"})," represent data transformations (e.g., ",(0,n.jsx)(e.code,{children:"Join"}),", ",(0,n.jsx)(e.code,{children:"Sort"}),")"]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.strong,{children:"The root node"})," (topmost) is the final operator that produces the result"]}),"\n"]}),"\n",(0,n.jsx)(e.h2,{id:"examples",children:"Examples"}),"\n",(0,n.jsx)(e.h3,{id:"example-complex-join",children:"Example: Complex Join"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"EXPLAIN PLAN FOR\r\n SELECT\r\n U.UserName, P.ProductName, R.ReviewText, R.Rating\r\n FROM Users U, Reviews R, Products P\r\n WHERE U.UserID = R.UserID\r\n AND R.ProductID = P.ProductID\r\n AND P.ProductName = 'Product_' || ?::varchar\n"})}),"\n",(0,n.jsx)(e.p,{children:"The resulting output is:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-text",children:"Project\r\n fieldNames: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n projection: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n est: (rows=16650)\r\n HashJoin\r\n predicate: =(USERID$0, USERID)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME, USERID$0, USERNAME]\r\n type: inner\r\n est: (rows=16650)\r\n HashJoin\r\n predicate: =(PRODUCTID, PRODUCTID$0)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME]\r\n type: inner\r\n est: (rows=16650)\r\n Exchange\r\n distribution: single\r\n est: (rows=50000)\r\n TableScan\r\n table: PUBLIC.REVIEWS\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n est: (rows=50000)\r\n Exchange\r\n distribution: single\r\n est: (rows=1665)\r\n TableScan\r\n table: PUBLIC.PRODUCTS\r\n predicate: =(PRODUCTNAME, ||(_UTF-8'Product_', CAST(?0):VARCHAR CHARACTER SET \"UTF-8\"))\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n est: (rows=1665)\r\n Exchange\r\n distribution: single\r\n est: (rows=10000)\r\n TableScan\r\n table: PUBLIC.USERS\r\n fieldNames: [USERID, USERNAME]\r\n est: (rows=10000)\n"})}),"\n",(0,n.jsxs)(e.p,{children:["This execution plan represents a query that joins three tables: ",(0,n.jsx)(e.code,{children:"USERS"}),", ",(0,n.jsx)(e.code,{children:"REVIEWS"}),", and ",(0,n.jsx)(e.code,{children:"PRODUCTS"}),", and selects four fields after filtering by product name."]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.strong,{children:"Project"})," (root node):\r\nOutputs the final selected fields: ",(0,n.jsx)(e.code,{children:"USERNAME"}),", ",(0,n.jsx)(e.code,{children:"PRODUCTNAME"}),", ",(0,n.jsx)(e.code,{children:"REVIEWTEXT"}),", and ",(0,n.jsx)(e.code,{children:"RATING"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.strong,{children:"HashJoins"})," (two levels):\r\nPerform the inner joins."]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:["The first (bottom-most) joins ",(0,n.jsx)(e.code,{children:"REVIEWS"})," with ",(0,n.jsx)(e.code,{children:"PRODUCTS"})," on ",(0,n.jsx)(e.code,{children:"PRODUCTID"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:["The second joins the result with ",(0,n.jsx)(e.code,{children:"USERS"})," on ",(0,n.jsx)(e.code,{children:"USERID"}),"."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.strong,{children:"TableScans"}),":\r\nEach table is scanned:"]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"REVIEWS"})," is fully scanned."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"PRODUCTS"})," is scanned with a filter on ",(0,n.jsx)(e.code,{children:"PRODUCTNAME"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"USERS"})," is fully scanned."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.strong,{children:"Exchange"})," nodes:\r\nIndicate data redistribution between operators."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"Each node includes:"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"fieldNames"}),": Output columns at that stage."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"predicate"}),": Join or filter condition."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"est"}),": Estimated number of rows at that point in the plan."]}),"\n"]}),"\n",(0,n.jsx)(e.h3,{id:"example-query-mapping",children:"Example: Query Mapping"}),"\n",(0,n.jsx)(e.p,{children:"A result of the EXPLAIN MAPPING command includes additional metadata providing insight into how the query is mapped on cluster topology.\r\nSo, for the command like below:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"EXPLAIN MAPPING FOR\r\n SELECT\r\n U.UserName, P.ProductName, R.ReviewText, R.Rating\r\n FROM Users U, Reviews R, Products P\r\n WHERE U.UserID = R.UserID\r\n AND R.ProductID = P.ProductID\r\n AND P.ProductName = 'Product_' || ?::varchar\n"})}),"\n",(0,n.jsx)(e.p,{children:"The resulting output is:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-text",children:'Fragment#0 root\r\n distribution: single\r\n executionNodes: [node_1]\r\n tree:\r\n Project\r\n fieldNames: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n projection: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n est: (rows=1)\r\n HashJoin\r\n predicate: =(USERID$0, USERID)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME, USERID$0, USERNAME]\r\n type: inner\r\n est: (rows=1)\r\n HashJoin\r\n predicate: =(PRODUCTID, PRODUCTID$0)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME]\r\n type: inner\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n sourceFragmentId: 1\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n sourceFragmentId: 2\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [USERID, USERNAME]\r\n sourceFragmentId: 3\r\n est: (rows=1)\r\n\r\nFragment#1\r\n distribution: random\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [REVIEWS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=50000)\r\n TableScan\r\n table: PUBLIC.REVIEWS\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n est: (rows=50000)\r\n\r\nFragment#2\r\n distribution: table PUBLIC.PRODUCTS in zone "Default"\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [PRODUCTS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=1665)\r\n TableScan\r\n table: PUBLIC.PRODUCTS\r\n predicate: =(PRODUCTNAME, ||(_UTF-8\'Product_\', CAST(?0):VARCHAR CHARACTER SET "UTF-8"))\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n est: (rows=1665)\r\n\r\nFragment#3\r\n distribution: table PUBLIC.USERS in zone "Default"\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [USERS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=10000)\r\n TableScan\r\n table: PUBLIC.USERS\r\n fieldNames: [USERID, USERNAME]\r\n est: (rows=10000)\n'})}),"\n",(0,n.jsx)(e.p,{children:"where:"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.strong,{children:"Fragment#0"})," means fragment with id=0"]}),"\n",(0,n.jsxs)(e.li,{children:["A ",(0,n.jsx)(e.strong,{children:"root"})," marks a fragment which is considered as root fragment, i.e. a fragment which represents user's cursor"]}),"\n",(0,n.jsxs)(e.li,{children:["A ",(0,n.jsx)(e.strong,{children:"distribution"})," attribute provides an insight into which mapping strategy was applied to this particular fragment"]}),"\n",(0,n.jsxs)(e.li,{children:["A ",(0,n.jsx)(e.strong,{children:"executionNodes"})," attribute provides a list of nodes this fragment will be executed on"]}),"\n",(0,n.jsxs)(e.li,{children:["A ",(0,n.jsx)(e.strong,{children:"partitions"})," attribute provides an insight into which partitions of which tables will be read from which nodes"]}),"\n",(0,n.jsxs)(e.li,{children:["A ",(0,n.jsx)(e.strong,{children:"tree"})," attribute specifies which part of the relational tree corresponds to this fragment"]}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"The output above shows how the query is broken into multiple execution fragments and distributed across the cluster. It gives insight into both the logical execution plan and how it maps to the physical topology."}),"\n",(0,n.jsxs)(e.p,{children:["The query starts execution in ",(0,n.jsx)(e.em,{children:"Fragment#0"}),", which serves as the root of the plan. This is where the final result is produced. It runs on a single node (",(0,n.jsx)(e.code,{children:"node_1"}),") and contains the main logic of the query, including the projection and two nested hash joins. Instead of scanning tables directly, it receives data from other fragments through ",(0,n.jsx)(e.code,{children:"Receiver"})," operators. These incoming streams correspond to the ",(0,n.jsx)(e.code,{children:"REVIEWS"}),", ",(0,n.jsx)(e.code,{children:"PRODUCTS"}),", and ",(0,n.jsx)(e.code,{children:"USERS"})," tables."]}),"\n",(0,n.jsxs)(e.p,{children:["The actual table scans happen in ",(0,n.jsx)(e.em,{children:"Fragments 1 through 3"}),", each responsible for one of the involved tables. These fragments operate in parallel across the cluster. Each performs a scan on its respective table and then sends the results back to Fragment#0."]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.em,{children:"Fragment#1"})," handles the ",(0,n.jsx)(e.code,{children:"REVIEWS"})," table. It runs on all nodes and uses a random distribution strategy. Data is partitioned across nodes, and after scanning the table, results are sent upstream."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.em,{children:"Fragment#2"})," is in charge of the ",(0,n.jsx)(e.code,{children:"PRODUCTS"})," table. It also spans all nodes but follows a zone-based distribution linked to the table's partitioning. There's a filter applied to ",(0,n.jsx)(e.code,{children:"PRODUCTNAME"}),", which limits the amount of data sent to the root."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.em,{children:"Fragment#3"})," covers the ",(0,n.jsx)(e.code,{children:"USERS"})," table. Like the others, it's distributed and reads from table partitions spread across the cluster."]}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"Each fragment includes metadata such as the nodes it's executed on, how data is partitioned, and how results are sent between fragments. This layout provides a clear view of not only how the query is logically processed, but also how the workload is split and coordinated in a distributed environment."})]})}function w(t={}){const{wrapper:e}={...(0,h.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(c,{...t})}):c(t)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/1f9d746e.00d18d54.js b/docs/ignite3/assets/js/1f9d746e.00d18d54.js deleted file mode 100644 index 78b261dd2c..0000000000 --- a/docs/ignite3/assets/js/1f9d746e.00d18d54.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7543],{28453:(d,s,e)=>{e.d(s,{R:()=>j,x:()=>n});var r=e(96540);const t={},x=r.createContext(t);function j(d){const s=r.useContext(x);return r.useMemo(function(){return"function"==typeof d?d(s):{...s,...d}},[s,d])}function n(d){let s;return s=d.disableParentContext?"function"==typeof d.components?d.components(t):d.components||t:j(d.components),r.createElement(x.Provider,{value:s},d.children)}},49486:(d,s,e)=>{e.r(s),e.d(s,{assets:()=>i,contentTitle:()=>n,default:()=>h,frontMatter:()=>j,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"sql-reference/keywords","title":"Keywords","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-reference/keywords.md","sourceDirName":"sql-reference","slug":"/sql-reference/keywords","permalink":"/docs/ignite3/3.0.0/sql-reference/keywords","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Keywords","sidebar_label":"Keywords"},"sidebar":"tutorialSidebar","previous":{"title":"Grammar Reference","permalink":"/docs/ignite3/3.0.0/sql-reference/grammar-reference"},"next":{"title":"SQL Conformance","permalink":"/docs/ignite3/3.0.0/sql-reference/sql-conformance"}}');var t=e(74848),x=e(28453);const j={title:"Keywords",sidebar_label:"Keywords"},n=void 0,i={},c=[];function l(d){const s={code:"code",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,x.R)(),...d.components};return(0,t.jsxs)(t.Fragment,{children:["\n",(0,t.jsx)(s.p,{children:"This topic covers keywords in Apache Ignite 3."}),"\n",(0,t.jsx)(s.p,{children:"Non-reserved keywords can be used as identifiers (names for tables, columns, etc.) without requiring quotation marks or special escaping. These keywords have meaning in SQL contexts but do not conflict with basic SQL grammar."}),"\n",(0,t.jsx)(s.p,{children:"Reserved keywords must be wrapped in double quotes to be used as identifiers, for example, table names or column names. If a reserved word is used as an identifier without being quoted, a syntax error will happen."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sql",children:'-- Valid keyword usage.\r\nSELECT 1 AS "ABS";\r\n\r\n-- The query below would cause an error.\r\n-- SELECT 1 AS ABS;\n'})}),"\n",(0,t.jsx)(s.p,{children:"The following list shows the keywords in Apache Ignite 3.0.0."}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Keyword"}),(0,t.jsx)(s.th,{children:"Apache Ignite 3"}),(0,t.jsx)(s.th,{children:"SQL 2016"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"A"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ABS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ABSENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ABSOLUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ACTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ADA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ADD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ADMIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AFTER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALGORITHM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALLOCATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALLOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALTER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALWAYS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AND"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ANY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"APPLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARRAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARRAY_AGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARRAY_CONCAT_AGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARRAY_MAX_CARDINALITY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASENSITIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASOF"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASSERTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASSIGNMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASYMMETRIC"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ATOMIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ATTRIBUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ATTRIBUTES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AUTHORIZATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AUTO"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AVG"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BEFORE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BEGIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BEGIN_FRAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BEGIN_PARTITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BERNOULLI"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BETWEEN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BIGINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BOOLEAN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BOTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BREADTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"C"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CACHE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CALL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CALLED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CARDINALITY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CASCADE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CASCADED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CASE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CAST"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CATALOG_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CEIL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CEILING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CENTURY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHAIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHAR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTERISTICS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTERS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER_LENGTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER_SET_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER_SET_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER_SET_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHAR_LENGTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHECK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CLASSIFIER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CLASS_ORIGIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CLOSE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COALESCE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COBOL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATION_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATION_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATION_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLECT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLOCATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLUMN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLUMN_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMMAND_FUNCTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMMAND_FUNCTION_CODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMMIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMMITTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMPUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONDITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONDITIONAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONDITION_NUMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONNECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONNECTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONNECTION_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSISTENCY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINTS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINT_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINT_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINT_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRUCTOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONTAINS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONTAINS_SUBSTR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONTINUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONVERT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CORR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CORRESPONDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COUNT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COVAR_POP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COVAR_SAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CREATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CROSS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CUBE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CUME_DIST"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_CATALOG"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_DATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_DEFAULT_TRANSFORM_GROUP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_PATH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_ROLE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_ROW"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_SCHEMA"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_TIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_TIMESTAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_TRANSFORM_GROUP_FOR_TYPE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_USER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURSOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURSOR_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CYCLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATABASE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATALINK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME_DIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME_INTERVAL_CODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME_INTERVAL_PRECISION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME_TRUNC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATE_DIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATE_TRUNC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DAYOFWEEK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DAYOFYEAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DAYS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEALLOCATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DECADE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DECFLOAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DECIMAL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DECLARE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFAULT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFAULTS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFERRABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFERRED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFINE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFINED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFINER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEGREE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DELETE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DENSE_RANK"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEPTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEREF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DERIVED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DESC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DESCRIBE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DESCRIPTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DESCRIPTOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DETERMINISTIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DIAGNOSTICS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISALLOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISCONNECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISPATCH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISTINCT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISTRIBUTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLNEWCOPY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLPREVIOUSCOPY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLCOMPLETE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLCOMPLETEONLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLCOMPLETEWRITE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLPATH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLPATHONLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLPATHWRITE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLSCHEME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLSERVER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLVALUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOMAIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOUBLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOWN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DROP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DYNAMIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DYNAMIC_FUNCTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DYNAMIC_FUNCTION_CODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EACH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ELEMENT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ELSE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EMPTY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ENCODING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"END"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"END-EXEC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"END_FRAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"END_PARTITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ENGINE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EPOCH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EQUALS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ERROR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ESCAPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EVERY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXCEPT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXCEPTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXCLUDE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXCLUDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXEC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXECUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXISTS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXPLAIN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXTEND"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXTERNAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXTRACT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FALSE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FETCH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FILTER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FINAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FIRST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FIRST_VALUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FLOAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FLOOR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FOLLOWING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FOR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FOREIGN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FORMAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FORTRAN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FOUND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FRAC_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FRAME_ROW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FREE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FRIDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FROM"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FULL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FUNCTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FUSION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"G"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GENERAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GENERATED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GEOMETRY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GLOBAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GO"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GOTO"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GRANT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GRANTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GROUP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GROUPING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GROUPS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GROUP_CONCAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HASH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HAVING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HIERARCHY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HOLD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HOP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HOUR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HOURS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IDENTIFIED"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IDENTITY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IF"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IGNORE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ILIKE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IMMEDIATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IMMEDIATELY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IMPLEMENTATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IMPORT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INCLUDE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INCLUDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INCREMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INDEX"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INDICATOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INITIAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INITIALLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INNER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INOUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INPUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INSENSITIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INSERT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INSTANCE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INSTANTIABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTEGER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTERSECT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTERSECTION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTERVAL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTO"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INVOKER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ISODOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ISOLATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ISOYEAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JAVA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JOIN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_ARRAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_ARRAYAGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_EXISTS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_OBJECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_OBJECTAGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_QUERY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_SCOPE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_TABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_TABLE_PRIMITIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_VALUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"K"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KEY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KEY_MEMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KEY_TYPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KILL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LABEL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LAG"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LANGUAGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LARGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LAST_VALUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LATERAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LEAD"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LEADING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LEFT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LEVEL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LIBRARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LIKE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LIKE_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LIMIT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LISTAGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOCAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOCALTIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOCALTIMESTAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOCATOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOWER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"M"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MAP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MAPPING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCHED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCHES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCH_CONDITION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCH_NUMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCH_RECOGNIZE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MAX"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MAXVALUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MEASURE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MEASURES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MEMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MERGE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MESSAGE_LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MESSAGE_OCTET_LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MESSAGE_TEXT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"METHOD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MICROSECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MILLENNIUM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MILLISECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MIN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MINUS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MINUTE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MINUTES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MINVALUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MOD"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MODIFIES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MODULE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MONDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MONTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MONTHS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MORE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MULTISET"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MUMPS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NAMES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NANOSECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NATIONAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NATURAL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NCLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NESTING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NEW"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NEXT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NO"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NODES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NONE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NORMALIZE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NORMALIZED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NOT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NTH_VALUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NTILE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NULL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NULLABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NULLIF"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NULLS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NUMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NUMERIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OBJECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OCCURRENCES_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OCTET_LENGTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OCTETS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OFFSET"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OLD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OMIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ON"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ONE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ONLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OPEN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OPTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OPTIONS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ORDER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ORDERING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ORDINAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ORDINALITY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OTHERS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OUTER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OUTPUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OVER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OVERLAPS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OVERLAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OVERRIDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PAD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_MODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_ORDINAL_POSITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_SPECIFIC_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_SPECIFIC_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_SPECIFIC_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARTIAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARTITION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARTITIONS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PASCAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PASSING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PASSTHROUGH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PATH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PATTERN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERCENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERCENTILE_CONT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERCENTILE_DISC"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERCENT_RANK"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERIOD"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERMUTE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PIVOT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PLACING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PLAN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PLI"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PORTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"POSITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"POSITION_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"POWER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRECEDES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRECEDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRECISION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PREPARE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRESERVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PREV"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRIMARY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRIOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRIVILEGES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PROCEDURE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PROFILE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PROFILES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PTF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PUBLIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUALIFY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUARTER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUARTERS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUERY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUORUM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RANGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RANK"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"READ"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"READS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RECURSIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REFERENCES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REFERENCING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_AVGX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_AVGY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_COUNT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_INTERCEPT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_R2"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_SLOPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_SXX"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_SXY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_SYY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RELATIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RELEASE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RENAME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REPEATABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REPLACE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REPLICAS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESET"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESPECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESTART"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESTRICT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESULT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNED_CARDINALITY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNED_LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNED_OCTET_LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNED_SQLSTATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REVOKE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RIGHT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RLIKE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROLLBACK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROLLUP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROUTINE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROUTINE_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROUTINE_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROUTINE_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROW"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROWS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROW_COUNT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROW_NUMBER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RUNNING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SAFE_CAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SAFE_OFFSET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SAFE_ORDINAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SATURDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SAVEPOINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCALAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCALE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCHEMA_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCOPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCOPE_CATALOGS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCOPE_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCOPE_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCROLL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SEARCH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SECOND"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SECONDS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SECTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SECURITY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SEEK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SELECT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SELF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SENSITIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SEPARATOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SEQUENCE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SERIALIZABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SERVER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SERVER_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SESSION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SESSION_USER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SET"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SETS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SHOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SIMILAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SIMPLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SIZE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SKIP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SMALLINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SOME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SORTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SOURCE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SPACE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SPECIFIC"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SPECIFICTYPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SPECIFIC_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQLEXCEPTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQLSTATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQLWARNING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BIGINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BOOLEAN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_CHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_CLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_DATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_DECIMAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_DOUBLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_FLOAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTEGER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_DAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_DAY_TO_HOUR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_DAY_TO_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_DAY_TO_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_HOUR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_HOUR_TO_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_HOUR_TO_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_MINUTE_TO_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_MONTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_YEAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_YEAR_TO_MONTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_LONGVARBINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_LONGVARCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_LONGVARNCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_NCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_NCLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_NUMERIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_NVARCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_REAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_SMALLINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TIME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TIMESTAMP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TINYINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_DAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_FRAC_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_HOUR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_MICROSECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_MONTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_QUARTER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_WEEK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_YEAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_VARBINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_VARCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQRT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"START"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STATEMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STATIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STDDEV_POP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STDDEV_SAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STORAGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STREAM"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STRING_AGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STRUCTURE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STYLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBCLASS_ORIGIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBMULTISET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBSET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBSTITUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBSTRING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBSTRING_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUCCEEDS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUM"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUNDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SYMMETRIC"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SYSTEM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SYSTEM_TIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SYSTEM_USER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TABLE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TABLESAMPLE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TABLE_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TEMPORARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"THEN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"THURSDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMPADD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMPDIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMP_DIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMP_TRUNC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMEZONE_HOUR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMEZONE_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIME_DIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIME_TRUNC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TINYINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TO"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TOP_LEVEL_COUNT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRAILING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSACTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSACTIONS_ACTIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSACTIONS_COMMITTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSACTIONS_ROLLED_BACK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSFORM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSFORMS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSLATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSLATE_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSLATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TREAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIGGER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIGGER_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIGGER_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIGGER_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIM_ARRAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRUNCATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRY_CAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TUESDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TUMBLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TYPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UESCAPE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNBOUNDED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNCOMMITTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNCONDITIONAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNDER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNIQUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNKNOWN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNNAMED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNNEST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNPIVOT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UPDATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UPPER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UPSERT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USAGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER_DEFINED_TYPE_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER_DEFINED_TYPE_CODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER_DEFINED_TYPE_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER_DEFINED_TYPE_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UTF16"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UTF32"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UTF8"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UUID"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VALUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VALUES"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VALUE_OF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VARBINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VARCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VARIANT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VARYING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VAR_POP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VAR_SAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VERSION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VERSIONING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VIEW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WAIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WEDNESDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WEEK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WEEKS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WHEN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WHENEVER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WHERE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WIDTH_BUCKET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WINDOW"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WITH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WITHIN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WITHOUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WORK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WRAPPER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WRITE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XML"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLAGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLATTRIBUTES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLBINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLCAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLCOMMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLCONCAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLDOCUMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLELEMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLEXISTS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLFOREST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLITERATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLNAMESPACES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLPARSE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLPI"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLQUERY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLSERIALIZE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLTABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLTEXT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLVALIDATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"YEAR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"YEARS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ZONE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]})]})]})]})}function h(d={}){const{wrapper:s}={...(0,x.R)(),...d.components};return s?(0,t.jsx)(s,{...d,children:(0,t.jsx)(l,{...d})}):l(d)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/1ffcbc41.03cf6d95.js b/docs/ignite3/assets/js/1ffcbc41.03cf6d95.js deleted file mode 100644 index 1df0742c85..0000000000 --- a/docs/ignite3/assets/js/1ffcbc41.03cf6d95.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4007],{28453:(d,s,e)=>{e.d(s,{R:()=>j,x:()=>n});var r=e(96540);const t={},x=r.createContext(t);function j(d){const s=r.useContext(x);return r.useMemo(function(){return"function"==typeof d?d(s):{...s,...d}},[s,d])}function n(d){let s;return s=d.disableParentContext?"function"==typeof d.components?d.components(t):d.components||t:j(d.components),r.createElement(x.Provider,{value:s},d.children)}},59152:(d,s,e)=>{e.r(s),e.d(s,{assets:()=>i,contentTitle:()=>n,default:()=>h,frontMatter:()=>j,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"sql/reference/sql-conformance/keywords","title":"SQL Keywords","description":"This topic covers keywords in Apache Ignite 3.","source":"@site/docs/sql/reference/sql-conformance/keywords.md","sourceDirName":"sql/reference/sql-conformance","slug":"/sql/reference/sql-conformance/keywords","permalink":"/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"keywords","title":"SQL Keywords","sidebar_label":"Keywords"},"sidebar":"tutorialSidebar","previous":{"title":"SQL Conformance","permalink":"/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview"},"next":{"title":"Advanced SQL","permalink":"/docs/ignite3/3.1.0/sql/advanced/"}}');var t=e(74848),x=e(28453);const j={id:"keywords",title:"SQL Keywords",sidebar_label:"Keywords"},n="Keywords",i={},c=[];function l(d){const s={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,x.R)(),...d.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"keywords",children:"Keywords"})}),"\n",(0,t.jsx)(s.p,{children:"This topic covers keywords in Apache Ignite 3."}),"\n",(0,t.jsx)(s.p,{children:"Non-reserved keywords can be used as identifiers (names for tables, columns, etc.) without requiring quotation marks or special escaping. These keywords have meaning in SQL contexts but do not conflict with basic SQL grammar."}),"\n",(0,t.jsx)(s.p,{children:"Reserved keywords must be wrapped in double quotes to be used as identifiers, for example, table names or column names. If a reserved word is used as an identifier without being quoted, a syntax error will happen."}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sql",children:'-- Valid keyword usage.\r\nSELECT 1 AS "ABS";\r\n\r\n-- The query below would cause an error.\r\n-- SELECT 1 AS ABS;\n'})}),"\n",(0,t.jsx)(s.p,{children:"The following list shows the keywords in Apache Ignite 3."}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Keyword"}),(0,t.jsx)(s.th,{children:"Apache Ignite 3"}),(0,t.jsx)(s.th,{children:"SQL 2016"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"A"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ABS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ABSENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ABSOLUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ACTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ADA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ADD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ADMIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AFTER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALGORITHM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALLOCATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALLOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALTER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ALWAYS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AND"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ANY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"APPLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARRAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARRAY_AGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARRAY_CONCAT_AGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ARRAY_MAX_CARDINALITY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASENSITIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASOF"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASSERTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASSIGNMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ASYMMETRIC"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ATOMIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ATTRIBUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ATTRIBUTES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AUTHORIZATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AUTO"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"AVG"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BEFORE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BEGIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BEGIN_FRAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BEGIN_PARTITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BERNOULLI"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BETWEEN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BIGINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BOOLEAN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BOTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BREADTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"BY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"C"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CACHE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CALL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CALLED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CARDINALITY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CASCADE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CASCADED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CASE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CAST"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CATALOG_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CEIL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CEILING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CENTURY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHAIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHAR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTERISTICS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTERS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER_LENGTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER_SET_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER_SET_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHARACTER_SET_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHAR_LENGTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CHECK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CLASSIFIER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CLASS_ORIGIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CLOSE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COALESCE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COBOL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATION_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATION_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLATION_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLLECT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLOCATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLUMN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COLUMN_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMMAND_FUNCTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMMAND_FUNCTION_CODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMMIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMMITTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COMPUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONDITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONDITIONAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONDITION_NUMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONNECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONNECTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONNECTION_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSISTENCY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINTS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINT_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINT_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRAINT_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONSTRUCTOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONTAINS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONTAINS_SUBSTR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONTINUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CONVERT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CORR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CORRESPONDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COUNT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COVAR_POP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"COVAR_SAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CREATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CROSS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CUBE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CUME_DIST"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_CATALOG"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_DATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_DEFAULT_TRANSFORM_GROUP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_PATH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_ROLE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_ROW"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_SCHEMA"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_TIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_TIMESTAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_TRANSFORM_GROUP_FOR_TYPE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURRENT_USER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURSOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CURSOR_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"CYCLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATABASE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATALINK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME_DIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME_INTERVAL_CODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME_INTERVAL_PRECISION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATETIME_TRUNC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATE_DIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DATE_TRUNC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DAYOFWEEK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DAYOFYEAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DAYS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEALLOCATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DECADE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DECFLOAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DECIMAL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DECLARE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFAULT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFAULTS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFERRABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFERRED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFINE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFINED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEFINER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEGREE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DELETE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DENSE_RANK"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEPTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DEREF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DERIVED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DESC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DESCRIBE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DESCRIPTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DESCRIPTOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DETERMINISTIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DIAGNOSTICS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISALLOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISCONNECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISPATCH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISTINCT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DISTRIBUTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLNEWCOPY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLPREVIOUSCOPY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLCOMPLETE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLCOMPLETEONLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLCOMPLETEWRITE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLPATH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLPATHONLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLPATHWRITE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLSCHEME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLURLSERVER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DLVALUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOMAIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOUBLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOWN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DOY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DROP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DYNAMIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DYNAMIC_FUNCTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"DYNAMIC_FUNCTION_CODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EACH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ELEMENT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ELSE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EMPTY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ENCODING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"END"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"END-EXEC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"END_FRAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"END_PARTITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ENGINE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EPOCH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EQUALS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ERROR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ESCAPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EVERY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXCEPT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXCEPTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXCLUDE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXCLUDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXEC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXECUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXISTS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXPLAIN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXTEND"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXTERNAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXTRACT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FALSE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FETCH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FILTER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FINAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FIRST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FIRST_VALUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FLOAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FLOOR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FOLLOWING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FOR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FOREIGN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FORMAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FORTRAN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FOUND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FRAC_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FRAME_ROW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FREE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FRIDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FROM"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FULL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FUNCTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"FUSION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"G"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GENERAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GENERATED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GEOMETRY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GLOBAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GO"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GOTO"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GRANT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GRANTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GROUP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GROUPING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GROUPS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"GROUP_CONCAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HASH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HAVING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HIERARCHY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HOLD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HOP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HOUR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"HOURS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IDENTIFIED"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IDENTITY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IF"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IGNORE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ILIKE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IMMEDIATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IMMEDIATELY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IMPLEMENTATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IMPORT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INCLUDE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INCLUDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INCREMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INDEX"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INDICATOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INITIAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INITIALLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INNER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INOUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INPUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INSENSITIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INSERT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INSTANCE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INSTANTIABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTEGER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTERSECT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTERSECTION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTERVAL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INTO"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"INVOKER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"IS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ISODOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ISOLATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ISOYEAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JAVA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JOIN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_ARRAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_ARRAYAGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_EXISTS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_OBJECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_OBJECTAGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_QUERY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_SCOPE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_TABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_TABLE_PRIMITIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"JSON_VALUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"K"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KEY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KEY_MEMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KEY_TYPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KILL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LABEL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LAG"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LANGUAGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LARGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LAST_VALUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LATERAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LEAD"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LEADING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LEFT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LEVEL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LIBRARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LIKE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LIKE_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LIMIT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LISTAGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOCAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOCALTIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOCALTIMESTAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOCATOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"LOWER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"M"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MAP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MAPPING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCHED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCHES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCH_CONDITION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCH_NUMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MATCH_RECOGNIZE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MAX"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MAXVALUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MEASURE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MEASURES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MEMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MERGE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MESSAGE_LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MESSAGE_OCTET_LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MESSAGE_TEXT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"METHOD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MICROSECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MILLENNIUM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MILLISECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MIN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MINUS"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MINUTE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MINUTES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MINVALUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MOD"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MODIFIES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MODULE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MONDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MONTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MONTHS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MORE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MULTISET"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"MUMPS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NAMES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NANOSECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NATIONAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NATURAL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NCLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NESTING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NEW"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NEXT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NO"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NODES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NONE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NORMALIZE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NORMALIZED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NOT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NTH_VALUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NTILE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NULL"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NULLABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NULLIF"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NULLS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NUMBER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"NUMERIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OBJECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OCCURRENCES_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OCTET_LENGTH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OCTETS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OFFSET"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OLD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OMIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ON"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ONE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ONLY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OPEN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OPTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OPTIONS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ORDER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ORDERING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ORDINAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ORDINALITY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OTHERS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OUTER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OUTPUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OVER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OVERLAPS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OVERLAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"OVERRIDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PAD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_MODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_ORDINAL_POSITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_SPECIFIC_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_SPECIFIC_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARAMETER_SPECIFIC_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARTIAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARTITION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PARTITIONS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PASCAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PASSING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PASSTHROUGH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PATH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PATTERN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERCENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERCENTILE_CONT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERCENTILE_DISC"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERCENT_RANK"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERIOD"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PERMUTE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PIVOT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PLACING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PLAN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PLI"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PORTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"POSITION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"POSITION_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"POWER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRECEDES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRECEDING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRECISION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PREPARE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRESERVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PREV"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRIMARY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRIOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PRIVILEGES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PROCEDURE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PROFILE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PROFILES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PTF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"PUBLIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUALIFY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUARTER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUARTERS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUERY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"QUORUM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RANGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RANK"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"READ"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"READS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RECURSIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REFERENCES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REFERENCING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_AVGX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_AVGY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_COUNT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_INTERCEPT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_R2"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_SLOPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_SXX"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_SXY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REGR_SYY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RELATIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RELEASE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RENAME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REPEATABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REPLACE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REPLICAS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESET"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESPECT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESTART"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESTRICT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RESULT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNED_CARDINALITY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNED_LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNED_OCTET_LENGTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNED_SQLSTATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RETURNS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"REVOKE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RIGHT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RLIKE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROLLBACK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROLLUP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROUTINE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROUTINE_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROUTINE_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROUTINE_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROW"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROWS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROW_COUNT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ROW_NUMBER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"RUNNING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SAFE_CAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SAFE_OFFSET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SAFE_ORDINAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SATURDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SAVEPOINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCALAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCALE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCHEMA_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCOPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCOPE_CATALOGS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCOPE_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCOPE_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SCROLL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SEARCH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SECOND"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SECONDS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SECTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SECURITY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SEEK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SELECT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SELF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SENSITIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SEPARATOR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SEQUENCE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SERIALIZABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SERVER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SERVER_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SESSION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SESSION_USER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SET"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SETS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SHOW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SIMILAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SIMPLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SIZE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SKIP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SMALLINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SOME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SORTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SOURCE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SPACE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SPECIFIC"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SPECIFICTYPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SPECIFIC_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQLEXCEPTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQLSTATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQLWARNING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BIGINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_BOOLEAN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_CHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_CLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_DATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_DECIMAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_DOUBLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_FLOAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTEGER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_DAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_DAY_TO_HOUR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_DAY_TO_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_DAY_TO_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_HOUR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_HOUR_TO_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_HOUR_TO_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_MINUTE_TO_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_MONTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_YEAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_INTERVAL_YEAR_TO_MONTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_LONGVARBINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_LONGVARCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_LONGVARNCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_NCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_NCLOB"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_NUMERIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_NVARCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_REAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_SMALLINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TIME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TIMESTAMP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TINYINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_DAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_FRAC_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_HOUR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_MICROSECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_MONTH"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_QUARTER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_SECOND"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_WEEK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_TSI_YEAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_VARBINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQL_VARCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SQRT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"START"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STATEMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STATIC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STDDEV_POP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STDDEV_SAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STORAGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STREAM"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STRING_AGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STRUCTURE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"STYLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBCLASS_ORIGIN"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBMULTISET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBSET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBSTITUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBSTRING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUBSTRING_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUCCEEDS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUM"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SUNDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SYMMETRIC"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SYSTEM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SYSTEM_TIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"SYSTEM_USER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TABLE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TABLESAMPLE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TABLE_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TEMPORARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"THEN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"THURSDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIME"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMPADD"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMPDIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMP_DIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMESTAMP_TRUNC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMEZONE_HOUR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIMEZONE_MINUTE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIME_DIFF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TIME_TRUNC"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TINYINT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TO"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TOP_LEVEL_COUNT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRAILING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSACTION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSACTIONS_ACTIVE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSACTIONS_COMMITTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSACTIONS_ROLLED_BACK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSFORM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSFORMS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSLATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSLATE_REGEX"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRANSLATION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TREAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIGGER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIGGER_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIGGER_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIGGER_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIM"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRIM_ARRAY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRUNCATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TRY_CAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TUESDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TUMBLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"TYPE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UESCAPE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNBOUNDED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNCOMMITTED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNCONDITIONAL"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNDER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNION"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNIQUE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNKNOWN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNNAMED"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNNEST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UNPIVOT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UP"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UPDATE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UPPER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UPSERT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USAGE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER_DEFINED_TYPE_CATALOG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER_DEFINED_TYPE_CODE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER_DEFINED_TYPE_NAME"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USER_DEFINED_TYPE_SCHEMA"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"USING"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UTF16"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UTF32"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UTF8"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"UUID"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VALUE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VALUES"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VALUE_OF"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VARBINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VARCHAR"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VARIANT"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VARYING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VAR_POP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VAR_SAMP"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VERSION"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VERSIONING"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"VIEW"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WAIT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WEDNESDAY"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WEEK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WEEKS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WHEN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WHENEVER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WHERE"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WIDTH_BUCKET"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WINDOW"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WITH"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WITHIN"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WITHOUT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WORK"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WRAPPER"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"WRITE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XML"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLAGG"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLATTRIBUTES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLBINARY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLCAST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLCOMMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLCONCAT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLDOCUMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLELEMENT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLEXISTS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLFOREST"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLITERATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLNAMESPACES"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLPARSE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLPI"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLQUERY"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLSERIALIZE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLTABLE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLTEXT"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"XMLVALIDATE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"YEAR"}),(0,t.jsx)(s.td,{children:"Reserved"}),(0,t.jsx)(s.td,{children:"Reserved"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"YEARS"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"ZONE"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]})]})]})]})}function h(d={}){const{wrapper:s}={...(0,x.R)(),...d.components};return s?(0,t.jsx)(s,{...d,children:(0,t.jsx)(l,{...d})}):l(d)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/24058a50.7cbc7b7d.js b/docs/ignite3/assets/js/24058a50.7cbc7b7d.js deleted file mode 100644 index a4fcb9402f..0000000000 --- a/docs/ignite3/assets/js/24058a50.7cbc7b7d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2446],{28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>i});var s=n(96540);const r={},o=s.createContext(r);function a(e){const t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(o.Provider,{value:t},e.children)}},58638:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"tools/glossary","title":"Glossary","description":"C","source":"@site/docs/tools/glossary.md","sourceDirName":"tools","slug":"/tools/glossary","permalink":"/docs/ignite3/3.1.0/tools/glossary","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"id":"glossary","title":"Glossary","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"REST API","permalink":"/docs/ignite3/3.1.0/tools/rest-api"}}');var r=n(74848),o=n(28453);const a={id:"glossary",title:"Glossary",sidebar_position:3},i="Glossary",l={},d=[{value:"C",id:"c",level:2},{value:"D",id:"d",level:2},{value:"L",id:"l",level:2},{value:"M",id:"m",level:2},{value:"P",id:"p",level:2},{value:"R",id:"r",level:2},{value:"S",id:"s",level:2},{value:"U",id:"u",level:2},{value:"V",id:"v",level:2}];function c(e){const t={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"glossary",children:"Glossary"})}),"\n",(0,r.jsx)(t.h2,{id:"c",children:"C"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Cache"}),"\r\n: Caches are in-memory temporary storage designed for rapid response and reducing latency when working with databases."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Cluster management group"}),"\r\n: A subset of Ignite nodes in a RAFT group. Cluster group leader is responsible for managing nodes that enter or leave an Ignite cluster."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Cluster node"}),"\r\n: A cluster node is the base computational and data storage unit in Ignite."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Columnar storage"}),"\r\n: A mechanism that is optimized for quick access to columns of data. It can be used to drastically improve performance when reading a specific column's values from a large number of rows."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Coordinator node"}),"\r\n: The node that received the distributed computing job, manages its execution, and reports the results to the client."]}),"\n",(0,r.jsx)(t.h2,{id:"d",children:"D"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Data colocation"}),"\r\n: When data is colocated, it means that data items that are relevant to each other are placed on the same node in the cluster."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Data region"}),"\r\n: Used to control the amount of memory available for storage. Depending on the type of storage a data region is assigned to, the data may be loaded into RAM or stored on disk."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Data rebalance"}),"\r\n: The process of redistributing partitions equally across all nodes in a cluster."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Distribution zone"}),"\r\n: Distribution zone controls how data is placed into partitions, and how partitions are distributed on nodes on the cluster. Distribution zones are part of cluster configuration, and can be modified with ",(0,r.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"SQL commands"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"l",children:"L"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Logical Topology"}),"\r\n: A set of nodes connected into a Raft group is called a logical topology. These nodes follow the Raft leader and form an Ignite cluster."]}),"\n",(0,r.jsx)(t.h2,{id:"m",children:"M"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Metastore"}),"\r\n: Metastore holds additional information about Ignite cluster that is required for its operation, for example the number and type of data regions configured."]}),"\n",(0,r.jsx)(t.h2,{id:"p",children:"P"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Persistent Storage"}),"\r\n: Persistent storage is the type of memory storage that is preserved regardless of cluster state. Some portion of data will be loaded into RAM to improve performance."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Physical topology"}),"\r\n: When nodes are started, they find each other and form a cluster on a physical topology. All nodes on a physical topology can form a Ignite cluster, but are not necessarily part of it."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Primary Storage"}),"\r\n: Primary storage is the database to which data is written and from which it is usually read."]}),"\n",(0,r.jsx)(t.h2,{id:"r",children:"R"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"RAFT"}),"\r\n: Raft is a consensus algorithm that is used by Ignite to manage Ignite cluster. It provides a high degree of stability and data consistency by using elections to guarantee that there is always only one cluster leader that had an authoritative log of all transactions performed on the cluster."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"RAFT Log"}),"\r\n: Raft log is an append only collection of all operations performed on the cluster. Leader log is the sole authority in the cluster, and overwrites any contradicting logs on follower nodes."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Rebalance"}),"\r\n: The process of relocation partitions between nodes to guarantee consistent data distribution after cluster topology changes."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Replica storage"}),"\r\n: Provides a dynamically expanded copy of the primary storage, which can be set up to use a different storage type for better performance."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Rolling upgrade"}),"\r\n: An update of the Ignite version without cluster-wide downtime."]}),"\n",(0,r.jsx)(t.h2,{id:"s",children:"S"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Snapshot"}),"\r\n: A backup of data in an Ignite cluster. A snapshot taken on one cluster can be applied to another cluster."]}),"\n",(0,r.jsx)(t.h2,{id:"u",children:"U"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Update buffer"}),"\r\n: Buffer that stores transactions to the primary storage before committing them to a replica storage. This reduces the number of transactions added to the latter."]}),"\n",(0,r.jsx)(t.h2,{id:"v",children:"V"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Volatile storage"}),"\r\n: Memory storage that is only preserved while the cluster is active. Loss of power or unexpected cluster shutdown will lead to loss of data."]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/24239f0f.4e374171.js b/docs/ignite3/assets/js/24239f0f.4e374171.js deleted file mode 100644 index 860d6ce676..0000000000 --- a/docs/ignite3/assets/js/24239f0f.4e374171.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7419],{28453:(t,i,e)=>{e.d(i,{R:()=>a,x:()=>r});var h=e(96540);const s={},n=h.createContext(s);function a(t){const i=h.useContext(n);return h.useMemo(function(){return"function"==typeof t?t(i):{...i,...t}},[i,t])}function r(t){let i;return i=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),h.createElement(n.Provider,{value:i},t.children)}},63367:(t,i,e)=>{e.d(i,{A:()=>U});var h=e(96540);const s={},n=!1,a=8,r=10,o="railroad-diagram",d=!0,c="center",w=8.5,l=7;class m{constructor(t,i,e){this.children=e||[],this.tagName=t,this.attrs=D(i,{})}format(t,i,e){}addTo(t){if(t instanceof m)return t.children.push(this),this;var i=this.toSVG();return t.appendChild(i),i}toSVG(){var t=function(t,i,e){i=i||{},e=e||"";var h=document.createElementNS("http://www.w3.org/2000/svg",t);for(var s in i)"xlink:href"===s?h.setAttributeNS("http://www.w3.org/1999/xlink","href",i[s]):h.setAttribute(s,i[s]);return h.textContent=e,h}(this.tagName,this.attrs);return"string"==typeof this.children?t.textContent=this.children:this.children.forEach(function(i){t.appendChild(i.toSVG())}),t}toString(){var t="<"+this.tagName,i="g"==this.tagName||"svg"==this.tagName;for(var e in this.attrs)t+=" "+e+'="'+(this.attrs[e]+"").replace(/&/g,"&").replace(/"/g,""")+'"';return t+=">",i&&(t+="\n"),"string"==typeof this.children?t+=this.children.replace(/[*_\`\[\]<&]/g,function(t){return"&#"+t.charCodeAt(0)+";"}):this.children.forEach(function(i){t+=i}),t+="\n"}walk(t){t(this)}}class u extends m{constructor(t,i){super("path"),this.attrs.d="M"+t+" "+i}m(t,i){return this.attrs.d+="m"+t+" "+i,this}h(t){return this.attrs.d+="h"+t,this}right(t){return this.h(Math.max(0,t))}left(t){return this.h(-Math.max(0,t))}v(t){return this.attrs.d+="v"+t,this}down(t){return this.v(Math.max(0,t))}up(t){return this.v(-Math.max(0,t))}arc(t){var i,e=r,h=r;return"e"!=t[0]&&"w"!=t[1]||(e*=-1),"s"!=t[0]&&"n"!=t[1]||(h*=-1),i="ne"==t||"es"==t||"sw"==t||"wn"==t?1:0,this.attrs.d+="a"+r+" "+r+" 0 0 "+i+" "+e+" "+h,this}arc_8(t,i){const e=r,h=1/Math.sqrt(2)*e,s=e-h;let n="a "+e+" "+e+" 0 0 "+("cw"==i?"1":"0")+" ";const a=t+i;return n+=("ncw"==a?[h,s]:"necw"==a?[s,h]:"ecw"==a?[-s,h]:"secw"==a?[-h,s]:"scw"==a?[-h,-s]:"swcw"==a?[-s,-h]:"wcw"==a?[s,-h]:"nwcw"==a?[h,-s]:"nccw"==a?[-h,s]:"nwccw"==a?[-s,h]:"wccw"==a?[s,h]:"swccw"==a?[h,s]:"sccw"==a?[h,-s]:"seccw"==a?[s,-h]:"eccw"==a?[-s,-h]:"neccw"==a?[-h,-s]:null).join(" "),this.attrs.d+=n,this}l(t,i){return this.attrs.d+="l"+t+" "+i,this}format(){return this.attrs.d+="h.5",this}}class p extends m{constructor(t,i,e,h){super(t,e,h),this.items=i.map(L)}walk(t){t(this),this.items.forEach(i=>i.walk(t))}}class g extends p{constructor(...t){super("svg",t,{class:o}),this.items[0]instanceof A||this.items.unshift(new A),this.items[this.items.length-1]instanceof N||this.items.push(new N),this.up=this.down=this.height=this.width=0;for(const i of this.items)this.width+=i.width+(i.needsSpace?20:0),this.up=Math.max(this.up,i.up-this.height),this.height+=i.height,this.down=Math.max(this.down-i.height,i.down);this.formatted=!1}format(t,i,e,h){t=D(t,20),i=D(i,t,20),e=D(e,t,20);var s=h=D(h,i,20),n=t;n+=this.up;for(var a=new m("g",d?{transform:"translate(.5 .5)"}:{}),r=0;rnew g(...t);class f extends m{constructor(...t){var i=new g(...t);return i.items[0]=new A({type:"complex"}),i.items[i.items.length-1]=new N({type:"complex"}),i}}s.ComplexDiagram=(...t)=>new f(...t);class x extends p{constructor(...t){super("g",t);this.items.length;this.needsSpace=!0,this.up=this.down=this.height=this.width=0;for(var i=0;i0&&(new u(t,i).h(10).addTo(this),t+=10),n.format(t,i,n.width).addTo(this),t+=n.width,i+=n.height,n.needsSpace&&snew x(...t);class T extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("Stack() must have at least one child.");this.width=Math.max.apply(null,this.items.map(function(t){return t.width+(t.needsSpace?20:0)})),this.items.length>1&&(this.width+=2*r),this.needsSpace=!0,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=0;for(var i=this.items.length-1,e=0;e0&&(this.height+=Math.max(2*r,h.up+a)),e1&&(new u(t,i).h(r).addTo(this),t+=r);for(var n=0;n1?2*r:0);o.format(t,i,d).addTo(this),t+=d,i+=o.height,n!==this.items.length-1&&(new u(t,i).arc("ne").down(Math.max(0,o.down+a-2*r)).arc("es").left(d).arc("nw").down(Math.max(0,this.items[n+1].up+a-2*r)).arc("ws").addTo(this),i+=Math.max(o.down+a,2*r)+Math.max(this.items[n+1].up+a,2*r),t=s+r)}return this.items.length>1&&(new u(t,i).h(r).addTo(this),t+=r),new u(t,i).h(h[1]).addTo(this),this}}s.Stack=(...t)=>new T(...t);class v extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("OptionalSequence() must have at least one child.");if(1===t.length)return new x(t);var i=r;this.needsSpace=!1,this.width=0,this.up=0,this.height=V(this.items,function(t){return t.height}),this.down=this.items[0].down;for(var e=0,h=0;h0&&(this.down=Math.max(this.height+this.down,e+Math.max(2*i,s.down+a))-this.height);var o=(s.needsSpace?10:0)+s.width;this.width+=0===h?i+Math.max(o,i):2*i+Math.max(o,i)+i}n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="optseq")}format(t,i,e){var h=r,s=z(e,this.width);new u(t,i).right(s[0]).addTo(this),new u(t+s[0]+this.width,i+this.height).right(s[1]).addTo(this),t+=s[0];for(var n=i-this.up,o=this.items.length-1,d=0;dnew v(...t);class M extends p{constructor(...t){if(super("g",t),1===t.length)return new x(t);if(2!==t.length)throw new RangeError("AlternatingSequence() must have one or two children.");this.needsSpace=!1;const i=r,e=a,h=Math.max,s=this.items[0],o=this.items[1],d=1/Math.sqrt(2)*i*2,c=(1-1/Math.sqrt(2))*i*2,w=Math.max(i,a),l=w-c+d,m=h(i+i,w/2+i+i,w/2+e+s.down);this.up=m+s.height+s.up;const u=h(i+i,w/2+i+i,w/2+e+o.up);this.down=u+o.height+o.down,this.height=0;const p=2*(s.needsSpace?10:0)+s.width,g=2*(o.needsSpace?10:0)+o.width;this.width=2*i+h(p,l,g)+2*i,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="altseq")}format(t,i,e){const h=r,s=z(e,this.width);new u(t,i).right(s[0]).addTo(this),t+=s[0],new u(t+this.width,i).right(s[1]).addTo(this);const n=this.items[0],o=this.items[1],d=this.up-n.up,c=this.up-n.up-n.height;new u(t,i).arc("se").up(d-2*h).arc("wn").addTo(this),n.format(t+2*h,i-d,this.width-4*h).addTo(this),new u(t+this.width-2*h,i-c).arc("ne").down(c-2*h).arc("ws").addTo(this);const w=this.down-o.down-o.height,l=this.down-o.down;new u(t,i).arc("ne").down(w-2*h).arc("ws").addTo(this),o.format(t+2*h,i+w,this.width-4*h).addTo(this),new u(t+this.width-2*h,i+l).arc("se").up(l-2*h).arc("wn").addTo(this);const m=1/Math.sqrt(2)*h*2,p=(1-1/Math.sqrt(2))*h*2,g=Math.max(h,a),f=g-p+m,x=(this.width-4*h-f)/2;return new u(t+h,i-g/2-h).arc("ws").right(x).arc_8("n","cw").l(f-m,g-p).arc_8("sw","ccw").right(x).arc("ne").addTo(this),new u(t+h,i+g/2+h).arc("wn").right(x).arc_8("s","ccw").l(f-m,-(g-p)).arc_8("nw","cw").right(x).arc("se").addTo(this),this}}s.AlternatingSequence=(...t)=>new M(...t);class y extends p{constructor(t,...i){if(super("g",i),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of Choice() must be an integer.");if(t<0||t>=i.length)throw new RangeError("The first argument of Choice() must be an index for one of the items.");this.normal=t;var e,h=i.length-1;this.width=Math.max.apply(null,this.items.map(function(t){return t.width}))+4*r,this.height=this.items[t].height,this.up=this.items[0].up;for(var s=0;s=0;d--){let e=this.items[d];d==this.normal-1&&(s=Math.max(2*r,this.items[this.normal].up+a+e.down+e.height)),new u(t,i).arc("se").up(s-2*r).arc("wn").addTo(this),e.format(t+2*r,i-s,o).addTo(this),new u(t+2*r+o,i-s+e.height).arc("ne").down(s-e.height+this.height-2*r).arc("ws").addTo(this),s+=Math.max(r,e.up+a+(0===d?0:this.items[d-1].down+this.items[d-1].height))}for(new u(t,i).right(2*r).addTo(this),this.items[this.normal].format(t+2*r,i,o).addTo(this),new u(t+2*r+o,i+this.height).right(2*r).addTo(this),d=this.normal+1;d<=n;d++){let e=this.items[d];d==this.normal+1&&(s=Math.max(2*r,this.height+this.items[this.normal].down+a+e.up)),new u(t,i).arc("ne").down(s-2*r).arc("ws").addTo(this),e.format(t+2*r,i+s,o).addTo(this),new u(t+2*r+o,i+s+e.height).arc("se").up(s-2*r+e.height-this.height).arc("wn").addTo(this),s+=Math.max(r,e.height+e.down+a+(d==n?0:this.items[d+1].up))}return this}}s.Choice=(...t)=>new y(...t);class S extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("HorizontalChoice() must have at least one child.");if(1===t.length)return new x(t);const i=this.items.slice(0,-1),e=this.items.slice(1,-1),h=this.items[0],s=this.items[this.items.length-1];this.needsSpace=!1,this.width=r,this.width+=2*r*(this.items.length-1),this.width+=V(this.items,t=>t.width+(t.needsSpace?20:0)),this.width+=s.height>0?r:0,this.width+=r,this.height=0,this._upperTrack=Math.max(2*r,a,W(i,t=>t.up)+a),this.up=Math.max(this._upperTrack,s.up),this._lowerTrack=Math.max(a,W(e,t=>t.height+Math.max(t.down+a,2*r)),s.height+s.down+a),h.heightt.width+(t.needsSpace?20:0))+(this.items.length-2)*r*2-r;new u(t,i).arc("se").v(-(this._upperTrack-2*r)).arc("wn").h(o).addTo(this);var d=V(a,t=>t.width+(t.needsSpace?20:0))+(this.items.length-2)*r*2+(n.height>0?r:0)-r,c=t+r+s.width+(s.needsSpace?20:0)+2*r;new u(c,i+this._lowerTrack).h(d).arc("se").v(-(this._lowerTrack-2*r)).arc("wn").addTo(this);for(const[l,m]of function*(t){var i=0;for(const e of t)yield[i,e],i++}(this.items)){0===l?(new u(t,i).h(r).addTo(this),t+=r):(new u(t,i-this._upperTrack).arc("ne").v(this._upperTrack-2*r).arc("ws").addTo(this),t+=2*r);var w=m.width+(m.needsSpace?20:0);m.format(t,i,w).addTo(this),t+=w,l===this.items.length-1?0===m.height?new u(t,i).h(r).addTo(this):new u(t,i+m.height).arc("se").addTo(this):0===l&&m.height>this._lowerTrack?m.height-this._lowerTrack>=2*r?new u(t,i+m.height).arc("se").v(this._lowerTrack-m.height+2*r).arc("wn").addTo(this):new u(t,i+m.height).l(2*r,this._lowerTrack-m.height).addTo(this):new u(t,i+m.height).arc("ne").v(this._lowerTrack-m.height-2*r).arc("ws").addTo(this)}return this}}s.HorizontalChoice=(...t)=>new S(...t);class b extends p{constructor(t,i,...e){if(super("g",e),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of MultipleChoice() must be an integer.");if(t<0||t>=e.length)throw new RangeError("The first argument of MultipleChoice() must be an index for one of the items.");if(this.normal=t,"any"!=i&&"all"!=i)throw new SyntaxError("The second argument of MultipleChoice must be 'any' or 'all'.");this.type=i,this.needsSpace=!0,this.innerWidth=W(this.items,function(t){return t.width}),this.width=30+r+this.innerWidth+r+20,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=this.items[t].height;for(var h=0;ht&&(this.down+=Math.max(i,e.up+a+this.items[h-1].down+this.items[h-1].height))}this.down-=this.items[t].height,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="multiplechoice")}format(t,i,e){var h=z(e,this.width);new u(t,i).right(h[0]).addTo(this),new u(t+h[0]+this.width,i+this.height).right(h[1]).addTo(this),t+=h[0];for(var s,n=this.items[this.normal],o=this.normal-1;o>=0;o--){var d=this.items[o];o==this.normal-1&&(s=Math.max(10+r,n.up+a+d.down+d.height)),new u(t+30,i).up(s-r).arc("wn").addTo(this),d.format(t+30+r,i-s,this.innerWidth).addTo(this),new u(t+30+r+this.innerWidth,i-s+d.height).arc("ne").down(s-d.height+this.height-r-10).addTo(this),0!==o&&(s+=Math.max(r,d.up+a+this.items[o-1].down+this.items[o-1].height))}for(new u(t+30,i).right(r).addTo(this),n.format(t+30+r,i,this.innerWidth).addTo(this),new u(t+30+r+this.innerWidth,i+this.height).right(r).addTo(this),o=this.normal+1;onew b(...t);class k extends m{constructor(t,i){if(void 0===i)return new y(1,new _,t);if("skip"===i)return new y(0,new _,t);throw"Unknown value for Optional()'s 'skip' argument."}}s.Optional=(...t)=>new k(...t);class E extends m{constructor(t,i){super("g"),i=i||new _,this.item=L(t),this.rep=L(i),this.width=Math.max(this.item.width,this.rep.width)+2*r,this.height=this.item.height,this.up=this.item.up,this.down=Math.max(2*r,this.item.down+a+this.rep.up+this.rep.height+this.rep.down),this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="oneormore")}format(t,i,e){var h=z(e,this.width);new u(t,i).h(h[0]).addTo(this),new u(t+h[0]+this.width,i+this.height).h(h[1]).addTo(this),t+=h[0],new u(t,i).right(r).addTo(this),this.item.format(t+r,i,this.width-2*r).addTo(this),new u(t+this.width-r,i+this.height).right(r).addTo(this);var s=Math.max(2*r,this.item.height+this.item.down+a+this.rep.up);return new u(t+r,i).arc("nw").down(s-2*r).arc("ws").addTo(this),this.rep.format(t+r,i+s,this.width-2*r).addTo(this),new u(t+this.width-r,i+s+this.rep.height).arc("se").up(s-2*r+this.rep.height-this.item.height).arc("en").addTo(this),this}walk(t){t(this),this.item.walk(t),this.rep.walk(t)}}s.OneOrMore=(...t)=>new E(...t);class j extends m{constructor(t,i,e){return new k(new E(t,i),e)}}s.ZeroOrMore=(...t)=>new j(...t);class C extends m{constructor(t,i){super("g"),this.item=L(t),this.label=i instanceof m?i:i?new O(i):void 0,this.width=Math.max(this.item.width+(this.item.needsSpace?20:0),this.label?this.label.width:0,2*r),this.height=this.item.height,this.boxUp=this.up=Math.max(this.item.up+a,r),this.label&&(this.up+=this.label.up+this.label.height+this.label.down),this.down=Math.max(this.item.down+a,r),this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="group")}format(t,i,e){var h=z(e,this.width);return new u(t,i).h(h[0]).addTo(this),new u(t+h[0]+this.width,i+this.height).h(h[1]).addTo(this),t+=h[0],new m("rect",{x:t,y:i-this.boxUp,width:this.width,height:this.boxUp+this.height+this.down,rx:r,ry:r,class:"group-box"}).addTo(this),this.item.format(t,i,this.width).addTo(this),this.label&&this.label.format(t,i-(this.boxUp+this.label.down+this.label.height),this.label.width).addTo(this),this}walk(t){t(this),this.item.walk(t),this.label.walk(t)}}s.Group=(...t)=>new C(...t);class A extends m{constructor({type:t="simple",label:i}={}){super("g"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,i&&(this.label=""+i,this.width=Math.max(20,this.label.length*w+10)),n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="start")}format(t,i){let e=new u(t,i-10);return"complex"===this.type?e.down(20).m(0,-10).right(this.width).addTo(this):e.down(20).m(10,-20).down(20).m(-10,-10).right(this.width).addTo(this),this.label&&new m("text",{x:t,y:i-15,style:"text-anchor:start"},this.label).addTo(this),this}}s.Start=(...t)=>new A(...t);class N extends m{constructor({type:t="simple"}={}){super("path"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="end")}format(t,i){return"complex"===this.type?this.attrs.d="M "+t+" "+i+" h 20 m 0 -10 v 20":this.attrs.d="M "+t+" "+i+" h 20 m -10 -10 v 20 m 10 -20 v 20",this}}s.End=(...t)=>new N(...t);class R extends m{constructor(t,{href:i,title:e,cls:h}={}){super("g",{class:["terminal",h].join(" ")}),this.text=""+t,this.href=i,this.title=e,this.cls=h,this.width=this.text.length*w+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="terminal")}format(t,i,e){var h=z(e,this.width);new u(t,i).h(h[0]).addTo(this),new u(t+h[0]+this.width,i).h(h[1]).addTo(this),t+=h[0],new m("rect",{x:t,y:i-11,width:this.width,height:this.up+this.down,rx:10,ry:10}).addTo(this);var s=new m("text",{x:t+this.width/2,y:i+4},this.text);return this.href?new m("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new m("title",{},[this.title]).addTo(this),this}}s.Terminal=(...t)=>new R(...t);class q extends m{constructor(t,{href:i,title:e,cls:h=""}={}){super("g",{class:["non-terminal",h].join(" ")}),this.text=""+t,this.href=i,this.title=e,this.cls=h,this.width=this.text.length*w+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="nonterminal")}format(t,i,e){var h=z(e,this.width);new u(t,i).h(h[0]).addTo(this),new u(t+h[0]+this.width,i).h(h[1]).addTo(this),t+=h[0],new m("rect",{x:t,y:i-11,width:this.width,height:this.up+this.down}).addTo(this);var s=new m("text",{x:t+this.width/2,y:i+4},this.text);return this.href?new m("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new m("title",{},[this.title]).addTo(this),this}}s.NonTerminal=(...t)=>new q(...t);class O extends m{constructor(t,{href:i,title:e,cls:h=""}={}){super("g",{class:["comment",h].join(" ")}),this.text=""+t,this.href=i,this.title=e,this.cls=h,this.width=this.text.length*l+10,this.height=0,this.up=8,this.down=8,this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="comment")}format(t,i,e){var h=z(e,this.width);new u(t,i).h(h[0]).addTo(this),new u(t+h[0]+this.width,i+this.height).h(h[1]).addTo(this),t+=h[0];var s=new m("text",{x:t+this.width/2,y:i+5,class:"comment"},this.text);return this.href?new m("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new m("title",{},this.title).addTo(this),this}}s.Comment=(...t)=>new O(...t);class _ extends m{constructor(){super("g"),this.width=0,this.height=0,this.up=0,this.down=0,this.needsSpace=!1,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="skip")}format(t,i,e){return new u(t,i).right(e).addTo(this),this}}s.Skip=(...t)=>new _(...t);class I extends m{constructor({width:t=50,up:i=15,height:e=25,down:h=15,needsSpace:s=!0}={}){super("g"),this.width=t,this.height=e,this.up=i,this.down=h,this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="block")}format(t,i,e){var h=z(e,this.width);return new u(t,i).h(h[0]).addTo(this),new u(t+h[0]+this.width,i).h(h[1]).addTo(this),t+=h[0],new m("rect",{x:t,y:i-this.up,width:this.width,height:this.up+this.height+this.down}).addTo(this),this}}function D(...t){return t.reduce(function(t,i){return void 0!==t?t:i})}function z(t,i){var e=t-i;switch(c){case"left":return[0,e];case"right":return[e,0];default:return[e/2,e/2]}}function L(t){return t instanceof m?t:new R(""+t)}function V(t,i){return i||(i=function(t){return t}),t.map(i).reduce(function(t,i){return t+i},0)}function W(t,i){return i||(i=function(t){return t}),Math.max.apply(null,t.map(i))}s.Block=(...t)=>new I(...t);var G=e(74848);function U({children:t}){const i=(0,h.useRef)(null),e=(0,h.useRef)(null),[s,n]=(0,h.useState)(!1),a=i=>{if(i.current)try{const h=(...t)=>new g(...t),s=(...t)=>new R(...t),n=(...t)=>new q(...t),a=(...t)=>new k(...t),r=(...t)=>new x(...t),o=(...t)=>new y(...t),d=(...t)=>new _(...t),c=(...t)=>new O(...t),w=(...t)=>new E(...t),l=(...t)=>new j(...t),m=t.replace(/ComplexDiagram\(/g,"Diagram(").replace(/Start\([^)]*\),?\s*/g,"").replace(/,?\s*End\([^)]*\)/g,"").trim();try{const t=new Function("Diagram","Terminal","NonTerminal","Optional","Sequence","Choice","Skip","Comment","OneOrMore","ZeroOrMore",`'use strict'; return ${m};`)(h,s,n,a,r,o,d,c,w,l);if(!t||"function"!=typeof t.toSVG)throw new Error("Diagram function did not return a valid diagram object");i.current.innerHTML="";const e=t.toSVG();e.querySelectorAll("a[*|href]").forEach(t=>{const i=t.getAttributeNS("http://www.w3.org/1999/xlink","href");i&&t.setAttribute("href",i)}),i.current.appendChild(e)}catch(e){throw console.error("Error in diagram generation:",e),e}}catch(h){console.error("Error rendering railroad diagram:",h),i.current.innerHTML='

                                                              Error rendering diagram. Check console for details.

                                                              '}};(0,h.useEffect)(()=>{a(i)},[t]),(0,h.useEffect)(()=>{if(s){a(e);const t=t=>{"Escape"===t.key&&n(!1)};return document.addEventListener("keydown",t),document.body.style.overflow="hidden",()=>{document.removeEventListener("keydown",t),document.body.style.overflow=""}}},[s,t]);return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)("div",{className:"railroad-diagram-wrapper",children:[(0,G.jsx)("button",{className:"railroad-expand-button",onClick:()=>n(!0),"aria-label":"Expand diagram",title:"View full size",children:(0,G.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:(0,G.jsx)("path",{d:"M1.5 1a.5.5 0 0 0-.5.5v4a.5.5 0 0 1-1 0v-4A1.5 1.5 0 0 1 1.5 0h4a.5.5 0 0 1 0 1h-4zM10 .5a.5.5 0 0 1 .5-.5h4A1.5 1.5 0 0 1 16 1.5v4a.5.5 0 0 1-1 0v-4a.5.5 0 0 0-.5-.5h-4a.5.5 0 0 1-.5-.5zM.5 10a.5.5 0 0 1 .5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 1 0 1h-4A1.5 1.5 0 0 1 0 14.5v-4a.5.5 0 0 1 .5-.5zm15 0a.5.5 0 0 1 .5.5v4a1.5 1.5 0 0 1-1.5 1.5h-4a.5.5 0 0 1 0-1h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 1 .5-.5z"})})}),(0,G.jsx)("div",{ref:i,className:"railroad-diagram-container"})]}),s&&(0,G.jsx)("div",{className:"railroad-modal-overlay",onClick:t=>{t.target===t.currentTarget&&n(!1)},children:(0,G.jsxs)("div",{className:"railroad-modal-content",children:[(0,G.jsx)("button",{className:"railroad-modal-close",onClick:()=>n(!1),"aria-label":"Close",title:"Close (ESC)",children:"\xd7"}),(0,G.jsx)("div",{ref:e,className:"railroad-diagram-container railroad-diagram-modal"})]})})]})}},77433:(t,i,e)=>{e.r(i),e.d(i,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>h,toc:()=>c});const h=JSON.parse('{"id":"sql/reference/language-definition/transactions","title":"Transactions","description":"A transaction is a sequence of SQL operations that starts with the START TRANSACTION statement and ends with the COMMIT statement. Either the effect of all operations will be published, or no results will be published at all.","source":"@site/docs/sql/reference/language-definition/transactions.mdx","sourceDirName":"sql/reference/language-definition","slug":"/sql/reference/language-definition/transactions","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/transactions","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"transactions","title":"Transactions"},"sidebar":"tutorialSidebar","previous":{"title":"Distribution Zones","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones"},"next":{"title":"Grammar Reference","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference"}}');var s=e(74848),n=e(28453),a=e(63367);const r={id:"transactions",title:"Transactions"},o="Transactions",d={},c=[{value:"Example",id:"example",level:2}];function w(t){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"transactions",children:"Transactions"})}),"\n",(0,s.jsxs)(i.p,{children:["A transaction is a sequence of SQL operations that starts with the ",(0,s.jsx)(i.code,{children:"START TRANSACTION"})," statement and ends with the ",(0,s.jsx)(i.code,{children:"COMMIT"})," statement. Either the effect of all operations will be published, or no results will be published at all."]}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["Transaction control statements are only allowed within a ",(0,s.jsx)(i.a,{href:"/3.1.0/sql/working-with-sql/execute-queries",children:"script"}),"."]})}),"\n",(0,s.jsxs)(i.p,{children:["In Apache Ignite 3, you start the transaction by using the ",(0,s.jsx)(i.code,{children:"START TRANSACTION"})," statement:"]}),"\n",(0,s.jsx)(a.A,{children:"\nDiagram(\nTerminal('START TRANSACTION'),\nZeroOrMore(\nTerminal('READ ONLY'),\nTerminal('READ WRITE')))\n"}),"\n",(0,s.jsx)(i.admonition,{type:"note",children:(0,s.jsx)(i.p,{children:"DDL statements are not supported inside transactions."})}),"\n",(0,s.jsx)(i.p,{children:"Parameters:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"READ WRITE"})," - both read and write operations are allowed in the transaction. Used by default."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"READ ONLY"})," - only read operations are allowed in the transaction."]}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["You close and commit the transaction by using the ",(0,s.jsx)(i.code,{children:"COMMIT"})," statement:"]}),"\n",(0,s.jsx)(a.A,{children:"\nDiagram(\nTerminal('COMMIT'))\n"}),"\n",(0,s.jsx)(i.h2,{id:"example",children:"Example"}),"\n",(0,s.jsx)(i.p,{children:"The example below inserts 3 lines into the table in a single transaction, ensuring they will all be committed together:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"START TRANSACTION READ WRITE;\r\n\r\nINSERT INTO Person (id, name, surname) VALUES (1, 'John', 'Smith');\r\nINSERT INTO Person (id, name, surname) VALUES (2, 'Jane', 'Smith');\r\nINSERT INTO Person (id, name, surname) VALUES (3, 'Adam', 'Mason');\r\n\r\nCOMMIT;\n"})})]})}function l(t={}){const{wrapper:i}={...(0,n.R)(),...t.components};return i?(0,s.jsx)(i,{...t,children:(0,s.jsx)(w,{...t})}):w(t)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/24d94e02.71076815.js b/docs/ignite3/assets/js/24d94e02.71076815.js deleted file mode 100644 index 7f093689a4..0000000000 --- a/docs/ignite3/assets/js/24d94e02.71076815.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1079],{21264:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"administrators-guide/security/ssl-tls","title":"SSL/TLS","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/security/ssl-tls.md","sourceDirName":"administrators-guide/security","slug":"/administrators-guide/security/ssl-tls","permalink":"/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"SSL/TLS","sidebar_label":"SSL/TLS"},"sidebar":"tutorialSidebar","previous":{"title":"Cluster Security","permalink":"/docs/ignite3/3.0.0/administrators-guide/cluster-security"},"next":{"title":"SSL/TLS","permalink":"/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls"}}');var i=t(74848),s=t(28453);const o={title:"SSL/TLS",sidebar_label:"SSL/TLS"},a="SSL/TLS",c={},l=[{value:"Considerations",id:"considerations",level:2},{value:"REST",id:"rest",level:2},{value:"Clients and JDBC",id:"clients-and-jdbc",level:2},{value:"Server-side Configuration",id:"server-side-configuration",level:3},{value:"Client Configuration",id:"client-configuration",level:2},{value:"Java",id:"java",level:2},{value:".NET",id:"net",level:3},{value:"CLI",id:"cli",level:2},{value:"Network Configuration",id:"network-configuration",level:2},{value:"SSL Client Authentication (mTLS Support)",id:"ssl-client-authentication-mtls-support",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"ssltls",children:"SSL/TLS"})}),"\n",(0,i.jsx)(n.p,{children:"This page explains how to configure SSL/TLS encryption between the cluster nodes (server and client) and the clients that connect to your cluster."}),"\n",(0,i.jsx)(n.h2,{id:"considerations",children:"Considerations"}),"\n",(0,i.jsx)(n.p,{children:"All internal connections in the cluster context, as well as cluster's user interaction interfaces, are SSL-enabled. The communication categories are as follows:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Between the user and the cluster (node): REST"}),"\n",(0,i.jsx)(n.li,{children:"Between the user and the platform clients"}),"\n",(0,i.jsx)(n.li,{children:"Between nodes: Network (Messaging, Scalecube)"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"All SSL configurations activities are performed at the node level."}),"\n",(0,i.jsx)(n.p,{children:"Apache Ignite does not support direct paths to SSL certificates. Instead, it utilizes PKCS12 and JKS keystore."}),"\n",(0,i.jsx)(n.h2,{id:"rest",children:"REST"}),"\n",(0,i.jsx)(n.p,{children:"The standard implementation of SSL for REST involves configuring a secure connection on a separate port. Apache Ignite supports HTTP and HTTPS, each on its own port."}),"\n",(0,i.jsx)(n.p,{children:"The Apache Ignite 3 REST security configuration in the JSON format is provided below."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "rest" : {\r\n "dualProtocol" : false,\r\n "httpToHttpsRedirection" : false,\r\n "port" : 10300,\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "require",\r\n "enabled" : true,\r\n "keyStore" : {\r\n "password" : "may be empty",\r\n "path" : "must not be empty",\r\n "type" : "PKCS12"\r\n },\r\n "port" : 10400,\r\n "trustStore" : {\r\n "password" : "may be empty",\r\n "path" : "must not be empty",\r\n "type" : "PKCS12"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"clients-and-jdbc",children:"Clients and JDBC"}),"\n",(0,i.jsxs)(n.p,{children:["Apache Ignite 3 Client implementation is based on the Netty framework, which supports configuration for security connections via ",(0,i.jsx)(n.code,{children:"SSLContextBuilder"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"server-side-configuration",children:"Server-side Configuration"}),"\n",(0,i.jsx)(n.p,{children:"The default way to configure SSL on the server side is to update the configuration with SSL properties. The example below is in the JSON format."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "clientConnector" : {\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "require",\r\n "enabled" : true,\r\n "keyStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n },\r\n "trustStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["If you have enabled SSL for ",(0,i.jsx)(n.code,{children:"clientConnector"}),", and want to use JDBC, set the corresponding properties in your code:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'var url =\r\n "jdbc:ignite:thin://{address}:{port}"\r\n + "?sslEnabled=true"\r\n + "&trustStorePath=" + trustStorePath\r\n + "&trustStoreType=JKS"\r\n + "&trustStorePassword=" + password\r\n + "&clientAuth=require"\r\n + "&keyStorePath=" + keyStorePath\r\n + "&keyStoreType=PKCS12"\r\n + "&keyStorePassword=" + password;\r\n try (Connection conn = DriverManager.getConnection(url)) {\r\n // Other actions.\r\n }\n'})}),"\n",(0,i.jsx)(n.h2,{id:"client-configuration",children:"Client Configuration"}),"\n",(0,i.jsx)(n.h2,{id:"java",children:"Java"}),"\n",(0,i.jsxs)(n.p,{children:["To enable SSL in your Java clients, use the ",(0,i.jsx)(n.code,{children:"IgniteClient"})," class and pass the ssl configuration to it:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-Java",children:'var sslConfiguration = SslConfiguration.builder()\r\n .enabled(true)\r\n .ciphers("TLS_AES_256_GCM_SHA384")\r\n .trustStorePath(trustStorePath)\r\n .trustStorePassword(password)\r\n .keyStorePath(keyStorePath)\r\n .keyStorePassword(password)\r\n .build();\r\n\r\ntry (IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .ssl(sslConfiguration)\r\n .build();\r\n)\n'})}),"\n",(0,i.jsx)(n.h3,{id:"net",children:".NET"}),"\n",(0,i.jsxs)(n.p,{children:["Add the ",(0,i.jsx)(n.code,{children:"IgniteClientConfiguration.SslStreamFactory"})," property of type ",(0,i.jsx)(n.code,{children:"ISslStreamFactory"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Provide a ",(0,i.jsx)(n.a,{href:"https://github.com/apache/ignite/blob/66f43a4bee163aadb3ad731f6eb9a6dfde9faa73/modules/platforms/dotnet/Apache.Ignite.Core/Client/SslStreamFactory.cs",children:"predefined implementation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Use the base class library ",(0,i.jsx)(n.code,{children:"SslStream"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Basic usage without client authorization:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var cfg = new IgniteClientConfiguration { SslStreamFactory = new() }\n"})}),"\n",(0,i.jsx)(n.h2,{id:"cli",children:"CLI"}),"\n",(0,i.jsxs)(n.p,{children:["To SSL on the CLI side, use the ",(0,i.jsx)(n.code,{children:"cli config set"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"cli config set cli.trust-store.type=\r\ncli config set cli.trust-store.path=\r\ncli config set cli.trust-store.password=\n"})}),"\n",(0,i.jsx)(n.p,{children:"Store the CLI security configuration in a separate file with permission settings that protect it from unauthorized read/write operations. This configuration file must match profiles from the common configuration file."}),"\n",(0,i.jsx)(n.h2,{id:"network-configuration",children:"Network Configuration"}),"\n",(0,i.jsx)(n.p,{children:"The node network is based on the Netty framework. The configuration is the same as described for the Apache Ignite Client part except for the part that addresses the Apache Ignite 3 configuration."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "network" : {\r\n "ssl" : {\r\n "ciphers" : "",\r\n "enabled" : true,\r\n "keyStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n },\r\n "trustStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"ssl-client-authentication-mtls-support",children:"SSL Client Authentication (mTLS Support)"}),"\n",(0,i.jsx)(n.p,{children:"Optionally, the connections you utilize can support the client authentication feature. Configure it separately for each connection on the server side."}),"\n",(0,i.jsx)(n.p,{children:"Two-way authentication requires that both server and client have certificates they reciprocally trust. The client generates a private key, stores it in its keystore, and gets it signed by an entity the server's truststore trusts."}),"\n",(0,i.jsxs)(n.p,{children:["To support client authentication, a connection must include the ",(0,i.jsx)(n.code,{children:"clientAuth"}),", ",(0,i.jsx)(n.code,{children:"trustStore"})," and ",(0,i.jsx)(n.code,{children:"keyStore"})," properties. Here is an example of a possible client configuration. The example below is in the JSON format."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "clientConnector" : {\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "require",\r\n "enabled" : true,\r\n "keyStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n },\r\n "trustStore" : {\r\n "type" : "JKS",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var r=t(96540);const i={},s=r.createContext(i);function o(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/254bafb3.5367736b.js b/docs/ignite3/assets/js/254bafb3.5367736b.js deleted file mode 100644 index d790b7f053..0000000000 --- a/docs/ignite3/assets/js/254bafb3.5367736b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1926],{28453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>l});var a=r(96540);const i={},s=a.createContext(i);function t(e){const n=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),a.createElement(s.Provider,{value:n},e.children)}},38169:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"sql-reference/operational-commands","title":"Operational Commands","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-reference/operational-commands.md","sourceDirName":"sql-reference","slug":"/sql-reference/operational-commands","permalink":"/docs/ignite3/3.0.0/sql-reference/operational-commands","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Operational Commands","sidebar_label":"Operational Commands"},"sidebar":"tutorialSidebar","previous":{"title":"Operators and Functions","permalink":"/docs/ignite3/3.0.0/sql-reference/operators-and-functions"},"next":{"title":"Grammar Reference","permalink":"/docs/ignite3/3.0.0/sql-reference/grammar-reference"}}');var i=r(74848),s=r(28453);const t={title:"Operational Commands",sidebar_label:"Operational Commands"},l=void 0,o={},c=[{value:"SELECT",id:"select",level:2},{value:"Parameters",id:"parameters",level:3},{value:"JOINs",id:"joins",level:3},{value:"COPY INTO",id:"copy-into",level:2},{value:"Description",id:"description",level:3},{value:"Parameters",id:"parameters-1",level:3},{value:"Examples",id:"examples",level:3},{value:"KILL QUERY",id:"kill-query",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"KILL TRANSACTION",id:"kill-transaction",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"KILL COMPUTE",id:"kill-compute",level:2},{value:"Parameters",id:"parameters-4",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(n.h2,{id:"select",children:"SELECT"}),"\n",(0,i.jsx)(n.p,{children:"Retrieves data from a table or multiple tables."}),"\n","\n","\n",(0,i.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"hint_comment"})," - an sql ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-tuning/#optimizer-hints",children:"optimizer hint"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"where_boolean_expression"})," - an SQL expression that is run against table records and returns a boolean value. Only the records for which ",(0,i.jsx)(n.code,{children:"TRUE"})," was returned will be returned. If not specified, all matching records are returned."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"having_boolean_expression"})," - an SQL expression that is run against groups and returns a boolean value. Can use ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/operators-and-functions#aggregate-functions",children:"aggregate functions"}),". Only the groups for which ",(0,i.jsx)(n.code,{children:"TRUE"})," was returned will be returned. If not specified, all matching groups are returned."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"joins",children:"JOINs"}),"\n",(0,i.jsx)(n.p,{children:"Apache Ignite supports colocated and non-colocated distributed SQL joins. Furthermore, if the data resides in different tables, Apache Ignite allows for cross-table joins as well."}),"\n",(0,i.jsx)(n.h2,{id:"copy-into",children:"COPY INTO"}),"\n",(0,i.jsx)(n.h3,{id:"description",children:"Description"}),"\n",(0,i.jsx)(n.p,{children:"Imports data from an external source into a table or exports data to a file from the table. The table the data is imported into must exist."}),"\n","\n",(0,i.jsx)(n.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"source"})," - the full path to the file to import the data data from (if ",(0,i.jsx)(n.code,{children:"target"})," is a table). Then name of the table and the list of columns to export the data from (if ",(0,i.jsx)(n.code,{children:"target"})," is a file). If the source is a table, you can further narrow down the selection by using a query."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"target"})," - the table and table columns when importing data to the table. The path to the file when exporting data."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"formatType"})," - the format of the file to work with:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"CSV"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"PARQUET"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"ICEBERG"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"WITH"})," - accepts additional parameters. All properties are case-sensitive:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"delimiter"})," - for CSV files only; default delimiter is ",(0,i.jsx)(n.code,{children:","}),". Delimiter syntax is ",(0,i.jsx)(n.code,{children:"'char'"}),". Any alphanumeric character can be a delimiter."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"pattern"})," - the file pattern used when importing partitioned Parquet tables in the regular expression format. The regular expression must be enclosed in ",(0,i.jsx)(n.code,{children:"'"})," signs. For example, ",(0,i.jsx)(n.code,{children:"'.*'"})," imports all files. Partitioned column will not be imported."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"header"})," - for CSV files only; if set to ",(0,i.jsx)(n.code,{children:"true"}),", specifies that the created file should contain a header line with column names. Column names of the table are used to create the header line."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"quoteChar"})," - for CSV files only; the character to use for quoted elements. Default quote character is ",(0,i.jsx)(n.code,{children:'"'}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"escapeChar"})," - for CSV files only; the character to use for escaping a separator or quote. Default escape character is ",(0,i.jsx)(n.code,{children:"\\"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ignoreLeadingWhiteSpace"})," - for CSV files only; if ",(0,i.jsx)(n.code,{children:"true"}),", ignore leading whitespace, keep them otherwise. Default value is ",(0,i.jsx)(n.code,{children:"true"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ignoreQuotations"})," - for CSV files only; if ",(0,i.jsx)(n.code,{children:"true"}),", quoted elements are ignored, otherwise they are kept. Default value is ",(0,i.jsx)(n.code,{children:"false"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"strictQuotes"})," - for CSV files only; if ",(0,i.jsx)(n.code,{children:"true"}),", characters outside the quoted elements are ignored, otherwise they are kept. Default value is ",(0,i.jsx)(n.code,{children:"false"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"batchSize"})," - the number of entries loaded in each batch. Default value is ",(0,i.jsx)(n.code,{children:"1024"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"null"})," - what value empty values are mapped to on import, and ",(0,i.jsx)(n.code,{children:"null"})," values are mapped to on export. By default, empty values are mapped to ",(0,i.jsx)(n.code,{children:"null"})," on import, and ",(0,i.jsx)(n.code,{children:"null"})," values are mapped to an empty string (",(0,i.jsx)(n.code,{children:'""'}),") on export."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"S3"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"s3.client-region"})," - when using S3 storage, the region to store the data in."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"s3.access-key-id"})," - when using S3 storage, the AWS access key."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"s3.secret-access-key"})," - when using S3 storage, the AWS secret key."]}),"\n",(0,i.jsxs)(n.li,{children:["Iceberg-specific:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.a,{href:"https://iceberg.apache.org/docs/latest/configuration/#catalog-properties",children:"catalog properties"})," are supported."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"table-identifier"})," property describes Apache Iceberg TableIdentifier names. The names can be dot-separated. For example, ",(0,i.jsx)(n.code,{children:"db_name.table_name"})," or ",(0,i.jsx)(n.code,{children:"table"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"warehouse"})," path can be defined explicitly as a ",(0,i.jsx)(n.code,{children:"'warehouse'='path'"})," property, or implicitly as a source or target ",(0,i.jsx)(n.code,{children:"COPY FROM source INTO target"}),". If both ways are defined, the explicit property is used."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,i.jsxs)(n.p,{children:["Imports data from columns ",(0,i.jsx)(n.code,{children:"name"})," and ",(0,i.jsx)(n.code,{children:"age"})," of a CSV file with header into Table1 columns ",(0,i.jsx)(n.code,{children:"name"})," and ",(0,i.jsx)(n.code,{children:"age"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"/* Import data from CSV with column headers */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age)\r\nFORMAT CSV\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Imports data from the first two columns of a CSV file without header into Table1 columns ",(0,i.jsx)(n.code,{children:"name"})," and ",(0,i.jsx)(n.code,{children:"age"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"/* Import data from CSV without column headers */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age)\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Imports data from columns ",(0,i.jsx)(n.code,{children:"name"})," and ",(0,i.jsx)(n.code,{children:"age"})," of a CSV file that uses the ",(0,i.jsx)(n.code,{children:"~"})," symbol as quotation character:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"/* Import data from CSV with custom quotation character */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age)\r\nFORMAT CSV\r\nWITH 'quoteChar'='~'\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Imports data from columns ",(0,i.jsx)(n.code,{children:"name"}),", ",(0,i.jsx)(n.code,{children:"age"})," and ",(0,i.jsx)(n.code,{children:"empty"})," of a CSV file and maps all empty values to ",(0,i.jsx)(n.code,{children:"no data"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"/* Import data from CSV with custom quotation character */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age, empty)\r\nFORMAT CSV\r\nWITH 'null'='no data'\n"})}),"\n",(0,i.jsx)(n.p,{children:"Imports data from CSV table in batches of 2048 entries:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"/* Import data from CSV without column headers */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age)\r\nWITH 'batchSize'='2048'\n"})}),"\n",(0,i.jsx)(n.p,{children:"Exports data from Table1 to a CSV file:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"/* Export data to CSV */\r\nCOPY FROM (SELECT name, age FROM Table1)\r\nINTO '/path/to/dir/data.csv'\r\nFORMAT CSV\n"})}),"\n",(0,i.jsx)(n.p,{children:"Imports CSV file from AWS S3 into Table1:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"/* Import CSV file from s3 */\r\nCOPY FROM 's3://mybucket/data.csv'\r\nINTO Table1 (name, age)\r\nFORMAT CSV\r\nWITH 'delimiter'= '|', 's3.access-key-id' = 'keyid', 's3.secret-access-key' = 'secretkey'\n"})}),"\n",(0,i.jsx)(n.p,{children:"A simple example of exporting data to Iceberg. For working with local file system you can use HadoopCatalog that does not need to connect to a Hive MetaStore."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COPY FROM Table1 (id,name,height)\r\nINTO '/tmp/person.i/'\r\nFORMAT ICEBERG\r\nWITH 'table-identifier'='person', 'catalog-impl'='org.apache.iceberg.hadoop.HadoopCatalog'\n"})}),"\n",(0,i.jsx)(n.p,{children:"Exports data into Iceberg on AWS S3:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COPY FROM person (id,name,height)\r\nINTO 's3://iceberg-warehouse/glue-catalog'\r\nFORMAT ICEBERG\r\nWITH\r\n 'table-identifier'='iceberg_db_1.person',\r\n 'io-impl'='org.apache.iceberg.aws.s3.S3FileIO',\r\n 'catalog-impl'='org.apache.iceberg.aws.glue.GlueCatalog',\r\n 's3.client-region'='eu-central-1',\r\n 's3.access-key-id'='YOUR_KEY',\r\n 's3.secret-access-key'='YOUR_SECRET'\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["Glue catalog requires the table identifier pattern ",(0,i.jsx)(n.code,{children:"db_name.table_name - [a-z0-9_]"})," (all letters must be in low case with underscores and no spaces). It can be disabled by setting the ",(0,i.jsx)(n.code,{children:"glue.skip-name-validation"})," property to ",(0,i.jsx)(n.code,{children:"true"})," to skip validation. When database name and table name validation are skipped, there is no guarantee that downstream systems would all support the names."]})}),"\n",(0,i.jsx)(n.p,{children:"Imports data from partitioned Parquet database:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COPY FROM '/tmp/partitioned_table_dir'\r\nINTO city (id, name, population)\r\nFORMAT PARQUET\r\nWITH 'pattern' = '.*'\n"})}),"\n",(0,i.jsx)(n.p,{children:"Where the Parquet table looks like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"partitioned_table_dir/\r\n\u251c\u2500 CountryCode=USA/\r\n\u2502 \u251c\u2500 000000_0.parquet\r\n\u251c\u2500 CountryCode=FR/\r\n\u2502 \u251c\u2500 000000_0.parquet\n"})}),"\n",(0,i.jsx)(n.h2,{id:"kill-query",children:"KILL QUERY"}),"\n",(0,i.jsxs)(n.p,{children:["Cancels a running query. When a query is canceled with the ",(0,i.jsx)(n.code,{children:"KILL"})," command, all parts of the query running on all other nodes are canceled too."]}),"\n","\n",(0,i.jsx)(n.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"query_id"})," - query identifier that can be retrieved via the ",(0,i.jsx)(n.code,{children:"SQL_QUERIES"})," ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views",children:"system view"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"NO WAIT"})," - if specified, the command will return control immediately, without waiting for the query to be cancelled. You can monitor query status through the ",(0,i.jsx)(n.code,{children:"SQL_QUERIES"})," ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views",children:"system view"})," to make sure it was cancelled."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"kill-transaction",children:"KILL TRANSACTION"}),"\n",(0,i.jsx)(n.p,{children:"Cancels an active transaction."}),"\n","\n",(0,i.jsx)(n.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"transaction_id"})," - transaction identifier that can be retrieved via the ",(0,i.jsx)(n.code,{children:"TRANSACTIONS"})," ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views",children:"system view"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"NO WAIT"})," - if specified, the command will return control immediately, without waiting for the transaction to be cancelled. You can monitor transaction status through the ",(0,i.jsx)(n.code,{children:"TRANSACTIONS"})," ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views",children:"system view"})," to make sure it was cancelled."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"kill-compute",children:"KILL COMPUTE"}),"\n",(0,i.jsxs)(n.p,{children:["Cancels a running compute job. When a job is canceled with the ",(0,i.jsx)(n.code,{children:"KILL"})," command, all parts of the job running on all other nodes are canceled too."]}),"\n","\n",(0,i.jsx)(n.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"job_id"})," - job identifier that can be retrieved via the ",(0,i.jsx)(n.code,{children:"COMPUTE_JOBS"})," ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views",children:"system view"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"NO WAIT"})," - if specified, the command will return control immediately, without waiting for the job to be cancelled. You can monitor job status through the ",(0,i.jsx)(n.code,{children:"COMPUTE_JOBS"})," ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views",children:"system view"})," to make sure it was cancelled."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/25653805.dbeadb34.js b/docs/ignite3/assets/js/25653805.dbeadb34.js deleted file mode 100644 index bb6591eeec..0000000000 --- a/docs/ignite3/assets/js/25653805.dbeadb34.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[295],{28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var s=t(96540);const i={},l=s.createContext(i);function r(e){const n=s.useContext(l);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(l.Provider,{value:n},e.children)}},63827:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"developers-guide/clients/jdbc-driver","title":"JDBC Driver","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/clients/jdbc-driver.md","sourceDirName":"developers-guide/clients","slug":"/developers-guide/clients/jdbc-driver","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"JDBC Driver","sidebar_label":"JDBC"},"sidebar":"tutorialSidebar","previous":{"title":"LINQ","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/linq"},"next":{"title":"Introduction","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine"}}');var i=t(74848),l=t(28453);const r={title:"JDBC Driver",sidebar_label:"JDBC"},a=void 0,d={},c=[{value:"Setting Up",id:"setting-up",level:2},{value:"Parameter Precedence",id:"parameter-precedence",level:3},{value:"Performing Transactions",id:"performing-transactions",level:2},{value:"Unsupported Mandatory JDBC Features",id:"unsupported-mandatory-jdbc-features",level:2},{value:"Unsupported Optional JDBC Features",id:"unsupported-optional-jdbc-features",level:2},{value:"JDBC Features with Limited Support",id:"jdbc-features-with-limited-support",level:2}];function o(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsxs)(n.p,{children:["Apache Ignite is shipped with JDBC driver that allows processing of distributed data using standard SQL statements like ",(0,i.jsx)(n.code,{children:"SELECT"}),", ",(0,i.jsx)(n.code,{children:"INSERT"}),", ",(0,i.jsx)(n.code,{children:"UPDATE"}),", or ",(0,i.jsx)(n.code,{children:"DELETE"})," directly from the JDBC side. The name of the driver's class is ",(0,i.jsx)(n.code,{children:"org.apache.ignite.jdbc.IgniteJdbcDriver"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"This implementation of JDBC driver does not support:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Multiple endpoints"}),"\n",(0,i.jsx)(n.li,{children:"JDBC connection pools"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"See also:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#unsupported-mandatory-jdbc-features",children:"Unsupported Mandatory JDBC Features"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#unsupported-optional-jdbc-features",children:"Unsupported Optional JDBC Features"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#jdbc-features-with-limited-support",children:"JDBC Features with Limited Support"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"setting-up",children:"Setting Up"}),"\n",(0,i.jsxs)(n.p,{children:["JDBC driver uses the client connector to work with the cluster. For more information on configuring client connector, see ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/clients/#client-connector-configuration",children:"Client Connector Configuration"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"The JDBC connector needs to be included from Maven:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-xml",children:"\r\n org.apache.ignite\r\n ignite-jdbc\r\n 3.0.0\r\n\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Here is how you can open a JDBC connection to the cluster node listening on IP address ",(0,i.jsx)(n.code,{children:"127.0.0.1"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800");\n'})}),"\n",(0,i.jsx)(n.p,{children:"The driver connects to one of the cluster nodes and forwards all the queries to it for final execution. The node handles the query distribution and the result's aggregations. Then the result is sent back to the client application."}),"\n",(0,i.jsx)(n.p,{children:"The JDBC connection string can have an optional list of name-value pairs as parameters after the '?' delimiter. Name and value are separated by the '=' symbol and multiple properties are separated either by an '&' or a ';'.\r\nSeparate sign can't be mixed and should be either semicolon or ampersand sign."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"jdbc:ignite:thin://host[:port][,host[:port][/schema][[?parameter1=value1][¶meter2=value2],...]]\r\njdbc:ignite:thin://host[:port][,host[:port][/schema][[?parameter1=value1][;parameter2=value2],...]]\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"host"})," is required and defines the host of the cluster node to connect to."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"port"})," is the port to use to open the connection. 10800 is used by default if this parameter is omitted."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"schema"})," is the schema name to access. PUBLIC is used by default. This name should correspond to the SQL ANSI-99 standard. Non-quoted identifiers are not case sensitive. Quoted identifiers are case sensitive. When semicolon format is used, the schema may be defined as a parameter with name schema."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"parameters"})," are optional parameters. The following parameters are available:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"connectionTimeZone"})," - Client connection time-zone ID. This property can be used by the client to change the time zone of the session on the server. Affects the interpretation of dates in queries that do not specify the time zone explicitly. If not set, system default on client timezone will be used."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"queryTimeout"})," - Number of seconds the driver will wait for a ",(0,i.jsx)(n.code,{children:"Statement"})," object to execute. 0 means there is no limit. Default value: ",(0,i.jsx)(n.code,{children:"0"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"connectionTimeout"})," - Number of milliseconds JDBC client will wait for server to respond. 0 means there is no limit. Default value: ",(0,i.jsx)(n.code,{children:"0"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"reconnectThrottlingPeriod"})," - Reconnect throttling period, in milliseconds. 0 means there is no limit. Default value: ",(0,i.jsx)(n.code,{children:"30_000"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"reconnectThrottlingRetries"})," - Reconnect throttling retries. 0 means there is no limit. Default value: ",(0,i.jsx)(n.code,{children:"3"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"username"})," - username for basic authentication to the cluster."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"password"})," - user password for basic authentication to the cluster."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"sslEnabled"})," - Determines if SSL is enabled. Possible values: ",(0,i.jsx)(n.code,{children:"true"}),", ",(0,i.jsx)(n.code,{children:"false"}),". Default value: ",(0,i.jsx)(n.code,{children:"false"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"trustStorePath"})," - Path to trust store on client side."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"trustStorePassword"})," - Trust store password."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"keyStorePath"})," - Path to key store on client side."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"keyStorePassword"})," - Key store password."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"clientAuth"})," - SSL client authentication. Possible values: ",(0,i.jsx)(n.code,{children:"NONE"}),", ",(0,i.jsx)(n.code,{children:"OPTIONAL"}),", ",(0,i.jsx)(n.code,{children:"REQUIRE"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ciphers"})," - comma-separated SSL ciphers list."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"parameter-precedence",children:"Parameter Precedence"}),"\n",(0,i.jsx)(n.p,{children:"If the same parameters are passed by using different means, the JDBC driver prioritizes them in the following way:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["API arguments passed in the ",(0,i.jsx)(n.code,{children:"Connection"})," objects;"]}),"\n",(0,i.jsx)(n.li,{children:"Last instance of the parameter in the connection string;"}),"\n",(0,i.jsx)(n.li,{children:"Properties object passed during connection."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"performing-transactions",children:"Performing Transactions"}),"\n",(0,i.jsxs)(n.p,{children:["With the JDBC driver, you can perform ",(0,i.jsx)(n.code,{children:"commit"})," and ",(0,i.jsx)(n.code,{children:"rollback"})," transactions. For more information about transactions, see ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/transactions",children:"Performing Transactions"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Here is how you can commit a transaction:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'// Open the JDBC connection.\r\nConnection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800");\r\n\r\n// Commit a transaction\r\nconn.commit();\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can also configure Apache Ignite to automatically commit transactions by using the ",(0,i.jsx)(n.code,{children:"setAutoCommit()"})," method."]}),"\n",(0,i.jsx)(n.p,{children:"Here is how you can rollback a transaction:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"conn.rollback();\n"})}),"\n",(0,i.jsx)(n.h2,{id:"unsupported-mandatory-jdbc-features",children:"Unsupported Mandatory JDBC Features"}),"\n",(0,i.jsx)(n.p,{children:"The following mandatory JDBC features are currently not supported (sorted alphabetically):"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#clearWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#getWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#prepareCall"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#getParameterMetaData"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setAsciiStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setBinaryStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#clearWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getAsciiStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getBinaryStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#setFetchDirection"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#clearWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#getWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setEscapeProcessing"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setFetchDirection"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setMaxFieldSize"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"unsupported-optional-jdbc-features",children:"Unsupported Optional JDBC Features"}),"\n",(0,i.jsx)(n.p,{children:"The following optional JDBC features are currently not supported (sorted alphabetically):"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createArrayOf"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createBlob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createNClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createSQLXML"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createStruct"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#getTypeMap"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#releaseSavepoint"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#setSavepoint"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#setTypeMap"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Driver#getParentLogger"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#getMetaData"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setArray"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setBlob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setNCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setNClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setRef"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setRowId"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setSQLXML"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setUnicodeStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setURL"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#cancelRowUpdates"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#deleteRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getArray"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getBlob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getNCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getNClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getRef"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getRowId"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getSQLXML"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getUnicodeStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#insertRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#moveToInsertRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#refreshRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateArray"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateAsciiStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBigDecimal"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBinaryStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBlob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBoolean"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateByte"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBytes"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateDate"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateDouble"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateFloat"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateInt"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateLong"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateNCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateNClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateNString"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateNull"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateObject"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateRef"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateRowId"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateShort"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateSQLXML"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateString"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateTime"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateTimestamp"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#getGeneratedKeys"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setCursorName"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setPoolable"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"jdbc-features-with-limited-support",children:"JDBC Features with Limited Support"}),"\n",(0,i.jsx)(n.p,{children:"The following JDBC features are supported only in specific cases:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Feature"}),(0,i.jsx)(n.th,{children:"Supported Cases"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Connection#prepareStatement"}),(0,i.jsx)(n.td,{children:"autoGeneratedKeys=Statement.NO_GENERATED_KEYS, resultSetType=ResultSet.TYPE_FORWARD_ONLY, resultSetConcurrency=ResultSet.CONCUR_READ_ONLY, null or empty columnIndexes, and null or empty columnNames."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Connection#rollback"}),(0,i.jsx)(n.td,{children:"Without savepoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Statement#execute"}),(0,i.jsx)(n.td,{children:"autoGeneratedKeys=Statement.NO_GENERATED_KEYS, null or empty columnIndexes, and null or empty columnNames."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Statement#executeUpdate"}),(0,i.jsx)(n.td,{children:"autoGeneratedKeys=Statement.NO_GENERATED_KEYS, null or empty columnIndexes, and null or empty columnNames."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Statement#getMoreResults"}),(0,i.jsx)(n.td,{children:"current=Statement.CLOSE_CURRENT_RESULT."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/25efb993.08deb671.js b/docs/ignite3/assets/js/25efb993.08deb671.js deleted file mode 100644 index f1c9b0c9a4..0000000000 --- a/docs/ignite3/assets/js/25efb993.08deb671.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2846],{4671:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"api-reference/native-clients/dotnet/ado-net-api","title":"ADO.NET API","description":"Apache Ignite implements ADO.NET classes, such as DbConnection, DbCommand, DbDataReader, etc.,","source":"@site/docs/api-reference/native-clients/dotnet/ado-net-api.md","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/ado-net-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"ADO.NET API","id":"ado-net-api","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"SQL API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api"},"next":{"title":"Transactions API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api"}}');var r=a(74848),s=a(28453);const i={title:"ADO.NET API",id:"ado-net-api",sidebar_position:5},o=void 0,c={},d=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Installation",id:"installation",level:3},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Executing SQL Commands",id:"executing-sql-commands",level:2},{value:"Reading Data From Cluster",id:"reading-data-from-cluster",level:2},{value:"Using Parameters",id:"using-parameters",level:2},{value:"Transactions",id:"transactions",level:2},{value:"Full Example",id:"full-example",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Apache Ignite implements ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-overview",children:"ADO.NET"})," classes, such as ",(0,r.jsx)(n.code,{children:"DbConnection"}),", ",(0,r.jsx)(n.code,{children:"DbCommand"}),", ",(0,r.jsx)(n.code,{children:"DbDataReader"}),", etc.,\r\nallowing you to use standard ADO.NET components to interact with Ignite SQL."]}),"\n",(0,r.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,r.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"To use C# thin client, .NET 8.0 or newer is required."}),"\n",(0,r.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(n.p,{children:["C# client is available via NuGet. To add it, use the ",(0,r.jsx)(n.code,{children:"add package"})," command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet add package Apache.Ignite --version {version}\n"})}),"\n",(0,r.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,r.jsx)(n.p,{children:"To connect to an Apache Ignite cluster, create a new connection with the connection string:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var connStr = "Endpoints=localhost:10800";\n'})}),"\n",(0,r.jsx)(n.p,{children:"The connection string has the following parameters:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Endpoints"}),(0,r.jsx)(n.td,{children:"Required. Comma-separated list of server addresses with ports."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"SocketTimeout"}),(0,r.jsxs)(n.td,{children:["Time span for socket operations timeout in ",(0,r.jsx)(n.code,{children:"hh:mm:ss"})," format. 30 seconds by default."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"OperationTimeout"}),(0,r.jsxs)(n.td,{children:["Time span for operation timeout in ",(0,r.jsx)(n.code,{children:"hh:mm:ss"})," format. No timeout by default."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"HeartbeatInterval"}),(0,r.jsxs)(n.td,{children:["Time span between heartbeat messages to keep connection alive in ",(0,r.jsx)(n.code,{children:"hh:mm:ss.f"})," format. 30 seconds by default."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ReconnectInterval"}),(0,r.jsxs)(n.td,{children:["Time span between reconnection attempts in ",(0,r.jsx)(n.code,{children:"hh:mm:ss"})," format. 30 seconds by default."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"SslEnabled"}),(0,r.jsxs)(n.td,{children:["Boolean value to enable/disable SSL encryption. ",(0,r.jsx)(n.code,{children:"False"})," by default."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Username"}),(0,r.jsx)(n.td,{children:"Username for authentication."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Password"}),(0,r.jsx)(n.td,{children:"Password for authentication."})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"The example below shows a complete connection string with all parameters"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Endpoints=localhost:10800,localhost:10801;SocketTimeout=00:00:10;OperationTimeout=00:03:30;\r\nHeartbeatInterval=00:00:05.5;ReconnectInterval=00:01:00;SslEnabled=True;Username=user;Password=pass\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Using the connection string, you can establish a connection to an Ignite cluster with the ",(0,r.jsx)(n.code,{children:"IgniteDbConnection"})," class:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var connStr = "Endpoints=localhost:10800";\r\nawait using var conn = new IgniteDbConnection(connStr);\r\nawait conn.OpenAsync();\n'})}),"\n",(0,r.jsx)(n.h2,{id:"executing-sql-commands",children:"Executing SQL Commands"}),"\n",(0,r.jsxs)(n.p,{children:["You can use the ",(0,r.jsx)(n.code,{children:"IgniteDbConnection.CreateCommand"})," method to create a command and then execute it with one of the ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/executing-a-command",children:"execution commands"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The example below does not expect the command to return any rows, and uses the ",(0,r.jsx)(n.code,{children:"ExecuteNonQueryAsync"})," command."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'DbCommand cmd = conn.CreateCommand();\r\ncmd.CommandText = "DROP TABLE IF EXISTS Person";\r\nawait cmd.ExecuteNonQueryAsync();\n'})}),"\n",(0,r.jsx)(n.h2,{id:"reading-data-from-cluster",children:"Reading Data From Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["You can retrieve data from the cluster in a similar way to using ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/retrieving-data-using-a-datareader",children:"Data Readers"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"The example below shows how you can get data from your cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'DbCommand cmd = conn.CreateCommand();\r\ncmd.CommandText = "SELECT * FROM Person";\r\nawait using var reader = await cmd.ExecuteReaderAsync();\r\n\r\nwhile (await reader.ReadAsync())\r\n{\r\n Console.WriteLine($"Person [ID={reader.GetInt32(0)}, Name={reader.GetString(1)}]");\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"using-parameters",children:"Using Parameters"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"Apache Ignite only supports input parameters. Parameter types are automatically inferred from the SQL query context, so you do not need to specify the parameter type explicitly."})}),"\n",(0,r.jsxs)(n.p,{children:["Apache Ignite supports parameterized queries using positional parameters. You can use the ",(0,r.jsx)(n.code,{children:"IgniteDbConnection.CreateParameter()"})," method to create parameters that will replace the ",(0,r.jsx)(n.code,{children:"?"})," placeholders in your query text."]}),"\n",(0,r.jsx)(n.p,{children:"The example below shows how you can parametrize your query:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'DbCommand cmd = conn.CreateCommand();\r\ncmd.CommandText = "INSERT INTO Person (ID, Name) VALUES (?, ?)";\r\n\r\nDbParameter idParam = cmd.CreateParameter();\r\nidParam.Value = 1;\r\ncmd.Parameters.Add(idParam);\r\n\r\nDbParameter nameParam = cmd.CreateParameter();\r\nnameParam.Value = "John Doe";\r\ncmd.Parameters.Add(nameParam);\r\n\r\nawait cmd.ExecuteNonQueryAsync();\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Parameters must be added in the exact order they appear in the query. The first ",(0,r.jsx)(n.code,{children:"?"})," corresponds to the first parameter added, the second ",(0,r.jsx)(n.code,{children:"?"})," to the second parameter, etc."]}),"\n",(0,r.jsxs)(n.p,{children:["To pass null values, set the parameter value to ",(0,r.jsx)(n.code,{children:"null"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"DbParameter param = cmd.CreateParameter();\r\nparam.Value = null;\r\ncmd.Parameters.Add(param);\n"})}),"\n",(0,r.jsx)(n.h2,{id:"transactions",children:"Transactions"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Apache Ignite does not support custom isolation levels. All transactions are effectively ",(0,r.jsx)(n.code,{children:"Serializable"}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["You can use the ",(0,r.jsx)(n.code,{children:"DbConnection.BeginTransaction"})," method to start a transaction."]}),"\n",(0,r.jsx)(n.p,{children:"No data will be committed to the database until the transaction is committed. You can discard all changes with a rollback method:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"await using DbTransaction tx = await conn.BeginTransactionAsync();\r\ncmd.Transaction = tx;\r\n// ...\r\n// Commit the transaction.\r\nawait tx.CommitAsync();\r\n// Roll back the transaction if needed.\r\n// await tx.RollbackAsync();\n"})}),"\n",(0,r.jsx)(n.h2,{id:"full-example",children:"Full Example"}),"\n",(0,r.jsx)(n.p,{children:"The example below shows how you can work with an Apache Ignite cluster via ADO.NET:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var connStr = $"Endpoints=localhost:10800";\r\nawait using var conn = new IgniteDbConnection(connStr);\r\nawait conn.OpenAsync();\r\n\r\nDbCommand createTableCmd = conn.CreateCommand();\r\ncreateTableCmd.CommandText = "CREATE TABLE IF NOT EXISTS Person (ID INT PRIMARY KEY, Name VARCHAR)";\r\nawait createTableCmd.ExecuteNonQueryAsync();\r\n\r\nDbCommand insertCmd = conn.CreateCommand();\r\ninsertCmd.CommandText = "INSERT INTO Person (ID, Name) VALUES (?, ?)";\r\n\r\nawait using DbTransaction tx = await conn.BeginTransactionAsync();\r\ninsertCmd.Transaction = tx;\r\n\r\nDbParameter idParam = insertCmd.CreateParameter();\r\ninsertCmd.Parameters.Add(idParam);\r\n\r\nDbParameter nameParam = insertCmd.CreateParameter();\r\ninsertCmd.Parameters.Add(nameParam);\r\n\r\nfor (var i = 1; i <= 3; i++)\r\n{\r\n idParam.Value = i;\r\n nameParam.Value = "Person " + i;\r\n await insertCmd.ExecuteNonQueryAsync();\r\n}\r\n\r\nawait tx.CommitAsync();\r\n\r\nDbCommand selectCmd = conn.CreateCommand();\r\nselectCmd.CommandText = "SELECT * FROM Person WHERE ID > ?";\r\n\r\nDbParameter selectParam = selectCmd.CreateParameter();\r\nselectParam.Value = 1;\r\nselectCmd.Parameters.Add(selectParam);\r\n\r\nawait using var reader = await selectCmd.ExecuteReaderAsync();\r\n\r\nfor (var i = 0; i < reader.FieldCount; i++)\r\n{\r\n Console.WriteLine($"{reader.GetName(i)}: {reader.GetFieldType(i)}");\r\n}\r\n\r\nwhile (await reader.ReadAsync())\r\n{\r\n int id = reader.GetInt32(0);\r\n string name = reader.GetString(1);\r\n\r\n Console.WriteLine($"Person [ID={id}, Name={name}]");\r\n}\n'})})]})}function m(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,n,a)=>{a.d(n,{R:()=>i,x:()=>o});var t=a(96540);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/264dac2b.9cbca246.js b/docs/ignite3/assets/js/264dac2b.9cbca246.js deleted file mode 100644 index 3bc600a5e8..0000000000 --- a/docs/ignite3/assets/js/264dac2b.9cbca246.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6387],{28453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(96540);const r={},o=n.createContext(r);function s(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:t},e.children)}},60973:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"administrators-guide/config/storage/persistent","title":"Persistent Storage","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/config/storage/persistent.md","sourceDirName":"administrators-guide/config/storage","slug":"/administrators-guide/config/storage/persistent","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Persistent Storage","sidebar_label":"Persistent Storage"},"sidebar":"tutorialSidebar","previous":{"title":"Data Partitioning","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions"},"next":{"title":"RocksDB Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb"}}');var r=i(74848),o=i(28453);const s={title:"Persistent Storage",sidebar_label:"Persistent Storage"},a="Persistent Storage",d={},c=[{value:"Overview",id:"overview",level:2},{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Checkpointing",id:"checkpointing",level:2},{value:"Write Throttling",id:"write-throttling",level:2},{value:"Storage Configuration",id:"storage-configuration",level:2}];function l(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"persistent-storage",children:"Persistent Storage"})}),"\n",(0,r.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(t.p,{children:"Apache Ignite Persistence is designed to provide a quick and responsive persistent storage.\r\nWhen using the persistent storage, Apache Ignite stores all the data on disk, and loads as much data as it can into RAM for processing."}),"\n",(0,r.jsx)(t.p,{children:"When persistence is enabled, Apache Ignite stores each partition in a separate file on disk. In addition to data partitions, Apache Ignite stores indexes and metadata."}),"\n",(0,r.jsx)(t.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,r.jsx)(t.p,{children:"Each Apache Ignite storage engine can have several storage profiles."}),"\n",(0,r.jsx)(t.h2,{id:"checkpointing",children:"Checkpointing"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.em,{children:"Checkpointing"})," is the process of copying dirty pages from RAM to partition files on disk. A dirty page is a page that was updated in RAM but was not written to the respective partition file."]}),"\n",(0,r.jsx)(t.p,{children:"After a checkpoint is created, all changes are persisted to disk and will be available if the node crashes and is restarted."}),"\n",(0,r.jsx)(t.p,{children:"Checkpointing is designed to ensure durability of data and recovery in case of a node failure."}),"\n",(0,r.jsx)(t.p,{children:"This process helps you utilize disk space frugally by keeping pages in the most up-to-date state on disk."}),"\n",(0,r.jsx)(t.h2,{id:"write-throttling",children:"Write Throttling"}),"\n",(0,r.jsxs)(t.p,{children:["If a dirty page, scheduled for checkpointing, is updated before being written to disk, its previous state is copied to a special region called a checkpointing buffer. If the buffer overflows, Apache Ignite would have to stop processing all updates until the ",(0,r.jsx)(t.a,{href:"#checkpointing",children:"Checkpointing"})," is over. As a result, write performance would drop to zero until the checkpointing cycle is completed."]}),"\n",(0,r.jsx)(t.p,{children:"To avoid the scenario where all updates are stopped, Apache Ignite always performs write throttling once the checkpoint buffer is two-thirds full. Once the threshold is reached, checkpoint writer priority is increased, and more priority is given to checkpointing over new updates as the buffer fills more. This prevents buffer overflow while also slowing down update rate."}),"\n",(0,r.jsx)(t.p,{children:"In most cases, write throttling is caused by a slow drive, or a high update rate, and should not be a part of normal node operation."}),"\n",(0,r.jsx)(t.h2,{id:"storage-configuration",children:"Storage Configuration"}),"\n",(0,r.jsxs)(t.p,{children:["In Apache Ignite 3, all storage configuration is consolidated under the ",(0,r.jsx)(t.code,{children:"ignite.storage"})," node configuration. For more information on how storage is configured, see Storage Profiles and Engines documentation."]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/29562505.a45b3759.js b/docs/ignite3/assets/js/29562505.a45b3759.js deleted file mode 100644 index e319245f01..0000000000 --- a/docs/ignite3/assets/js/29562505.a45b3759.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9759],{13523:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"getting-started/migrate-from-3-0-to-3-1","title":"Migrating from Apache Ignite 3.0 to 3.1","description":"Overview","source":"@site/docs/getting-started/migrate-from-3-0-to-3-1.md","sourceDirName":"getting-started","slug":"/getting-started/migrate-from-3-0-to-3-1","permalink":"/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Migrating from Apache Ignite 3.0 to 3.1","sidebar_label":"Migrate from 3.0 to 3.1"},"sidebar":"tutorialSidebar","previous":{"title":"Migrating from Ignite 2","permalink":"/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2"},"next":{"title":"Develop","permalink":"/docs/ignite3/3.1.0/develop/"}}');var i=t(74848),s=t(28453);const a={title:"Migrating from Apache Ignite 3.0 to 3.1",sidebar_label:"Migrate from 3.0 to 3.1"},l=void 0,o={},c=[{value:"Overview",id:"overview",level:2},{value:"Zone-Based Replication",id:"zone-based-replication",level:2},{value:"Table-Based vs Zone-Based Replication",id:"table-based-vs-zone-based-replication",level:3},{value:"Benefits of Zone-Based Replication",id:"benefits-of-zone-based-replication",level:3},{value:"Phase 1: Document Current Environment",id:"phase-1-document-current-environment",level:2},{value:"Step 1.1: Connect to 3.0 Cluster",id:"step-11-connect-to-30-cluster",level:3},{value:"Step 1.2: Document All Schemas",id:"step-12-document-all-schemas",level:3},{value:"Step 1.3: Document All Tables",id:"step-13-document-all-tables",level:3},{value:"Step 1.4: Document Table Schemas",id:"step-14-document-table-schemas",level:3},{value:"Step 1.5: Document Distribution Zones",id:"step-15-document-distribution-zones",level:3},{value:"Step 1.6: Calculate Data Volume",id:"step-16-calculate-data-volume",level:3},{value:"Step 1.7: Create Schema Recreation Script",id:"step-17-create-schema-recreation-script",level:3},{value:"Phase 2: Export Data from 3.0 Cluster",id:"phase-2-export-data-from-30-cluster",level:2},{value:"Step 2.1: Create Export Directory",id:"step-21-create-export-directory",level:3},{value:"Step 2.2: Choose Export Format",id:"step-22-choose-export-format",level:3},{value:"Step 2.3: Export Table Data",id:"step-23-export-table-data",level:3},{value:"CSV Export",id:"csv-export",level:4},{value:"Parquet Export (Recommended)",id:"parquet-export-recommended",level:4},{value:"Step 2.4: Automate Exports with Script",id:"step-24-automate-exports-with-script",level:3},{value:"Step 2.5: Verify Exports",id:"step-25-verify-exports",level:3},{value:"Step 2.6: Stop 3.0 Cluster",id:"step-26-stop-30-cluster",level:3},{value:"Phase 3: Set Up 3.1 Cluster",id:"phase-3-set-up-31-cluster",level:2},{value:"Step 3.1: Download Apache Ignite 3.1",id:"step-31-download-apache-ignite-31",level:3},{value:"Step 3.2: Configure Cluster Nodes",id:"step-32-configure-cluster-nodes",level:3},{value:"Configuration Changes in 3.1",id:"configuration-changes-in-31",level:4},{value:"Step 3.3: Start Cluster Nodes",id:"step-33-start-cluster-nodes",level:3},{value:"Step 3.4: Initialize the Cluster",id:"step-34-initialize-the-cluster",level:3},{value:"Step 3.5: Verify Cluster Topology",id:"step-35-verify-cluster-topology",level:3},{value:"Step 3.6: Recreate Schemas",id:"step-36-recreate-schemas",level:3},{value:"Step 3.7: Recreate Distribution Zones",id:"step-37-recreate-distribution-zones",level:3},{value:"Step 3.8: Recreate Tables",id:"step-38-recreate-tables",level:3},{value:"Phase 4: Import Data into 3.1 Cluster",id:"phase-4-import-data-into-31-cluster",level:2},{value:"Step 4.1: Import Individual Tables",id:"step-41-import-individual-tables",level:3},{value:"CSV Import",id:"csv-import",level:4},{value:"Parquet Import (Recommended)",id:"parquet-import-recommended",level:4},{value:"Step 4.2: Automate Imports with Script",id:"step-42-automate-imports-with-script",level:3},{value:"Step 4.3: Verify Data Integrity",id:"step-43-verify-data-integrity",level:3},{value:"Row Count Verification",id:"row-count-verification",level:4},{value:"Data Sampling",id:"data-sampling",level:4},{value:"Create Verification Script",id:"create-verification-script",level:4},{value:"Phase 5: Update Client Applications",id:"phase-5-update-client-applications",level:2},{value:"Step 5.1: Update Connection Configuration",id:"step-51-update-connection-configuration",level:3},{value:"Step 5.2: Review API Changes",id:"step-52-review-api-changes",level:3},{value:"Java API Changes",id:"java-api-changes",level:4},{value:"Step 5.3: Test Client Connectivity",id:"step-53-test-client-connectivity",level:3},{value:"Phase 6: Post-Migration Verification",id:"phase-6-post-migration-verification",level:2},{value:"Step 6.1: Verify Zone-Based Replication",id:"step-61-verify-zone-based-replication",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(n.p,{children:"This guide provides step-by-step instructions for migrating Apache Ignite clusters from version 3.0 to version 3.1. Due to architectural changes in 3.1, including the introduction of zone-based replication, migration requires creating a new 3.1 cluster and migrating data using the export/import process."}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"This migration requires cluster downtime."})}),"\n",(0,i.jsx)(n.h2,{id:"zone-based-replication",children:"Zone-Based Replication"}),"\n",(0,i.jsx)(n.p,{children:"Apache Ignite 3.1 introduces zone-based replication, replacing the table-based replication model from version 3.0. Table-based replication is still supported, however it will be dropped in a later release."}),"\n",(0,i.jsx)(n.h3,{id:"table-based-vs-zone-based-replication",children:"Table-Based vs Zone-Based Replication"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Aspect"}),(0,i.jsx)(n.th,{children:"3.0 Table-Based"}),(0,i.jsx)(n.th,{children:"3.1 Zone-Based"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"RAFT Groups"}),(0,i.jsx)(n.td,{children:"Each table creates separate RAFT groups"}),(0,i.jsx)(n.td,{children:"Tables in same zone share RAFT groups"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Example (100 tables)"}),(0,i.jsx)(n.td,{children:"100 separate RAFT group sets"}),(0,i.jsx)(n.td,{children:"1 shared RAFT group set"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Memory Footprint"}),(0,i.jsx)(n.td,{children:"Higher with more tables"}),(0,i.jsx)(n.td,{children:"Significantly reduced"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Thread Overhead"}),(0,i.jsx)(n.td,{children:"Higher (more RAFT groups)"}),(0,i.jsx)(n.td,{children:"Lower (fewer RAFT groups)"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"benefits-of-zone-based-replication",children:"Benefits of Zone-Based Replication"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reduced Memory Footprint:"})," Fewer RAFT groups means lower memory consumption for clusters with many tables"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Lower Thread Overhead:"})," Decreased number of RAFT groups reduces thread management complexity"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Improved Performance:"})," Better resource utilization for multi-table workloads"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Transparent Migration:"})," No changes to user-facing APIs or query behavior"]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Zone-based replication is an internal cluster optimization. Your applications will continue to work without code changes."})}),"\n",(0,i.jsx)(n.h2,{id:"phase-1-document-current-environment",children:"Phase 1: Document Current Environment"}),"\n",(0,i.jsx)(n.h3,{id:"step-11-connect-to-30-cluster",children:"Step 1.1: Connect to 3.0 Cluster"}),"\n",(0,i.jsx)(n.p,{children:"Connect to your Apache Ignite 3.0 cluster using the CLI tool:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ignite3-cli-3.0.0/bin\r\n./ignite3\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once connected, enter sql execution mode:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sql\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-12-document-all-schemas",children:"Step 1.2: Document All Schemas"}),"\n",(0,i.jsx)(n.p,{children:"List all schemas in your cluster:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- List all schemas\r\nSELECT * FROM SYSTEM.SCHEMAS;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Save the output to a file for reference during schema recreation."}),"\n",(0,i.jsx)(n.h3,{id:"step-13-document-all-tables",children:"Step 1.3: Document All Tables"}),"\n",(0,i.jsx)(n.p,{children:"List all tables across all schemas:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- List all tables\r\nSELECT SCHEMA_NAME, TABLE_NAME\r\nFROM SYSTEM.TABLES\r\nWHERE TABLE_TYPE = 'TABLE'\r\nORDER BY SCHEMA_NAME, TABLE_NAME;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Save the output to a file for reference during table recreation."}),"\n",(0,i.jsx)(n.h3,{id:"step-14-document-table-schemas",children:"Step 1.4: Document Table Schemas"}),"\n",(0,i.jsx)(n.p,{children:"For each table, capture its complete schema definition:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Get detailed schema for each table\r\nSELECT\r\n SCHEMA_NAME,\r\n TABLE_NAME,\r\n COLUMN_NAME,\r\n TYPE,\r\n NULLABLE,\r\n COLUMN_DEFAULT\r\nFROM SYSTEM.TABLE_COLUMNS\r\nWHERE SCHEMA_NAME = 'YOUR_SCHEMA'\r\nORDER BY TABLE_NAME, ORDINAL_POSITION;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Save the output to a file for reference during schema recreation."}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"Document the exact CREATE TABLE statements for all tables. You'll need these to recreate the schema in 3.1."})}),"\n",(0,i.jsx)(n.h3,{id:"step-15-document-distribution-zones",children:"Step 1.5: Document Distribution Zones"}),"\n",(0,i.jsx)(n.p,{children:"Capture current distribution zone configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Document distribution zones\r\nSELECT * FROM SYSTEM.ZONES;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Save the output to a file for reference during schema recreation."}),"\n",(0,i.jsx)(n.h3,{id:"step-16-calculate-data-volume",children:"Step 1.6: Calculate Data Volume"}),"\n",(0,i.jsx)(n.p,{children:"Estimate the size of data to be migrated:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Get row count for each table\r\nSELECT\r\n TABLE_NAME,\r\n COUNT(*) as ROW_COUNT\r\nFROM your_table\r\nGROUP BY TABLE_NAME;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Save row counts for each table. You'll use these to verify data integrity after migration."}),"\n",(0,i.jsx)(n.h3,{id:"step-17-create-schema-recreation-script",children:"Step 1.7: Create Schema Recreation Script"}),"\n",(0,i.jsxs)(n.p,{children:["Create a SQL script file named ",(0,i.jsx)(n.code,{children:"schema-recreation.sql"})," containing all CREATE TABLE statements:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Example for a table:\r\nCREATE TABLE analytics.events (\r\n id INT PRIMARY KEY,\r\n event_time TIMESTAMP NOT NULL,\r\n user_id VARCHAR(100),\r\n event_type VARCHAR(50),\r\n payload VARCHAR(4000)\r\n) WITH (\r\n -- Document any table options here\r\n);\r\n\r\n-- Repeat for all tables\n"})}),"\n",(0,i.jsx)(n.p,{children:"Save the output to a file for reference during schema recreation."}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Ensure your CREATE TABLE statements include all constraints, indexes, and table options. Missing configuration can lead to performance or data integrity issues."})}),"\n",(0,i.jsx)(n.h2,{id:"phase-2-export-data-from-30-cluster",children:"Phase 2: Export Data from 3.0 Cluster"}),"\n",(0,i.jsx)(n.h3,{id:"step-21-create-export-directory",children:"Step 2.1: Create Export Directory"}),"\n",(0,i.jsx)(n.p,{children:"Create a directory for export files on accessible storage:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkdir -p /backup/ignite-3.0-export\r\nchmod 755 /backup/ignite-3.0-export\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"If using shared network storage, ensure all nodes have write access to this location."})}),"\n",(0,i.jsx)(n.h3,{id:"step-22-choose-export-format",children:"Step 2.2: Choose Export Format"}),"\n",(0,i.jsx)(n.p,{children:"Apache Ignite supports two export formats:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Format"}),(0,i.jsx)(n.th,{children:"Advantages"}),(0,i.jsx)(n.th,{children:"Best For"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"CSV"})}),(0,i.jsx)(n.td,{children:"Human-readable, easy to debug, compatible with many tools"}),(0,i.jsx)(n.td,{children:"Small to medium datasets, troubleshooting"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Parquet"})}),(0,i.jsx)(n.td,{children:"Compressed, faster I/O, efficient for large datasets"}),(0,i.jsx)(n.td,{children:"Large datasets, production migrations"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"step-23-export-table-data",children:"Step 2.3: Export Table Data"}),"\n",(0,i.jsxs)(n.p,{children:["Export each table using the ",(0,i.jsx)(n.code,{children:"COPY INTO"})," command."]}),"\n",(0,i.jsx)(n.h4,{id:"csv-export",children:"CSV Export"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Export with headers for easier import\r\nCOPY FROM (SELECT * FROM analytics.events)\r\nINTO '/backup/ignite-3.0-export/analytics_events.csv'\r\nFORMAT CSV\r\nWITH 'header'='true';\n"})}),"\n",(0,i.jsx)(n.p,{children:"For large tables, export in chunks:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Export in chunks by partition\r\nCOPY FROM (SELECT * FROM analytics.events WHERE id BETWEEN 0 AND 1000000)\r\nINTO '/backup/ignite-3.0-export/analytics_events_part1.csv'\r\nFORMAT CSV\r\nWITH 'header'='true';\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parquet-export-recommended",children:"Parquet Export (Recommended)"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COPY FROM analytics.events (id, event_time, user_id, event_type, payload)\r\nINTO '/backup/ignite-3.0-export/analytics_events.parquet'\r\nFORMAT PARQUET;\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-24-automate-exports-with-script",children:"Step 2.4: Automate Exports with Script"}),"\n",(0,i.jsx)(n.p,{children:"Create a shell script to export all tables automatically:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'#!/bin/bash\r\n# export-all-tables.sh\r\n\r\nBACKUP_DIR="/backup/ignite-3.0-export"\r\n\r\n# Array of tables to export (schema.table format)\r\nTABLES=(\r\n "analytics.events"\r\n "analytics.users"\r\n "sales.orders"\r\n "sales.products"\r\n)\r\n\r\nfor table in "${TABLES[@]}"; do\r\n schema=$(echo $table | cut -d\'.\' -f1)\r\n tbl=$(echo $table | cut -d\'.\' -f2)\r\n\r\n echo "Exporting ${table}..."\r\n\r\n ignite sql "COPY FROM (SELECT * FROM ${table}) \\\r\n INTO \'${BACKUP_DIR}/${schema}_${tbl}.parquet\' \\\r\n FORMAT PARQUET"\r\n\r\n if [ $? -eq 0 ]; then\r\n echo "${table} exported successfully"\r\n\r\n # Get row count for verification\r\n ignite sql "SELECT COUNT(*) as row_count FROM ${table}" > "${BACKUP_DIR}/${schema}_${tbl}.count"\r\n else\r\n echo "Failed to export ${table}"\r\n exit 1\r\n fi\r\ndone\r\n\r\necho "Export complete. Files in ${BACKUP_DIR}"\n'})}),"\n",(0,i.jsx)(n.p,{children:"Make the script executable and run it:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"chmod +x export-all-tables.sh\r\n./export-all-tables.sh\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-25-verify-exports",children:"Step 2.5: Verify Exports"}),"\n",(0,i.jsx)(n.p,{children:"Check that all export files were created successfully:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# List all export files\r\nls -lh /backup/ignite-3.0-export/\r\n\r\n# Verify file sizes are reasonable (not 0 bytes)\r\nfind /backup/ignite-3.0-export/ -size 0\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Do not proceed to the next phase until all exports are verified. Missing or corrupted export files will result in data loss."})}),"\n",(0,i.jsx)(n.h3,{id:"step-26-stop-30-cluster",children:"Step 2.6: Stop 3.0 Cluster"}),"\n",(0,i.jsx)(n.p,{children:"Once all exports are verified, gracefully stop all cluster nodes:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Stop all nodes gracefully\r\nignite node stop --node node1\r\nignite node stop --node node2\r\n...\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"After stopping the 3.0 cluster, do not delete any data until the migration is completely verified in the 3.1 cluster."})}),"\n",(0,i.jsx)(n.h2,{id:"phase-3-set-up-31-cluster",children:"Phase 3: Set Up 3.1 Cluster"}),"\n",(0,i.jsx)(n.h3,{id:"step-31-download-apache-ignite-31",children:"Step 3.1: Download Apache Ignite 3.1"}),"\n",(0,i.jsxs)(n.p,{children:["Download the Apache Ignite 3.1 distribution from the ",(0,i.jsx)(n.a,{href:"https://ignite.apache.org/download.cgi",children:"official website"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"step-32-configure-cluster-nodes",children:"Step 3.2: Configure Cluster Nodes"}),"\n",(0,i.jsx)(n.p,{children:"Update your configuration files from 3.0 to 3.1 format:"}),"\n",(0,i.jsx)(n.h4,{id:"configuration-changes-in-31",children:"Configuration Changes in 3.1"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Change Type"}),(0,i.jsx)(n.th,{children:"3.0 Format"}),(0,i.jsx)(n.th,{children:"3.1 Format"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Timeout Properties"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"timeout=5000"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"timeoutMillis=5000"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Zone Creation"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"CREATE ZONE myZone WITH STORAGE_PROFILES='default', REPLICAS=3;"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"CREATE ZONE myZone (REPLICAS 3) STORAGE PROFILES['default'];"})})]})]})]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"Review the Apache Ignite 3.1 documentation for a complete list of configuration changes."})}),"\n",(0,i.jsx)(n.h3,{id:"step-33-start-cluster-nodes",children:"Step 3.3: Start Cluster Nodes"}),"\n",(0,i.jsx)(n.p,{children:"Start each node in your cluster:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Start each node (repeat for all nodes)\r\n./bin/ignite3 node start --config ignite-config.conf\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["By default, nodes load the configuration from ",(0,i.jsx)(n.code,{children:"etc/ignite-config.conf"}),". You can specify a different configuration file with the ",(0,i.jsx)(n.code,{children:"--config"})," parameter."]})}),"\n",(0,i.jsx)(n.h3,{id:"step-34-initialize-the-cluster",children:"Step 3.4: Initialize the Cluster"}),"\n",(0,i.jsx)(n.p,{children:"Once all nodes are started, initialize the cluster from any node:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"ignite cluster init --name=ignite-cluster\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-35-verify-cluster-topology",children:"Step 3.5: Verify Cluster Topology"}),"\n",(0,i.jsx)(n.p,{children:"Confirm all nodes are part of the cluster:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"ignite cluster topology\n"})}),"\n",(0,i.jsx)(n.p,{children:"Expected output should show all nodes in ACTIVE state:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[name=node1, address=192.168.1.10:10800, state=ACTIVE]\r\n[name=node2, address=192.168.1.11:10800, state=ACTIVE]\r\n...\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-36-recreate-schemas",children:"Step 3.6: Recreate Schemas"}),"\n",(0,i.jsx)(n.p,{children:"Connect to the cluster and recreate all schemas:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Create schemas\r\nCREATE SCHEMA analytics;\r\nCREATE SCHEMA sales;\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-37-recreate-distribution-zones",children:"Step 3.7: Recreate Distribution Zones"}),"\n",(0,i.jsx)(n.p,{children:"If you have custom distribution zones, recreate them:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Create distribution zones (if customized)\r\nCREATE ZONE analytics_zone (REPLICAS 3) STORAGE PROFILES['default'];\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-38-recreate-tables",children:"Step 3.8: Recreate Tables"}),"\n",(0,i.jsx)(n.p,{children:"Execute your saved schema recreation script:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE analytics.events (\r\n id INT PRIMARY KEY,\r\n event_time TIMESTAMP NOT NULL,\r\n user_id VARCHAR(100),\r\n event_type VARCHAR(50),\r\n payload VARCHAR(4000)\r\n);\r\n\r\n-- Repeat for all tables\n"})}),"\n",(0,i.jsx)(n.p,{children:"Verify each table was created correctly:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Verify table creation\r\nSELECT * FROM SYSTEM.TABLES WHERE TABLE_NAME = 'EVENTS';\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"Ensure table schemas in 3.1 exactly match the schemas from 3.0. Mismatches will cause import failures."})}),"\n",(0,i.jsx)(n.h2,{id:"phase-4-import-data-into-31-cluster",children:"Phase 4: Import Data into 3.1 Cluster"}),"\n",(0,i.jsx)(n.h3,{id:"step-41-import-individual-tables",children:"Step 4.1: Import Individual Tables"}),"\n",(0,i.jsxs)(n.p,{children:["Import data for each table using the ",(0,i.jsx)(n.code,{children:"COPY FROM"})," command."]}),"\n",(0,i.jsx)(n.h4,{id:"csv-import",children:"CSV Import"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COPY FROM '/backup/ignite-3.0-export/analytics_events.csv'\r\nINTO analytics.events (id, event_time, user_id, event_type, payload)\r\nFORMAT CSV\r\nWITH 'header'='true', 'batchSize'='2048';\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parquet-import-recommended",children:"Parquet Import (Recommended)"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COPY FROM '/backup/ignite-3.0-export/analytics_events.parquet'\r\nINTO analytics.events (id, event_time, user_id, event_type, payload)\r\nFORMAT PARQUET\r\nWITH 'batchSize'='2048';\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-42-automate-imports-with-script",children:"Step 4.2: Automate Imports with Script"}),"\n",(0,i.jsx)(n.p,{children:"Create a shell script to import all tables:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'#!/bin/bash\r\n# import-all-tables.sh\r\n\r\nBACKUP_DIR="/backup/ignite-3.0-export"\r\n\r\n# Array of tables to import\r\nTABLES=(\r\n "analytics.events:id,event_time,user_id,event_type,payload"\r\n "analytics.users:user_id,username,email,created_at"\r\n "sales.orders:order_id,customer_id,order_date,total"\r\n "sales.products:product_id,name,price,stock"\r\n)\r\n\r\nfor entry in "${TABLES[@]}"; do\r\n table=$(echo $entry | cut -d\':\' -f1)\r\n columns=$(echo $entry | cut -d\':\' -f2)\r\n schema=$(echo $table | cut -d\'.\' -f1)\r\n tbl=$(echo $table | cut -d\'.\' -f2)\r\n\r\n echo "Importing ${table}..."\r\n\r\n ignite sql "COPY FROM \'${BACKUP_DIR}/${schema}_${tbl}.parquet\' \\\r\n INTO ${table} (${columns}) \\\r\n FORMAT PARQUET \\\r\n WITH \'batchSize\'=\'2048\'"\r\n\r\n if [ $? -eq 0 ]; then\r\n echo "${table} imported successfully"\r\n\r\n # Verify row count\r\n actual_count=$(ignite sql "SELECT COUNT(*) FROM ${table}" | grep -oE \'[0-9]+\')\r\n expected_count=$(cat "${BACKUP_DIR}/${schema}_${tbl}.count" | grep -oE \'[0-9]+\')\r\n\r\n if [ "$actual_count" == "$expected_count" ]; then\r\n echo "Row count verified: ${actual_count}"\r\n else\r\n echo "Row count mismatch: expected ${expected_count}, got ${actual_count}"\r\n exit 1\r\n fi\r\n else\r\n echo "Failed to import ${table}"\r\n exit 1\r\n fi\r\ndone\r\n\r\necho "Import complete."\n'})}),"\n",(0,i.jsx)(n.p,{children:"Make the script executable and run it:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"chmod +x import-all-tables.sh\r\n./import-all-tables.sh\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-43-verify-data-integrity",children:"Step 4.3: Verify Data Integrity"}),"\n",(0,i.jsx)(n.p,{children:"After imports complete, perform thorough verification:"}),"\n",(0,i.jsx)(n.h4,{id:"row-count-verification",children:"Row Count Verification"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Compare row counts\r\nSELECT COUNT(*) FROM analytics.events;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Compare with the saved row counts from your 3.0 cluster."}),"\n",(0,i.jsx)(n.h4,{id:"data-sampling",children:"Data Sampling"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- Spot check data\r\nSELECT * FROM analytics.events LIMIT 10;\r\n\r\n-- Verify no NULL values in NOT NULL columns\r\nSELECT COUNT(*) FROM analytics.events\r\nWHERE event_time IS NULL;\r\n\r\n-- Check date ranges are preserved\r\nSELECT MIN(event_time), MAX(event_time)\r\nFROM analytics.events;\n"})}),"\n",(0,i.jsx)(n.h4,{id:"create-verification-script",children:"Create Verification Script"}),"\n",(0,i.jsx)(n.p,{children:"Automate verification across all tables:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'#!/bin/bash\r\n# verify-migration.sh\r\n\r\necho "=== Migration Verification Report ==="\r\necho\r\n\r\nTABLES=(\r\n "analytics.events"\r\n "analytics.users"\r\n "sales.orders"\r\n "sales.products"\r\n)\r\n\r\nBACKUP_DIR="/backup/ignite-3.0-export"\r\n\r\nfor table in "${TABLES[@]}"; do\r\n schema=$(echo $table | cut -d\'.\' -f1)\r\n tbl=$(echo $table | cut -d\'.\' -f2)\r\n\r\n echo "Table: ${table}"\r\n\r\n # Get current count\r\n current=$(ignite sql "SELECT COUNT(*) FROM ${table}" | grep -oE \'[0-9]+\')\r\n echo " Current row count: ${current}"\r\n\r\n # Get expected count\r\n expected=$(cat "${BACKUP_DIR}/${schema}_${tbl}.count" | grep -oE \'[0-9]+\')\r\n echo " Expected row count: ${expected}"\r\n\r\n if [ "$current" == "$expected" ]; then\r\n echo " Status: PASS"\r\n else\r\n echo " Status: FAIL"\r\n fi\r\n echo\r\ndone\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Do not proceed with application cutover until all verification checks pass successfully."})}),"\n",(0,i.jsx)(n.h2,{id:"phase-5-update-client-applications",children:"Phase 5: Update Client Applications"}),"\n",(0,i.jsx)(n.h3,{id:"step-51-update-connection-configuration",children:"Step 5.1: Update Connection Configuration"}),"\n",(0,i.jsx)(n.p,{children:"Update application configuration to point to the 3.1 cluster:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-properties",children:"# Old 3.0 connection\r\nignite.endpoints=old-node1:10800,old-node2:10800,old-node3:10800\r\n\r\n# New 3.1 connection\r\nignite.endpoints=new-node1:10800,new-node2:10800,new-node3:10800\n"})}),"\n",(0,i.jsx)(n.h3,{id:"step-52-review-api-changes",children:"Step 5.2: Review API Changes"}),"\n",(0,i.jsx)(n.p,{children:"Check for deprecated APIs in your client code:"}),"\n",(0,i.jsx)(n.h4,{id:"java-api-changes",children:"Java API Changes"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"// Deprecated in 3.1\r\nignite.clusterNodes()\r\n\r\n// Replace with\r\nignite.cluster().nodes()\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Refer to the Apache Ignite 3.1 release notes for a complete list of API changes: ",(0,i.jsx)(n.a,{href:"https://ignite.apache.org/releases/3.1.0/release_notes.html",children:"https://ignite.apache.org/releases/3.1.0/release_notes.html"})]})}),"\n",(0,i.jsx)(n.h3,{id:"step-53-test-client-connectivity",children:"Step 5.3: Test Client Connectivity"}),"\n",(0,i.jsx)(n.p,{children:"Before switching production traffic, test connectivity:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'// Connection test\r\ntry (IgniteClient client = IgniteClient.builder()\r\n .addresses("new-node1:10800", "new-node2:10800", "new-node3:10800")\r\n .build()) {\r\n\r\n // Verify connectivity\r\n Collection nodes = client.cluster().nodes();\r\n System.out.println("Connected to " + nodes.size() + " nodes");\r\n\r\n // Test data access\r\n Table table = client.tables().table("analytics.events");\r\n RecordView view = table.recordView();\r\n\r\n Tuple record = view.get(null, Tuple.create().set("id", 1));\r\n System.out.println("Sample record retrieved: " + record);\r\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Once the connection is confirmed, gradually migrate traffic."}),"\n",(0,i.jsx)(n.h2,{id:"phase-6-post-migration-verification",children:"Phase 6: Post-Migration Verification"}),"\n",(0,i.jsx)(n.h3,{id:"step-61-verify-zone-based-replication",children:"Step 6.1: Verify Zone-Based Replication"}),"\n",(0,i.jsx)(n.p,{children:"Confirm zone-based replication is active by checking cluster startup logs:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'# Check node logs for confirmation\r\ngrep "Zone based replication" /path/to/node/logs/*.log\n'})}),"\n",(0,i.jsx)(n.p,{children:"Expected output:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Zone based replication: true\n"})}),"\n",(0,i.jsx)(n.p,{children:"Verify zones are properly configured:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT * FROM SYSTEM.ZONES;\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>l});var r=t(96540);const i={},s=r.createContext(i);function a(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/29e18771.68a34d71.js b/docs/ignite3/assets/js/29e18771.68a34d71.js deleted file mode 100644 index 5acc2283dc..0000000000 --- a/docs/ignite3/assets/js/29e18771.68a34d71.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4889],{28453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>l});var r=i(96540);const s={},o=r.createContext(s);function t(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),r.createElement(o.Provider,{value:n},e.children)}},81961:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"develop/connect-to-ignite/odbc","title":"ODBC Driver","description":"Overview","source":"@site/docs/develop/connect-to-ignite/odbc.md","sourceDirName":"develop/connect-to-ignite","slug":"/develop/connect-to-ignite/odbc","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"id":"odbc","title":"ODBC Driver","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"JDBC Driver","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc"},"next":{"title":"ODBC Connection String","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string"}}');var s=i(74848),o=i(28453);const t={id:"odbc",title:"ODBC Driver",sidebar_position:2},l=void 0,c={},d=[{value:"Overview",id:"overview",level:2},{value:"Installing ODBC Driver",id:"installing-odbc-driver",level:2},{value:"Installing on Windows",id:"installing-on-windows",level:3},{value:"Prerequisites",id:"prerequisites",level:4},{value:"Installation process",id:"installation-process",level:4},{value:"Configuring the Cluster",id:"configuring-the-cluster",level:3},{value:"Installing on Linux",id:"installing-on-linux",level:3},{value:"Prerequisites",id:"prerequisites-1",level:4},{value:"Download from website",id:"download-from-website",level:4},{value:"Supported Data Types",id:"supported-data-types",level:2},{value:"Using pyodbc",id:"using-pyodbc",level:2}];function a(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsxs)(n.p,{children:["Ignite 3 includes an ODBC driver that allows you both to select and to modify data stored in a distributed cache by using standard SQL queries and native ODBC API. ODBC driver uses your ",(0,s.jsx)(n.a,{href:"/3.1.0/develop/ignite-clients/",children:"client connection configuration"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"ODBC driver only provides thread-safety at the connections level. This means that you should not access the same connection from multiple threads without additional synchronization, though you can create separate connections for every thread and use them simultaneously."}),"\n",(0,s.jsxs)(n.p,{children:["The ODBC driver implements version 3.8 of the ODBC API. For detailed information on ODBC please refer to ",(0,s.jsx)(n.a,{href:"https://msdn.microsoft.com/en-us/library/ms714177.aspx",children:"ODBC Programmer's Reference"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"installing-odbc-driver",children:"Installing ODBC Driver"}),"\n",(0,s.jsx)(n.p,{children:"To use ODBC driver, register it in your system so that your ODBC Driver Manager will be able to locate it."}),"\n",(0,s.jsx)(n.h3,{id:"installing-on-windows",children:"Installing on Windows"}),"\n",(0,s.jsx)(n.h4,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsx)(n.p,{children:"Microsoft Visual C++ 2017 Redistributable Package should be installed first."}),"\n",(0,s.jsx)(n.h4,{id:"installation-process",children:"Installation process"}),"\n",(0,s.jsx)(n.p,{children:"Launch the provided installer and follow the instructions."}),"\n",(0,s.jsx)(n.h3,{id:"configuring-the-cluster",children:"Configuring the Cluster"}),"\n",(0,s.jsx)(n.p,{children:"ODBC driver uses the client connector to work with the cluster. Make sure to configure the port to the one you intend to use, for example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"node config update clientConnector.port=10469\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For more information on configuring client connector, see ",(0,s.jsx)(n.a,{href:"/3.1.0/develop/ignite-clients/",children:"Client Connector Configuration"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"installing-on-linux",children:"Installing on Linux"}),"\n",(0,s.jsxs)(n.p,{children:["To build and install ODBC driver on Linux, you need to first install ODBC Driver Manager. The ODBC driver has been tested with ",(0,s.jsx)(n.a,{href:"http://www.unixodbc.org",children:"UnixODBC"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"prerequisites-1",children:"Prerequisites"}),"\n",(0,s.jsx)(n.p,{children:"Install the following prerequisites first:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://gcc.gnu.org/onlinedocs/libstdc%2B%2B",children:"libstdc"})," library supporting C++14 standard"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"http://www.unixodbc.org",children:"UnixODBC"})," driver manager"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"download-from-website",children:"Download from website"}),"\n",(0,s.jsx)(n.p,{children:"You can get the built rpm or deb package from the provided website. Then, install the package locally to use it."}),"\n",(0,s.jsx)(n.h2,{id:"supported-data-types",children:"Supported Data Types"}),"\n",(0,s.jsx)(n.p,{children:"The following SQL data types are supported:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_CHAR"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_VARCHAR"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_LONGVARCHAR"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_SMALLINT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_INTEGER"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_FLOAT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_DOUBLE"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_BIT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_TINYINT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_BIGINT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_BINARY"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_VARBINARY"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_LONGVARBINARY"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_GUID"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_DECIMAL"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_TYPE_DATE"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_TYPE_TIMESTAMP"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_TYPE_TIME"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"using-pyodbc",children:"Using pyodbc"}),"\n",(0,s.jsxs)(n.p,{children:["Ignite can be used with ",(0,s.jsx)(n.a,{href:"https://pypi.org/project/pyodbc/",children:"pyodbc"}),". Here is how you can use pyodbc in Ignite 3:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Install pyodbc"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"pip3 install pyodbc\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Import pyodbc to your project:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"import pyodbc\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Connect to the database:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn = pyodbc.connect('Driver={Apache Ignite 3};Address=127.0.0.1:10800;')\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Set encoding to UTF-8:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'conn.setencoding(encoding=\'utf-8\')\r\nconn.setdecoding(sqltype=pyodbc.SQL_CHAR, encoding="utf-8")\r\nconn.setdecoding(sqltype=pyodbc.SQL_WCHAR, encoding="utf-8")\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Get data from your database:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"cursor = conn.cursor()\r\ncursor.execute('SELECT * FROM table_name')\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For more information on using pyodbc, use the ",(0,s.jsx)(n.a,{href:"https://github.com/mkleehammer/pyodbc/wiki",children:"official documentation"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/2abe8a17.6e8be02a.js b/docs/ignite3/assets/js/2abe8a17.6e8be02a.js deleted file mode 100644 index e83894e2af..0000000000 --- a/docs/ignite3/assets/js/2abe8a17.6e8be02a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1590],{11470:(e,n,r)=>{r.d(n,{A:()=>T});var a=r(96540),t=r(34164),l=r(17559),i=r(23104),s=r(56347),c=r(205),o=r(57485),u=r(31682),d=r(70679);function h(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:r}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:r,default:a}})=>({value:e,label:n,attributes:r,default:a}))}(r);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function b({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const r=(0,s.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,o.aZ)(t),(0,a.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(r.location.search);n.set(t,e),r.replace({...r.location,search:n.toString()})},[t,r])]}function v(e){const{defaultValue:n,queryString:r=!1,groupId:t}=e,l=p(e),[i,s]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!b({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l})),[o,u]=m({queryString:r,groupId:t}),[h,v]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,t]=(0,d.Dv)(n);return[r,(0,a.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),j=(()=>{const e=o??h;return b({value:e,tabValues:l})?e:null})();(0,c.A)(()=>{j&&s(j)},[j]);return{selectedValue:i,selectValue:(0,a.useCallback)(e=>{if(!b({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),v(e)},[u,v,l]),tabValues:l}}var j=r(92303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=r(74848);function y({className:e,block:n,selectedValue:r,selectValue:a,tabValues:l}){const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),o=e=>{const n=e.currentTarget,t=s.indexOf(n),i=l[t].value;i!==r&&(c(n),a(i))},u=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const r=s.indexOf(e.currentTarget)+1;n=s[r]??s[0];break}case"ArrowLeft":{const r=s.indexOf(e.currentTarget)-1;n=s[r]??s[s.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:a})=>(0,g.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{s.push(e)},onKeyDown:u,onClick:o,...a,className:(0,t.A)("tabs__item",x.tabItem,a?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function w({lazy:e,children:n,selectedValue:r}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===r);return e?(0,a.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function f(e){const n=v(e);return(0,g.jsxs)("div",{className:(0,t.A)(l.G.tabs.container,"tabs-container",x.tabList),children:[(0,g.jsx)(y,{...n,...e}),(0,g.jsx)(w,{...n,...e})]})}function T(e){const n=(0,j.A)();return(0,g.jsx)(f,{...e,children:h(e.children)},String(n))}},19365:(e,n,r)=>{r.d(n,{A:()=>i});r(96540);var a=r(34164);const t={tabItem:"tabItem_Ymn6"};var l=r(74848);function i({children:e,hidden:n,className:r}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,a.A)(t.tabItem,r),hidden:n,children:e})}},28453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>s});var a=r(96540);const t={},l=a.createContext(t);function i(e){const n=a.useContext(l);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),a.createElement(l.Provider,{value:n},e.children)}},72526:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>c,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"developers-guide/table-api","title":"Table API","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/table-api.md","sourceDirName":"developers-guide","slug":"/developers-guide/table-api","permalink":"/docs/ignite3/3.0.0/developers-guide/table-api","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Table API","sidebar_label":"Table API"},"sidebar":"tutorialSidebar","previous":{"title":"Ignite CLI Tool","permalink":"/docs/ignite3/3.0.0/ignite-cli-tool"},"next":{"title":"Table API","permalink":"/docs/ignite3/3.0.0/developers-guide/table-api"}}');var t=r(74848),l=r(28453),i=r(11470),s=r(19365);const c={title:"Table API",sidebar_label:"Table API"},o=void 0,u={},d=[{value:"Table Views in Apache Ignite",id:"table-views-in-apache-ignite",level:2},{value:"Tuple and Key-Value Views",id:"tuple-and-key-value-views",level:3},{value:"Record and Key-Value Views",id:"record-and-key-value-views",level:3},{value:"Data Type Support",id:"data-type-support",level:2},{value:"Time and Date Data Types",id:"time-and-date-data-types",level:3},{value:"Getting a Table Instance",id:"getting-a-table-instance",level:2},{value:"Qualified Table Name Object",id:"qualified-table-name-object",level:3},{value:"Basic Table Operations",id:"basic-table-operations",level:2},{value:"Tuple Record View",id:"tuple-record-view",level:3},{value:"Record View",id:"record-view",level:3},{value:"Key-Value Tuple View",id:"key-value-tuple-view",level:3},{value:"Key-Value View",id:"key-value-view",level:3},{value:"Criterion Queries",id:"criterion-queries",level:2},{value:"Asynchronous Queries",id:"asynchronous-queries",level:3},{value:"Comparison Expressions",id:"comparison-expressions",level:3},{value:"Comparison Operators",id:"comparison-operators",level:3}];function h(e){const n={code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:["\n","\n",(0,t.jsx)(n.p,{children:"To execute table operations on a specific table, you need to get a specific view of the table and use one of its methods. You can only create new tables by using SQL API."}),"\n",(0,t.jsx)(n.p,{children:"Apache Ignite supports mapping user objects to table tuples. This ensures that objects created in any programming language can be used for key-value operations directly."}),"\n",(0,t.jsx)(n.h2,{id:"table-views-in-apache-ignite",children:"Table Views in Apache Ignite"}),"\n",(0,t.jsx)(n.h3,{id:"tuple-and-key-value-views",children:"Tuple and Key-Value Views"}),"\n",(0,t.jsx)(n.p,{children:"When working with tables, Apache Ignite offers two approaches: directly handling the data or mapping the data to classes. The direct data handling approach handles data tuples. Alternatively, when mapping data to classes, the data is converted to and from these classes as needed for database interactions."}),"\n",(0,t.jsx)(n.h3,{id:"record-and-key-value-views",children:"Record and Key-Value Views"}),"\n",(0,t.jsxs)(n.p,{children:["When creating views, you can create a ",(0,t.jsx)(n.code,{children:"RecordView"})," or ",(0,t.jsx)(n.code,{children:"KeyValueView"}),". The primary difference between these view types is the API used."]}),"\n",(0,t.jsx)(n.p,{children:'In a RecordView, you create a single "record" that includes all the information about a row to be updated or retrieved from the table, and send this record to the server. This record should contain all the fields, including the primary key.'}),"\n",(0,t.jsx)(n.p,{children:"In a KeyValueView, you work with key-value mappings. Think of it as a dictionary where the key object contains the primary key field or fields, and the value object contains the data fields. This approach is useful when primary key is not directly related to the domain object thus you prefer not to add the primary key to it."}),"\n",(0,t.jsx)(n.h2,{id:"data-type-support",children:"Data Type Support"}),"\n",(0,t.jsx)(n.h3,{id:"time-and-date-data-types",children:"Time and Date Data Types"}),"\n",(0,t.jsx)(n.p,{children:"Only JavaTime API is supported for working with table views. The following data types are not supported:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.util.Date"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.sql.Date"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.sql.Time"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.sql.Timestamp"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Use the following data types instead:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.time.LocalDate"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.time.LocalTime"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.time.LocalDateTime"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.time.Instant"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"getting-a-table-instance",children:"Getting a Table Instance"}),"\n",(0,t.jsxs)(n.p,{children:["First, get an instance of the table. To obtain an instance of table, use the ",(0,t.jsx)(n.code,{children:"IgniteTables.table(String)"})," method. You can also use ",(0,t.jsx)(n.code,{children:"IgniteTables.tables()"})," method to list all existing tables."]}),"\n",(0,t.jsxs)(i.A,{groupId:"programming-languages",children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:"IgniteTables tableApi = client.tables();\r\nList
                                                              existingTables = tableApi.tables();\r\nTable firstTable = existingTables.get(0);\n"})})}),(0,t.jsx)(s.A,{value:"dotnet",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'var existingTables = await Client.Tables.GetTablesAsync();\r\nvar firstTable = existingTables[0];\r\n\r\nvar myTable = await Client.Tables.GetTableAsync("MY_TABLE");\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nauto table_api = client.get_tables();\r\nstd::vector
                                                              existing_tables = table_api.get_tables();\r\ntable first_table = existing_tables.front();\r\n\r\nstd::optional
                                                              my_table = table_api.get_table("MY_TABLE");\n'})})})]}),"\n",(0,t.jsxs)(n.p,{children:["By default, if the schema name is not specified, the ",(0,t.jsx)(n.code,{children:"PUBLIC"})," schema is used. If a qualified name is specified, the table is taken from the specified schema."]}),"\n",(0,t.jsx)(n.h3,{id:"qualified-table-name-object",children:"Qualified Table Name Object"}),"\n",(0,t.jsxs)(n.p,{children:["Instead of using a string to specify table name, you can create a ",(0,t.jsx)(n.code,{children:"QualifiedName"})," object to hold a fully qualified table name. Apache Ignite provides 2 methods for creating qualified names:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["You can parse the fully qualified table name with the ",(0,t.jsx)(n.code,{children:"parse"})," method:"]}),"\n"]}),"\n",(0,t.jsx)(i.A,{groupId:"programming-languages",children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'QualifiedName qualifiedTableName = QualifiedName.parse("PUBLIC.Person");\r\nTable myTable = tableApi.table(qualifiedTableName);\n'})})})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["You can provide schema name and table name separately with the ",(0,t.jsx)(n.code,{children:"of"})," method:"]}),"\n"]}),"\n",(0,t.jsx)(i.A,{groupId:"programming-languages",children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'QualifiedName qualifiedTableName = QualifiedName.of("PUBLIC", "MY_TABLE");\r\nTable myTable = tableApi.table(qualifiedTableName);\n'})})})}),"\n",(0,t.jsx)(n.p,{children:"The provided names must follow SQL syntax rules for identifiers:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:['Identifier must start from a character in the "Lu", "Ll", "Lt", "Lm", "Lo", or "Nl" Unicode categories or ',(0,t.jsx)(n.code,{children:"U+0331"})," (underscore);"]}),"\n",(0,t.jsxs)(n.li,{children:["Identifier characters (except for the first one) may be ",(0,t.jsx)(n.code,{children:"U+00B7"}),' (middle dot), or any character in the "Mn", "Mc", "Nd", "Pc", or "Cf" Unicode categories;']}),"\n",(0,t.jsxs)(n.li,{children:["Identifiers that contain any other characters must be quoted with ",(0,t.jsx)(n.code,{children:"U+2033"})," (double-quotes);"]}),"\n",(0,t.jsx)(n.li,{children:"Double-quote inside the identifier must be escaped with 2 double-quote characters."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Any unquoted names will be cast to upper case. In this case, ",(0,t.jsx)(n.code,{children:"Person"})," and ",(0,t.jsx)(n.code,{children:"PERSON"})," names are equivalent. To avoid this, add escaped quotes around the name. For example, ",(0,t.jsx)(n.code,{children:'\\"Person\\"'})," will be encoded as a case-sensitive ",(0,t.jsx)(n.code,{children:"Person"})," name. If the name contains the ",(0,t.jsx)(n.code,{children:"U+2033"})," (double quote) symbol, it must be escaped as ",(0,t.jsx)(n.code,{children:'""'})," (2 double quote symbols)."]}),"\n",(0,t.jsx)(n.p,{children:"For example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'// Case-insensitive table `MY_TABLE` in a case-insensitive `PUBLIC` schema.\r\nQualifiedName.parse("public.my_table"))\r\n\r\n// Case-sensitive table `my_table` in a case-sensitive `public` schema.\r\nQualifiedName.parse("\\"public\\".\\"my_table\\""))\r\n\r\n// Same as above, but with comma as separator that needs to be surrounded by quote characters.\r\nQualifiedName.of("\\"public\\"","\\"my_table\\""))\r\n\r\n// Case-sensitive name my"table.\r\nQualifiedName.parse("\\"my\\"\\"table\\""));\r\n\r\n// Case-sensitive table name `public.my_table` in a default schema.\r\nQualifiedName.parse("\\"public.my_table\\""));\n'})}),"\n",(0,t.jsx)(n.h2,{id:"basic-table-operations",children:"Basic Table Operations"}),"\n",(0,t.jsx)(n.p,{children:"Once you've got a table you need to get a specific view to choose how you want to operate table records."}),"\n",(0,t.jsx)(n.h3,{id:"tuple-record-view",children:"Tuple Record View"}),"\n",(0,t.jsx)(n.p,{children:"A tuple record view can be used to operate on table tuples directly. When retrieving data from tuple views, you can use a wide variety of methods to retrieve type-specific data stored in tuples. A full list of methods is available in the Tuple object javadoc."}),"\n",(0,t.jsxs)(i.A,{groupId:"programming-languages",children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'RecordView accounts = client.tables().table("accounts").recordView();\r\n\r\nSystem.out.println("\\nInserting a record into the \'accounts\' table...");\r\n\r\nTuple newAccountTuple = Tuple.create()\r\n .set("accountNumber", 123456)\r\n .set("firstName", "Val")\r\n .set("lastName", "Kulichenko")\r\n .set("balance", 100.00d);\r\n\r\naccounts.insert(null, newAccountTuple);\r\n\r\nSystem.out.println("\\nRetrieving a record using RecordView API...");\r\n\r\nTuple accountNumberTuple = Tuple.create().set("accountNumber", 123456);\r\n\r\nTuple accountTuple = accounts.get(null, accountNumberTuple);\r\n\r\nSystem.out.println(\r\n "\\nRetrieved record:\\n"\r\n + " Account Number: " + accountTuple.intValue("accountNumber") + \'\\n\'\r\n + " Owner: " + accountTuple.stringValue("firstName") + " " + accountTuple.stringValue("lastName") + \'\\n\'\r\n + " Balance: $" + accountTuple.doubleValue("balance"));\n'})})}),(0,t.jsx)(s.A,{value:"dotnet",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'IRecordView view = table.RecordBinaryView;\r\n\r\nIIgniteTuple fullRecord = new IgniteTuple\r\n{\r\n ["id"] = 42,\r\n ["name"] = "John Doe"\r\n};\r\n\r\nawait view.UpsertAsync(transaction: null, fullRecord);\r\n\r\nIIgniteTuple keyRecord = new IgniteTuple { ["id"] = 42 };\r\n(IIgniteTuple value, bool hasValue) = await view.GetAsync(transaction: null, keyRecord);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.FieldCount == 2);\r\nDebug.Assert(value["id"] as int? == 42);\r\nDebug.Assert(value["name"] as string == "John Doe");\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'record_view view = table.get_record_binary_view();\r\n\r\nignite_tuple record{\r\n {"id", 42},\r\n {"name", "John Doe"}\r\n};\r\n\r\nview.upsert(nullptr, record);\r\nstd::optional res_record = view.get(nullptr, {"id", 42});\r\n\r\nassert(res_record.has_value());\r\nassert(res_record->column_count() == 2);\r\nassert(res_record->get("id") == 42);\r\nassert(res_record->get("name") == "John Doe");\n'})})})]}),"\n",(0,t.jsx)(n.h3,{id:"record-view",children:"Record View"}),"\n",(0,t.jsx)(n.p,{children:"A record view maps to a user-defined type and enables table operations on user objects which are mapped to table tuples."}),"\n",(0,t.jsx)(n.p,{children:"Create the type converter:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:"static class CityIdConverter implements TypeConverter {\r\n\r\n @Override\r\n public String toObjectType(Integer columnValue) {\r\n return columnValue.toString();\r\n }\r\n\r\n @Override\r\n public Integer toColumnType(String cityId) {\r\n return Integer.parseInt(cityId);\r\n }\r\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Then build the mapper and get the ",(0,t.jsx)(n.code,{children:"RecordView"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'public static void main(String[] args) throws Exception {\r\n var mapper = Mapper.builder(Person.class)\r\n .automap()\r\n .map("cityId", "city_id", new CityIdConverter())\r\n .build();\r\n\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n ) {\r\n RecordView view = client.tables()\r\n .table("person")\r\n .recordView(mapper);\r\n\r\n\r\n Person myPerson = new Person(2, "2", "John Doe", 40, "Apache");\r\n\r\n view.upsert(null, myPerson);\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"Perform table operations on your custom objects mapped to table tuples:"}),"\n",(0,t.jsxs)(i.A,{groupId:"programming-languages",children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'RecordView accounts = client.tables()\r\n .table("accounts")\r\n .recordView(Account.class);\r\n\r\nSystem.out.println("\\nInserting a record into the \'accounts\' table...");\r\n\r\nAccount newAccount = new Account(\r\n 123456,\r\n "Val",\r\n "Kulichenko",\r\n 100.00d\r\n);\r\n\r\naccounts.insert(null, newAccount);\r\n\r\nSystem.out.println("\\nRetrieving a record using RecordView API...");\r\n\r\nAccount account = accounts.get(null, new Account(123456));\r\n\r\nSystem.out.println(\r\n "\\nRetrieved record:\\n"\r\n + " Account Number: " + account.accountNumber + \'\\n\'\r\n + " Owner: " + account.firstName + " " + account.lastName + \'\\n\'\r\n + " Balance: $" + account.balance);\n'})})}),(0,t.jsx)(s.A,{value:"dotnet",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'var pocoView = table.GetRecordView();\r\n\r\nawait pocoView.UpsertAsync(transaction: null, new Poco(42, "John Doe"));\r\nvar (value, hasValue) = await pocoView.GetAsync(transaction: null, new Poco(42));\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.Name == "John Doe");\r\n\r\npublic record Poco(long Id, string? Name = null);\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'record_view view = table.get_record_view();\r\n\r\nperson record(42, "John Doe");\r\n\r\nview.upsert(nullptr, record);\r\nstd::optional res_record = view.get(nullptr, person{42});\r\n\r\nassert(res.has_value());\r\nassert(res->id == 42);\r\nassert(res->name == "John Doe");\n'})})})]}),"\n",(0,t.jsx)(n.h3,{id:"key-value-tuple-view",children:"Key-Value Tuple View"}),"\n",(0,t.jsx)(n.p,{children:"A tuple key-value view. It can be used to operate table using key and value tuples separately. When retrieving data from tuple views, you can use a wide variety of methods to retrieve type-specific data stored in tuples. A full list of methods is available in the Tuple object javadoc."}),"\n",(0,t.jsxs)(i.A,{groupId:"programming-languages",children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'KeyValueView kvView = client.tables().table("accounts").keyValueView();\r\n\r\nSystem.out.println("\\nInserting a key-value pair into the \'accounts\' table...");\r\n\r\nTuple key = Tuple.create()\r\n .set("accountNumber", 123456);\r\n\r\nTuple value = Tuple.create()\r\n .set("firstName", "Val")\r\n .set("lastName", "Kulichenko")\r\n .set("balance", 100.00d);\r\n\r\nkvView.put(null, key, value);\r\n\r\nSystem.out.println("\\nRetrieving a value using KeyValueView API...");\r\n\r\nvalue = kvView.get(null, key);\r\n\r\nSystem.out.println(\r\n "\\nRetrieved value:\\n"\r\n + " Account Number: " + key.intValue("accountNumber") + \'\\n\'\r\n + " Owner: " + value.stringValue("firstName") + " " + value.stringValue("lastName") + \'\\n\'\r\n + " Balance: $" + value.doubleValue("balance"));\n'})})}),(0,t.jsx)(s.A,{value:"dotnet",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'IKeyValueView kvView = table.KeyValueBinaryView;\r\n\r\nIIgniteTuple key = new IgniteTuple { ["id"] = 42 };\r\nIIgniteTuple val = new IgniteTuple { ["name"] = "John Doe" };\r\n\r\nawait kvView.PutAsync(transaction: null, key, val);\r\n(IIgniteTuple? value, bool hasValue) = await kvView.GetAsync(transaction: null, key);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.FieldCount == 1);\r\nDebug.Assert(value["name"] as string == "John Doe");\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'key_value_view kv_view = table.get_key_value_binary_view();\r\n\r\nignite_tuple key_tuple{{"id", 42}};\r\nignite_tuple val_tuple{{"name", "John Doe"}};\r\n\r\nkv_view.put(nullptr, key_tuple, val_tuple);\r\nstd::optional res_tuple = kv_view.get(nullptr, key_tuple);\r\n\r\nassert(res_tuple.has_value());\r\nassert(res_tuple->column_count() == 2);\r\nassert(res_tuple->get("id") == 42);\r\nassert(res_tuple->get("name") == "John Doe");\n'})})})]}),"\n",(0,t.jsx)(n.h3,{id:"key-value-view",children:"Key-Value View"}),"\n",(0,t.jsx)(n.p,{children:"A key-value view with user objects. It can be used to operate table using key and value user objects mapped to table tuples."}),"\n",(0,t.jsxs)(i.A,{groupId:"programming-languages",children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'KeyValueView kvView = client.tables()\r\n .table("accounts")\r\n .keyValueView(AccountKey.class, Account.class);\r\nSystem.out.println("\\nInserting a key-value pair into the \'accounts\' table...");\r\n\r\nAccountKey key = new AccountKey(123456);\r\n\r\nAccount value = new Account(\r\n "Val",\r\n "Kulichenko",\r\n 100.00d\r\n);\r\n\r\nkvView.put(null, key, value);\r\n\r\nSystem.out.println("\\nRetrieving a value using KeyValueView API...");\r\n\r\nvalue = kvView.get(null, key);\r\n\r\n\r\nSystem.out.println(\r\n "\\nRetrieved value:\\n"\r\n + " Account Number: " + key.accountNumber + \'\\n\'\r\n + " Owner: " + value.firstName + " " + value.lastName + \'\\n\'\r\n + " Balance: $" + value.balance);\n'})})}),(0,t.jsx)(s.A,{value:"dotnet",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'IKeyValueView kvView = table.GetKeyValueView();\r\n\r\nawait kvView.PutAsync(transaction: null, 42, new Poco(Id: 0, Name: "John Doe"));\r\n(Poco? value, bool hasValue) = await kvView.GetAsync(transaction: null, 42);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.Name == "John Doe");\r\n\r\npublic record Poco(long Id, string? Name = null);\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'key_value_view kv_view = table.get_key_value_view();\r\n\r\nkv_view.put(nullptr, {42}, {"John Doe"});\r\nstd::optional res = kv_view.get(nullptr, {42});\r\n\r\nassert(res.has_value());\r\nassert(res->id == 42);\r\nassert(res->name == "John Doe");\n'})})})]}),"\n",(0,t.jsx)(n.h2,{id:"criterion-queries",children:"Criterion Queries"}),"\n",(0,t.jsx)(n.p,{children:"Apache Ignite provides the criterion queries that can be used to retrieve data from tables. Criterion queries work with any type of view, returning the appropriate data to the query specified."}),"\n",(0,t.jsx)(n.p,{children:"The example below shows how you can execute a query within an implicit transaction:"}),"\n",(0,t.jsx)(i.A,{groupId:"programming-languages",children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'try (Cursor> cursor = table.keyValueView().query(\r\n null, // Implicit transaction\r\n // Query criteria\r\n and(\r\n columnValue("name", equalTo("John Doe")),\r\n columnValue("age", greaterThan(20))\r\n )\r\n)) {\r\n // Process query results (keeping original cursor iteration pattern)\r\n // As an example, println all matched values.\r\n while (cursor.hasNext()) {\r\n printRecord(cursor.next());\r\n }\r\n}\n'})})})}),"\n",(0,t.jsxs)(n.p,{children:["The comparison query are specified by using the ",(0,t.jsx)(n.code,{children:"query()"})," method, and providing the comparison criteria in the ",(0,t.jsx)(n.code,{children:"columnValue"})," method."]}),"\n",(0,t.jsx)(n.p,{children:"You can also specify the specific transaction to execute the query in to perform the query in that specific transaction."}),"\n",(0,t.jsx)(i.A,{groupId:"programming-languages",children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'try (Cursor> cursor = table.keyValueView().query(\r\n transaction,\r\n // Query criteria\r\n and(\r\n columnValue("name", equalTo("John Doe")),\r\n columnValue("age", greaterThan(20))\r\n )\r\n)) {\r\n // Process query results\r\n // As an example, println all matched values.\r\n while (cursor.hasNext()) {\r\n printRecord(cursor.next());\r\n }\r\n\r\n // Commit transaction if all operations succeed\r\n transaction.commit();\r\n} catch (Exception e) {\r\n // Rollback transaction on error\r\n transaction.rollback();\r\n throw new RuntimeException("Transaction failed", e);\r\n}\n'})})})}),"\n",(0,t.jsx)(n.h3,{id:"asynchronous-queries",children:"Asynchronous Queries"}),"\n",(0,t.jsxs)(n.p,{children:["You can also perform the query asynchronously by using the ",(0,t.jsx)(n.code,{children:"queryAsync"})," method. This way the query is executed without blocking the thread. For example, you can execute the above query asynchronously:"]}),"\n",(0,t.jsx)(i.A,{groupId:"programming-languages",children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'public static void performQueryAsync(Table table) {\r\n System.out.println("[ Example 3 ] Performing asynchronous query");\r\n\r\n AsyncCursor> result = table.keyValueView().queryAsync(\r\n null, // Implicit transaction\r\n and(\r\n columnValue("name", equalTo("John Doe")),\r\n columnValue("age", greaterThan(20))\r\n )\r\n )\r\n .join();\r\n\r\n for (Entry tupleTupleEntry : result.currentPage()) {\r\n printRecord(tupleTupleEntry);\r\n }\r\n}\n'})})})}),"\n",(0,t.jsxs)(n.p,{children:["This operation uses the ",(0,t.jsx)(n.code,{children:"thenCompose()"})," method to handle the query results asynchronously in the user-defined ",(0,t.jsx)(n.code,{children:"fetchAllRowsInto()"})," method. Here is how this method may look like:"]}),"\n",(0,t.jsx)(n.h3,{id:"comparison-expressions",children:"Comparison Expressions"}),"\n",(0,t.jsx)(n.p,{children:"The following expressions are supported in criterion queries:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Expression"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Example"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"equalTo"})}),(0,t.jsx)(n.td,{children:"Checks if the object is equal to the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", equalTo("New York"))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"notEqualTo"})}),(0,t.jsx)(n.td,{children:"Checks if the object is not equal to the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", notEqualTo("New York"))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"greaterThan"})}),(0,t.jsx)(n.td,{children:"Checks if the object is greater than the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("Salary", greaterThan(10000))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"greaterThanOrEqualTo"})}),(0,t.jsx)(n.td,{children:"Checks if the object is greater than or equal to the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("Salary", greaterThanOrEqualTo(10000))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"lessThan"})}),(0,t.jsx)(n.td,{children:"Checks if the object is less than the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("Salary", lessThan(10000))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"lessThanOrEqualTo"})}),(0,t.jsx)(n.td,{children:"Checks if the object is less than or equal to the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("Salary", lessThanOrEqualTo(10000))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"nullValue"})}),(0,t.jsx)(n.td,{children:"Checks if the object is null."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", nullValue()'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"notNullValue"})}),(0,t.jsx)(n.td,{children:"Checks if the object is not null."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", notNullValue())'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"in"})}),(0,t.jsx)(n.td,{children:"Checks if the object is in the collection."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", in("New York", "Washington"))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"notIn"})}),(0,t.jsx)(n.td,{children:"Checks if the object is not in the collection."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", notIn("New York", "Washington"))'})})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"comparison-operators",children:"Comparison Operators"}),"\n",(0,t.jsx)(n.p,{children:"The following operators are supported in criterion queries:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Operator"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Example"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"not"})}),(0,t.jsx)(n.td,{children:"Negates the condition."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'not(columnValue("City", equalTo("New York")))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"and"})}),(0,t.jsx)(n.td,{children:"Used to evaluate multiple conditions at the same time."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'and(columnValue("City", equalTo("New York")), columnValue("Salary", greaterThan(10000)))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"or"})}),(0,t.jsx)(n.td,{children:"Used to evaluate for at least one matching condition."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'or(columnValue("City", equalTo("New York")), columnValue("Salary", greaterThan(10000)))'})})]})]})]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/2b2b4e7a.4b4e7b0e.js b/docs/ignite3/assets/js/2b2b4e7a.4b4e7b0e.js deleted file mode 100644 index c4195a43f5..0000000000 --- a/docs/ignite3/assets/js/2b2b4e7a.4b4e7b0e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6334],{11014:(n,e,a)=>{a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"develop/work-with-data/transactions","title":"Performing Transactions","description":"All queries in Apache Ignite are transactional. You can provide an explicit transaction as a first argument of any Table and SQL API call. If you do not provide an explicit transaction, an implicit one will be created for every call.","source":"@site/docs/develop/work-with-data/transactions.md","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/transactions","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/transactions","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"transactions","title":"Performing Transactions"},"sidebar":"tutorialSidebar","previous":{"title":"Table API","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/table-api"},"next":{"title":"Streaming Data","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/streaming"}}');var r=a(74848),c=a(28453),s=a(11470),i=a(19365);const o={id:"transactions",title:"Performing Transactions"},l=void 0,u={},d=[{value:"Transaction Lifecycle",id:"transaction-lifecycle",level:2},{value:"Transaction Isolation and Concurrency",id:"transaction-isolation-and-concurrency",level:2},{value:"Deadlock Prevention",id:"deadlock-prevention",level:3},{value:"Executing Transactions",id:"executing-transactions",level:2},{value:"Transaction Management",id:"transaction-management",level:2},{value:"Read-Only Transactions",id:"read-only-transactions",level:2},{value:"Transaction Timeout",id:"transaction-timeout",level:2}];function h(n){const e={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,c.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.p,{children:"All queries in Apache Ignite are transactional. You can provide an explicit transaction as a first argument of any Table and SQL API call. If you do not provide an explicit transaction, an implicit one will be created for every call."}),"\n",(0,r.jsx)(e.h2,{id:"transaction-lifecycle",children:"Transaction Lifecycle"}),"\n",(0,r.jsxs)(e.p,{children:["When the transaction is created, the node that the transaction was started from is chosen as ",(0,r.jsx)(e.strong,{children:"transaction coordinator"}),". The coordinator finds the required ",(0,r.jsx)(e.a,{href:"/3.1.0/understand/core-concepts/data-partitioning",children:"partitions"})," and sends the read or write requests to the nodes holding primary partitions. For correct transaction operation, all nodes in cluster must have similar time, that can be different by no more than ",(0,r.jsx)(e.code,{children:"schemaSync.maxClockSkewMillis"}),"."]}),"\n",(0,r.jsxs)(e.p,{children:["If the key is not locked by a different transaction, the node gets the locks on the involved keys, and attempts to apply the changes in the transaction. When the operation finishes, the lock is removed. This way, several transactions can work on the same partition, while changing separate keys. Additionally, some operations may perform ",(0,r.jsx)(e.strong,{children:"short-term"})," locks on the keys in advance, to ensure operations proceed correctly."]}),"\n",(0,r.jsxs)(e.p,{children:["If the node with the primary replica of a partition involved in the transaction fails, the transaction is eventually automatically rolled back. Apache Ignite will return ",(0,r.jsx)(e.code,{children:"TransactionException"})," on commit attempt."]}),"\n",(0,r.jsx)(e.h2,{id:"transaction-isolation-and-concurrency",children:"Transaction Isolation and Concurrency"}),"\n",(0,r.jsxs)(e.p,{children:["All read-write transactions in Apache Ignite acquire locks during the first read or write access, and hold the lock until the transaction is committed or rolled back. All read-write transactions are ",(0,r.jsx)(e.code,{children:"SERIALIZABLE"}),", so as long as the lock persists, no other transaction can make changes to locked data, however data can still be read by ",(0,r.jsx)(e.a,{href:"#read-only-transactions",children:"Read-Only Transactions"}),"."]}),"\n",(0,r.jsx)(e.h3,{id:"deadlock-prevention",children:"Deadlock Prevention"}),"\n",(0,r.jsxs)(e.p,{children:["Apache Ignite uses the ",(0,r.jsx)(e.code,{children:"WAIT_DIE"})," deadlock prevention algorithm. When a newer transaction requests data that is already locked by a different transaction, it is cancelled and the transaction operation is retried with the same timestamp. If the transaction is older, it is not cancelled and is allowed to wait for the lock to be freed."]}),"\n",(0,r.jsx)(e.h2,{id:"executing-transactions",children:"Executing Transactions"}),"\n",(0,r.jsx)(e.p,{children:"Here is how you can provide a transaction explicitly:"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"KeyValueView accounts =\r\n table.keyValueView(Mapper.of(Long.class), Mapper.of(Account.class));\r\n\r\naccounts.put(null, 42, new Account(16_000));\r\n\r\nvar tx = client.transactions().begin();\r\n\r\nAccount account = accounts.get(tx, 42);\r\naccount.balance += 500;\r\naccounts.put(tx, 42, account);\r\n\r\nassert accounts.get(tx, 42).balance == 16_500;\r\n\r\ntx.rollback();\r\n\r\nassert accounts.get(tx, 42).balance == 16_000;\n"})})}),(0,r.jsx)(i.A,{value:"net",label:".NET",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:"var accounts = table.GetKeyValueView();\r\nawait accounts.PutAsync(transaction: null, 42, new Account(16_000));\r\n\r\nawait using ITransaction tx = await client.Transactions.BeginAsync();\r\n\r\n(Account account, bool hasValue) = await accounts.GetAsync(tx, 42);\r\naccount = account with { Balance = account.Balance + 500 };\r\n\r\nawait accounts.PutAsync(tx, 42, account);\r\n\r\nDebug.Assert((await accounts.GetAsync(tx, 42)).Value.Balance == 16_500);\r\n\r\nawait tx.RollbackAsync();\r\n\r\nDebug.Assert((await accounts.GetAsync(null, 42)).Value.Balance == 16_000);\r\n\r\npublic record Account(decimal Balance);\n"})})}),(0,r.jsx)(i.A,{value:"cpp",label:"C++",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-cpp",children:"auto accounts = table.get_key_value_view();\r\n\r\naccount init_value(42, 16'000);\r\naccounts.put(nullptr, {42}, init_value);\r\n\r\nauto tx = client.get_transactions().begin();\r\n\r\nstd::optional res_account = accounts.get(&tx, {42});\r\nres_account->balance += 500;\r\naccounts.put(&tx, {42}, res_account);\r\n\r\nassert(accounts.get(&tx, {42})->balance == 16'500);\r\n\r\ntx.rollback();\r\n\r\nassert(accounts.get(&tx, {42})->balance == 16'000);\n"})})})]}),"\n",(0,r.jsx)(e.h2,{id:"transaction-management",children:"Transaction Management"}),"\n",(0,r.jsxs)(e.p,{children:["You can also manage transactions by using the ",(0,r.jsx)(e.code,{children:"runInTransaction"})," method. When using it, the following will be done automatically:"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"The transaction is started and substituted to the closure."}),"\n",(0,r.jsx)(e.li,{children:"The transaction is committed if no exceptions were thrown during the closure."}),"\n",(0,r.jsx)(e.li,{children:"The transaction will be retried in case of recoverable error. Closure must be purely functional, not causing side effects."}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"You can run transactions both synchronously and asynchronously."}),"\n",(0,r.jsx)(e.p,{children:"This example shows how to update an account's balance synchronously:"}),"\n",(0,r.jsx)(s.A,{children:(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"client.transactions().runInTransaction(tx -> {\r\n Account acct = accounts.get(tx, key);\r\n if (acct != null) {\r\n acct.balance += 200.0d;\r\n }\r\n accounts.put(tx, key, acct);\r\n});\r\n\n"})})})}),"\n",(0,r.jsx)(e.p,{children:"And this example performs the same logic in an asynchronous manner:"}),"\n",(0,r.jsx)(s.A,{children:(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"CompletableFuture future = client.transactions().runInTransactionAsync(tx ->\r\n accounts.getAsync(tx, key)\r\n .thenCompose(acct -> {\r\n acct.balance += 300.0d;\r\n return accounts.putAsync(tx, key, acct);\r\n })\r\n);\r\nfuture.join();\n"})})})}),"\n",(0,r.jsx)(e.h2,{id:"read-only-transactions",children:"Read-Only Transactions"}),"\n",(0,r.jsxs)(e.p,{children:["When starting a transaction, you can configure the transaction as a ",(0,r.jsx)(e.strong,{children:"read-only"})," transaction. In these transactions, no data modification can be performed, but they also do not secure locks and can be performed on non-primary ",(0,r.jsx)(e.a,{href:"/3.1.0/understand/core-concepts/data-partitioning",children:"partitions"}),", further improving their performance. Read-only transactions always check the data for the moment they were started, even if new data was written to the database."]}),"\n",(0,r.jsx)(e.p,{children:"Here is how you can make a read-only transaction:"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"var tx = client.transactions().begin(new TransactionOptions().readOnly(true));\r\nint balance = accounts.get(tx, 42).balance;\r\ntx.commit();\n"})})}),(0,r.jsx)(i.A,{value:"net",label:".NET",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:"await using var tx = await client.Transactions.BeginAsync(\r\n new TransactionOptions { ReadOnly = true });\r\nvar account = await accounts.GetAsync(tx, 42);\r\nint balance = account.Value.Balance;\r\nawait tx.CommitAsync();\n"})})}),(0,r.jsx)(i.A,{value:"cpp",label:"C++",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-cpp",children:"auto tx_opts = transaction_options()\r\n .set_read_only(true);\r\n\r\nauto tx = m_client.get_transactions().begin(tx_opts);\r\n\r\nrecord_view.get(&tx, 42);\r\n\r\ntx.commit();\n"})})})]}),"\n",(0,r.jsx)(e.admonition,{type:"note",children:(0,r.jsxs)(e.p,{children:["Read-only transactions read data at a specific time. If new data was written since, old data will still be stored in ",(0,r.jsx)(e.a,{href:"/3.1.0/understand/core-concepts/data-partitioning#version-storage",children:"Version Storage"})," and will be available until low watermark. If low watermark is reached during the transaction, data will be kept available until it is over."]})}),"\n",(0,r.jsx)(e.h2,{id:"transaction-timeout",children:"Transaction Timeout"}),"\n",(0,r.jsx)(e.p,{children:"In certain scenarios, it is preferable to drop the transaction if it is taking too long. When the timeout is reached, the transaction is automatically rolled back."}),"\n",(0,r.jsx)(e.p,{children:"Here is how you can configure transaction timeout:"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"KeyValueView accounts =\r\n table.keyValueView(Mapper.of(Long.class), Mapper.of(Account.class));\r\n\r\nvar tx = client.transactions().begin(new TransactionOptions().timeoutMillis(10000));\r\naccounts.put(tx, 42, account);\r\ntx.commit();\n"})})}),(0,r.jsx)(i.A,{value:"net",label:".NET",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:"await using var tx = await Client.Transactions.BeginAsync(\r\n new TransactionOptions { TimeoutMillis = 10_000 });\r\nawait accounts.PutAsync(tx, 42, account);\r\nawait tx.CommitAsync();\n"})})}),(0,r.jsx)(i.A,{value:"cpp",label:"C++",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-cpp",children:"auto accounts = table.get_key_value_view();\r\n\r\nauto tx_opts = transaction_options()\r\n .set_timeout_millis(10000);\r\n\r\nauto tx = m_client.get_transactions().begin(tx_opts);\r\n\r\nrecord_view.insert(&tx, 42);\r\n\r\ntx.commit();\n"})})})]})]})}function p(n={}){const{wrapper:e}={...(0,c.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(h,{...n})}):h(n)}},11470:(n,e,a)=>{a.d(e,{A:()=>A});var t=a(96540),r=a(34164),c=a(17559),s=a(23104),i=a(56347),o=a(205),l=a(57485),u=a(31682),d=a(70679);function h(n){return t.Children.toArray(n).filter(n=>"\n"!==n).map(n=>{if(!n||(0,t.isValidElement)(n)&&function(n){const{props:e}=n;return!!e&&"object"==typeof e&&"value"in e}(n))return n;throw new Error(`Docusaurus error: Bad child <${"string"==typeof n.type?n.type:n.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(n){const{values:e,children:a}=n;return(0,t.useMemo)(()=>{const n=e??function(n){return h(n).map(({props:{value:n,label:e,attributes:a,default:t}})=>({value:n,label:e,attributes:a,default:t}))}(a);return function(n){const e=(0,u.XI)(n,(n,e)=>n.value===e.value);if(e.length>0)throw new Error(`Docusaurus error: Duplicate values "${e.map(n=>n.value).join(", ")}" found in . Every value needs to be unique.`)}(n),n},[e,a])}function m({value:n,tabValues:e}){return e.some(e=>e.value===n)}function x({queryString:n=!1,groupId:e}){const a=(0,i.W6)(),r=function({queryString:n=!1,groupId:e}){if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!e)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return e??null}({queryString:n,groupId:e});return[(0,l.aZ)(r),(0,t.useCallback)(n=>{if(!r)return;const e=new URLSearchParams(a.location.search);e.set(r,n),a.replace({...a.location,search:e.toString()})},[r,a])]}function g(n){const{defaultValue:e,queryString:a=!1,groupId:r}=n,c=p(n),[s,i]=(0,t.useState)(()=>function({defaultValue:n,tabValues:e}){if(0===e.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:e}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${e.map(n=>n.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=e.find(n=>n.default)??e[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:e,tabValues:c})),[l,u]=x({queryString:a,groupId:r}),[h,g]=function({groupId:n}){const e=function(n){return n?`docusaurus.tab.${n}`:null}(n),[a,r]=(0,d.Dv)(e);return[a,(0,t.useCallback)(n=>{e&&r.set(n)},[e,r])]}({groupId:r}),b=(()=>{const n=l??h;return m({value:n,tabValues:c})?n:null})();(0,o.A)(()=>{b&&i(b)},[b]);return{selectedValue:s,selectValue:(0,t.useCallback)(n=>{if(!m({value:n,tabValues:c}))throw new Error(`Can't select invalid tab value=${n}`);i(n),u(n),g(n)},[u,g,c]),tabValues:c}}var b=a(92303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=a(74848);function y({className:n,block:e,selectedValue:a,selectValue:t,tabValues:c}){const i=[],{blockElementScrollPositionUntilNextRender:o}=(0,s.a_)(),l=n=>{const e=n.currentTarget,r=i.indexOf(e),s=c[r].value;s!==a&&(o(e),t(s))},u=n=>{let e=null;switch(n.key){case"Enter":l(n);break;case"ArrowRight":{const a=i.indexOf(n.currentTarget)+1;e=i[a]??i[0];break}case"ArrowLeft":{const a=i.indexOf(n.currentTarget)-1;e=i[a]??i[i.length-1];break}}e?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":e},n),children:c.map(({value:n,label:e,attributes:t})=>(0,f.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:n=>{i.push(n)},onKeyDown:u,onClick:l,...t,className:(0,r.A)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":a===n}),children:e??n},n))})}function w({lazy:n,children:e,selectedValue:a}){const c=(Array.isArray(e)?e:[e]).filter(Boolean);if(n){const n=c.find(n=>n.props.value===a);return n?(0,t.cloneElement)(n,{className:(0,r.A)("margin-top--md",n.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:c.map((n,e)=>(0,t.cloneElement)(n,{key:e,hidden:n.props.value!==a}))})}function j(n){const e=g(n);return(0,f.jsxs)("div",{className:(0,r.A)(c.G.tabs.container,"tabs-container",v.tabList),children:[(0,f.jsx)(y,{...e,...n}),(0,f.jsx)(w,{...e,...n})]})}function A(n){const e=(0,b.A)();return(0,f.jsx)(j,{...n,children:h(n.children)},String(e))}},19365:(n,e,a)=>{a.d(e,{A:()=>s});a(96540);var t=a(34164);const r={tabItem:"tabItem_Ymn6"};var c=a(74848);function s({children:n,hidden:e,className:a}){return(0,c.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,a),hidden:e,children:n})}},28453:(n,e,a)=>{a.d(e,{R:()=>s,x:()=>i});var t=a(96540);const r={},c=t.createContext(r);function s(n){const e=t.useContext(c);return t.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function i(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:s(n.components),t.createElement(c.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/2c69403e.cb893cf4.js b/docs/ignite3/assets/js/2c69403e.cb893cf4.js deleted file mode 100644 index 48aa79a4da..0000000000 --- a/docs/ignite3/assets/js/2c69403e.cb893cf4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3309],{11470:(e,r,n)=>{n.d(r,{A:()=>S});var t=n(96540),s=n(34164),a=n(17559),i=n(23104),l=n(56347),o=n(205),c=n(57485),d=n(31682),u=n(70679);function h(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:r}=e;return!!r&&"object"==typeof r&&"value"in r}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:r,children:n}=e;return(0,t.useMemo)(()=>{const e=r??function(e){return h(e).map(({props:{value:e,label:r,attributes:n,default:t}})=>({value:e,label:r,attributes:n,default:t}))}(n);return function(e){const r=(0,d.XI)(e,(e,r)=>e.value===r.value);if(r.length>0)throw new Error(`Docusaurus error: Duplicate values "${r.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[r,n])}function m({value:e,tabValues:r}){return r.some(r=>r.value===e)}function b({queryString:e=!1,groupId:r}){const n=(0,l.W6)(),s=function({queryString:e=!1,groupId:r}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:e,groupId:r});return[(0,c.aZ)(s),(0,t.useCallback)(e=>{if(!s)return;const r=new URLSearchParams(n.location.search);r.set(s,e),n.replace({...n.location,search:r.toString()})},[s,n])]}function g(e){const{defaultValue:r,queryString:n=!1,groupId:s}=e,a=p(e),[i,l]=(0,t.useState)(()=>function({defaultValue:e,tabValues:r}){if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${r.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=r.find(e=>e.default)??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:r,tabValues:a})),[c,d]=b({queryString:n,groupId:s}),[h,g]=function({groupId:e}){const r=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,s]=(0,u.Dv)(r);return[n,(0,t.useCallback)(e=>{r&&s.set(e)},[r,s])]}({groupId:s}),x=(()=>{const e=c??h;return m({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{x&&l(x)},[x]);return{selectedValue:i,selectValue:(0,t.useCallback)(e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)},[d,g,a]),tabValues:a}}var x=n(92303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=n(74848);function j({className:e,block:r,selectedValue:n,selectValue:t,tabValues:a}){const l=[],{blockElementScrollPositionUntilNextRender:o}=(0,i.a_)(),c=e=>{const r=e.currentTarget,s=l.indexOf(r),i=a[s].value;i!==n&&(o(r),t(i))},d=e=>{let r=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;r=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;r=l[n]??l[l.length-1];break}}r?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":r},e),children:a.map(({value:e,label:r,attributes:t})=>(0,v.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...t,className:(0,s.A)("tabs__item",f.tabItem,t?.className,{"tabs__item--active":n===e}),children:r??e},e))})}function w({lazy:e,children:r,selectedValue:n}){const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===n);return e?(0,t.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,r)=>(0,t.cloneElement)(e,{key:r,hidden:e.props.value!==n}))})}function y(e){const r=g(e);return(0,v.jsxs)("div",{className:(0,s.A)(a.G.tabs.container,"tabs-container",f.tabList),children:[(0,v.jsx)(j,{...r,...e}),(0,v.jsx)(w,{...r,...e})]})}function S(e){const r=(0,x.A)();return(0,v.jsx)(y,{...e,children:h(e.children)},String(r))}},19365:(e,r,n)=>{n.d(r,{A:()=>i});n(96540);var t=n(34164);const s={tabItem:"tabItem_Ymn6"};var a=n(74848);function i({children:e,hidden:r,className:n}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,n),hidden:r,children:e})}},28453:(e,r,n)=>{n.d(r,{R:()=>i,x:()=>l});var t=n(96540);const s={},a=t.createContext(s);function i(e){const r=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(a.Provider,{value:r},e.children)}},82776:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>o,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"develop/work-with-data/streaming","title":"Streaming Data","description":"Apache Ignite participates in streaming architectures as both a data consumer and data source. The Data Streamer API accepts entries from any Java Flow publisher, partitions them by key, and delivers batches to cluster nodes for processing. You can stream data into tables, use receivers to transform and route data across multiple tables, or return computed results to downstream systems.","source":"@site/docs/develop/work-with-data/streaming.md","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/streaming","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/streaming","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"streaming","title":"Streaming Data"},"sidebar":"tutorialSidebar","previous":{"title":"Performing Transactions","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/transactions"},"next":{"title":"Distributed Computing","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/compute"}}');var s=n(74848),a=n(28453),i=n(11470),l=n(19365);const o={id:"streaming",title:"Streaming Data"},c=void 0,d={},u=[{value:"Using Data Streamer API",id:"using-data-streamer-api",level:2},{value:"Configuring Data Streamer",id:"configuring-data-streamer",level:3},{value:"Memory and Throughput Considerations",id:"memory-and-throughput-considerations",level:4},{value:"Streaming Data",id:"streaming-data",level:3},{value:"High-Volume Streaming",id:"high-volume-streaming",level:2},{value:"Understanding Backpressure",id:"understanding-backpressure",level:3},{value:"Choosing a Publisher Approach",id:"choosing-a-publisher-approach",level:3},{value:"Flow API Handshake",id:"flow-api-handshake",level:3},{value:"Demand-Driven Publisher",id:"demand-driven-publisher",level:3},{value:"Configuration Tuning",id:"configuration-tuning",level:3},{value:"Streaming Results Out",id:"streaming-results-out",level:2},{value:"Understanding Receivers",id:"understanding-receivers",level:3},{value:"Enrichment Example",id:"enrichment-example",level:3},{value:"Step 1: Create an Enrichment Receiver",id:"step-1-create-an-enrichment-receiver",level:4},{value:"Step 2: Create a Forwarding Subscriber",id:"step-2-create-a-forwarding-subscriber",level:4},{value:"Step 3: Wire the Pipeline",id:"step-3-wire-the-pipeline",level:4},{value:"Managing Result Flow",id:"managing-result-flow",level:3},{value:"Handling Failures",id:"handling-failures",level:2},{value:"Handling Persistent Failures",id:"handling-persistent-failures",level:3},{value:"Tuning Flush Behavior",id:"tuning-flush-behavior",level:2}];function h(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.p,{children:"Apache Ignite participates in streaming architectures as both a data consumer and data source. The Data Streamer API accepts entries from any Java Flow publisher, partitions them by key, and delivers batches to cluster nodes for processing. You can stream data into tables, use receivers to transform and route data across multiple tables, or return computed results to downstream systems."}),"\n",(0,s.jsx)(r.mermaid,{value:'flowchart LR\r\n subgraph Sources["Data Sources"]\r\n S1[Message Queues]\r\n S2[Batch Files]\r\n S3[Applications]\r\n S1 ~~~ S2 ~~~ S3\r\n end\r\n\r\n subgraph Pipeline["Streaming Pipeline"]\r\n PUB[Flow.Publisher] --\x3e STREAMER[Data Streamer]\r\n STREAMER --\x3e BUF[(Partition
                                                              Buffers)]\r\n end\r\n\r\n subgraph Ignite["Apache Ignite"]\r\n N1[Node 1]\r\n N2[Node 2]\r\n N3[Node N]\r\n N1 ~~~ N2 ~~~ N3\r\n end\r\n\r\n subgraph Targets["Data Targets"]\r\n T1[Tables]\r\n T2[Receivers]\r\n T3[Result Subscribers]\r\n T1 ~~~ T2 ~~~ T3\r\n end\r\n\r\n Sources --\x3e PUB\r\n BUF --\x3e Ignite\r\n Ignite --\x3e Targets'}),"\n",(0,s.jsx)(r.p,{children:"Data streaming provides at-least-once delivery guarantee. Under normal operation, each item is delivered exactly once. If a batch fails and is retried, some items in that batch may be delivered again. Design your data model to handle potential duplicates, either through idempotent operations (upsert) or by using primary keys that allow safe re-insertion."}),"\n",(0,s.jsx)(r.h2,{id:"using-data-streamer-api",children:"Using Data Streamer API"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.a,{href:"../../api-reference/native-clients/java/data-streamer-api",children:"Data Streamer API"})," uses the Java Flow API (",(0,s.jsx)(r.code,{children:"java.util.concurrent.Flow"}),") publisher-subscriber model. You create a publisher that streams data entries to a table view, and the streamer distributes these entries across the cluster. The ",(0,s.jsx)(r.code,{children:"DataStreamerOptions"})," object configures batch sizes, parallelism, auto-flush intervals, and retry limits."]}),"\n",(0,s.jsx)(r.h3,{id:"configuring-data-streamer",children:"Configuring Data Streamer"}),"\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.code,{children:"DataStreamerOptions"})," controls how data flows into your cluster:"]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"java",label:"Java",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-java",children:"DataStreamerOptions options = DataStreamerOptions.builder()\r\n .pageSize(1000)\r\n .perPartitionParallelOperations(1)\r\n .autoFlushInterval(5000)\r\n .retryLimit(16)\r\n .build();\n"})})}),(0,s.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-csharp",children:"var options = new DataStreamerOptions\r\n{\r\n PageSize = 1000,\r\n RetryLimit = 16,\r\n AutoFlushInterval = TimeSpan.FromSeconds(5)\r\n};\n"})})})]}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Option"}),(0,s.jsx)(r.th,{children:"Default"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"pageSize"})}),(0,s.jsx)(r.td,{children:"1000"}),(0,s.jsx)(r.td,{children:"Number of entries per batch sent to the cluster."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"perPartitionParallelOperations"})}),(0,s.jsx)(r.td,{children:"1"}),(0,s.jsx)(r.td,{children:"Concurrent batches allowed per partition."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"autoFlushInterval"})}),(0,s.jsx)(r.td,{children:"5000 ms"}),(0,s.jsx)(r.td,{children:"Time before incomplete buffers are flushed."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"retryLimit"})}),(0,s.jsx)(r.td,{children:"16"}),(0,s.jsx)(r.td,{children:"Maximum retry attempts for failed submissions."})]})]})]}),"\n",(0,s.jsx)(r.h4,{id:"memory-and-throughput-considerations",children:"Memory and Throughput Considerations"}),"\n",(0,s.jsx)(r.p,{children:"The streamer allocates buffers based on these settings. Client memory usage per partition:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-text",children:"memoryPerPartition = pageSize \xd7 perPartitionParallelOperations \xd7 avgRecordSize\n"})}),"\n",(0,s.jsx)(r.p,{children:"For a table with 25 partitions and 1KB average record size:"}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Configuration"}),(0,s.jsx)(r.th,{children:"Page Size"}),(0,s.jsx)(r.th,{children:"Parallel Ops"}),(0,s.jsx)(r.th,{children:"Memory"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Default"}),(0,s.jsx)(r.td,{children:"1,000"}),(0,s.jsx)(r.td,{children:"1"}),(0,s.jsx)(r.td,{children:"~25 MB"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"High throughput"}),(0,s.jsx)(r.td,{children:"500"}),(0,s.jsx)(r.td,{children:"8"}),(0,s.jsx)(r.td,{children:"~100 MB"})]})]})]}),"\n",(0,s.jsx)(r.p,{children:"Smaller page sizes with higher parallelism create more frequent, smaller batches. This produces smoother I/O patterns that align with cluster checkpoint and replication cycles."}),"\n",(0,s.jsx)(r.h3,{id:"streaming-data",children:"Streaming Data"}),"\n",(0,s.jsxs)(r.p,{children:["Each entry must be wrapped in a ",(0,s.jsx)(r.code,{children:"DataStreamerItem"})," before streaming:"]}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.code,{children:"DataStreamerItem.of(entry)"})," performs an upsert: inserts the entry if the key does not exist, or updates it if the key already exists."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.code,{children:"DataStreamerItem.removed(entry)"})," deletes the entry by key. The entry object only needs to contain the primary key fields."]}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["The example below uses ",(0,s.jsx)(r.code,{children:"SubmissionPublisher"})," to stream account records:"]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"java",label:"Java",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-java",children:'public class DataStreamerExample {\r\n private static final int ACCOUNTS_COUNT = 1000;\r\n\r\n public static void main(String[] args) throws Exception {\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()) {\r\n RecordView view = client.tables().table("accounts").recordView(Account.class);\r\n\r\n streamAccountDataPut(view);\r\n streamAccountDataRemove(view);\r\n }\r\n }\r\n\r\n private static void streamAccountDataPut(RecordView view) {\r\n DataStreamerOptions options = DataStreamerOptions.builder()\r\n .pageSize(1000)\r\n .perPartitionParallelOperations(1)\r\n .autoFlushInterval(5000)\r\n .retryLimit(16)\r\n .build();\r\n\r\n CompletableFuture streamerFut;\r\n try (var publisher = new SubmissionPublisher>()) {\r\n streamerFut = view.streamData(publisher, options);\r\n ThreadLocalRandom rnd = ThreadLocalRandom.current();\r\n for (int i = 0; i < ACCOUNTS_COUNT; i++) {\r\n Account entry = new Account(i, "name" + i, rnd.nextLong(100_000), rnd.nextBoolean());\r\n publisher.submit(DataStreamerItem.of(entry));\r\n }\r\n }\r\n streamerFut.join();\r\n }\r\n\r\n private static void streamAccountDataRemove(RecordView view) {\r\n DataStreamerOptions options = DataStreamerOptions.builder()\r\n .pageSize(1000)\r\n .perPartitionParallelOperations(1)\r\n .autoFlushInterval(5000)\r\n .retryLimit(16)\r\n .build();\r\n\r\n CompletableFuture streamerFut;\r\n try (var publisher = new SubmissionPublisher>()) {\r\n streamerFut = view.streamData(publisher, options);\r\n for (int i = 0; i < ACCOUNTS_COUNT; i++) {\r\n Account entry = new Account(i);\r\n publisher.submit(DataStreamerItem.removed(entry));\r\n }\r\n }\r\n streamerFut.join();\r\n }\r\n}\n'})})}),(0,s.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-csharp",children:'using Apache.Ignite;\r\nusing Apache.Ignite.Table;\r\n\r\nusing var client = await IgniteClient.StartAsync(new("localhost"));\r\nITable? table = await client.Tables.GetTableAsync("accounts");\r\nIRecordView view = table!.GetRecordView();\r\n\r\nvar options = new DataStreamerOptions\r\n{\r\n PageSize = 10_000,\r\n AutoFlushInterval = TimeSpan.FromSeconds(1),\r\n RetryLimit = 32\r\n};\r\n\r\nawait view.StreamDataAsync(GetAccountsToAdd(5_000), options);\r\nawait view.StreamDataAsync(GetAccountsToRemove(1_000), options);\r\n\r\nasync IAsyncEnumerable> GetAccountsToAdd(int count)\r\n{\r\n for (int i = 0; i < count; i++)\r\n {\r\n yield return DataStreamerItem.Create(\r\n new Account(i, $"Account {i}"));\r\n }\r\n}\r\n\r\nasync IAsyncEnumerable> GetAccountsToRemove(int count)\r\n{\r\n for (int i = 0; i < count; i++)\r\n {\r\n yield return DataStreamerItem.Create(\r\n new Account(i, string.Empty), DataStreamerOperationType.Remove);\r\n }\r\n}\r\n\r\npublic record Account(int Id, string Name);\n'})})})]}),"\n",(0,s.jsx)(r.h2,{id:"high-volume-streaming",children:"High-Volume Streaming"}),"\n",(0,s.jsx)(r.p,{children:"The basic examples above work well for moderate data volumes. When streaming millions of records, the rate at which your application produces data typically exceeds the rate at which the cluster can persist it. This section covers flow control mechanisms that keep memory bounded and cluster load stable."}),"\n",(0,s.jsx)(r.h3,{id:"understanding-backpressure",children:"Understanding Backpressure"}),"\n",(0,s.jsx)(r.p,{children:"Backpressure is a flow control mechanism that allows a slower consumer to signal a faster producer to slow down. Without backpressure, a fast producer overwhelms a slow consumer, causing unbounded memory growth, increased latency, or dropped data."}),"\n",(0,s.jsx)(r.p,{children:"In data streaming, three components operate at different speeds:"}),"\n",(0,s.jsx)(r.mermaid,{value:'flowchart LR\r\n subgraph Producer["Data Producer"]\r\n GEN["Record Generation
                                                              (CPU-bound)"]\r\n end\r\n\r\n subgraph Network["Network Layer"]\r\n BUF["Partition Buffers
                                                              (Memory-bound)"]\r\n end\r\n\r\n subgraph Storage["Cluster Storage"]\r\n DISK["Disk Writes + Replication
                                                              (I/O-bound)"]\r\n end\r\n\r\n GEN --\x3e|"Fast"| BUF\r\n BUF --\x3e|"Varies"| DISK'}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Record generation"})," runs at CPU speed, potentially millions of records per second"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Network transmission"})," depends on bandwidth and batch size"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Cluster storage"})," involves disk writes, replication, and consensus protocols"]}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["The Java Flow API provides backpressure through a request-based model. The consumer (data streamer) tells the producer (your publisher) exactly how many items it can accept by calling ",(0,s.jsx)(r.code,{children:"subscription.request(n)"}),". The producer should deliver at most ",(0,s.jsx)(r.code,{children:"n"})," items, then wait for the next request. This creates a pull-based flow where the slowest component controls the overall rate."]}),"\n",(0,s.jsxs)(r.p,{children:["When the streamer's partition buffers fill, it stops calling ",(0,s.jsx)(r.code,{children:"request(n)"}),". A well-behaved publisher pauses generation until the next request arrives. This keeps memory bounded and prevents the producer from overwhelming downstream components."]}),"\n",(0,s.jsx)(r.h3,{id:"choosing-a-publisher-approach",children:"Choosing a Publisher Approach"}),"\n",(0,s.jsx)(r.p,{children:"How your publisher responds to backpressure signals determines memory usage and cluster load patterns. Two common approaches exist:"}),"\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"SubmissionPublisher"})," (shown in the basic example above) provides a ready-made implementation with an internal buffer (default 256 items). Records go into this buffer via ",(0,s.jsx)(r.code,{children:"submit()"}),", and the streamer pulls from it. When the buffer fills, ",(0,s.jsx)(r.code,{children:"submit()"})," blocks until space becomes available. This provides backpressure through blocking, which works well when your data source can tolerate pauses."]}),"\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Demand-driven publishers"})," generate records only when the streamer requests them via ",(0,s.jsx)(r.code,{children:"request(n)"}),". Instead of blocking on a full buffer, generation simply pauses when demand is zero and resumes when new requests arrive. This approach requires implementing ",(0,s.jsx)(r.code,{children:"Flow.Publisher"})," and ",(0,s.jsx)(r.code,{children:"Flow.Subscription"}),", but gives precise control over when data is created."]}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Consideration"}),(0,s.jsx)(r.th,{children:"SubmissionPublisher"}),(0,s.jsx)(r.th,{children:"Demand-Driven Publisher"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Backpressure response"}),(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.code,{children:"submit()"})," blocks when buffer full"]}),(0,s.jsx)(r.td,{children:"Generation pauses when demand is zero"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Memory profile"}),(0,s.jsx)(r.td,{children:"Publisher buffer + partition buffers"}),(0,s.jsx)(r.td,{children:"Partition buffers only"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Implementation effort"}),(0,s.jsx)(r.td,{children:"Minimal (JDK provided)"}),(0,s.jsx)(r.td,{children:"Custom implementation required"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Use case"}),(0,s.jsx)(r.td,{children:"Existing data sources, moderate volumes"}),(0,s.jsx)(r.td,{children:"Synthetic data, large volumes, controlled generation"})]})]})]}),"\n",(0,s.jsxs)(r.p,{children:["For streaming from existing collections or external data sources, ",(0,s.jsx)(r.code,{children:"SubmissionPublisher"})," offers simplicity. For generating or transforming millions of records, a demand-driven publisher provides predictable memory usage by creating data only when the cluster is ready to accept it."]}),"\n",(0,s.jsx)(r.h3,{id:"flow-api-handshake",children:"Flow API Handshake"}),"\n",(0,s.jsx)(r.p,{children:"The streaming lifecycle follows this sequence:"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.code,{children:"view.streamData(publisher, options)"})," initiates streaming"]}),"\n",(0,s.jsxs)(r.li,{children:["The streamer calls ",(0,s.jsx)(r.code,{children:"publisher.subscribe(subscriber)"})]}),"\n",(0,s.jsxs)(r.li,{children:["Your publisher calls ",(0,s.jsx)(r.code,{children:"subscriber.onSubscribe(subscription)"})]}),"\n",(0,s.jsxs)(r.li,{children:["The streamer calls ",(0,s.jsx)(r.code,{children:"subscription.request(n)"})," when ready for items"]}),"\n",(0,s.jsxs)(r.li,{children:["Your publisher generates ",(0,s.jsx)(r.code,{children:"n"})," items and calls ",(0,s.jsx)(r.code,{children:"subscriber.onNext(item)"})," for each"]}),"\n",(0,s.jsxs)(r.li,{children:["Steps 4-5 repeat until your publisher calls ",(0,s.jsx)(r.code,{children:"subscriber.onComplete()"})]}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"The streamer calculates how many items to request:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-text",children:"desiredInFlight = Math.max(1, buffers.size()) \xd7 pageSize \xd7 perPartitionParallelOperations\r\ntoRequest = desiredInFlight - inFlight - pending\n"})}),"\n",(0,s.jsxs)(r.p,{children:["When ",(0,s.jsx)(r.code,{children:"toRequest"})," is zero or negative, the streamer applies backpressure by not requesting more items."]}),"\n",(0,s.jsx)(r.h3,{id:"demand-driven-publisher",children:"Demand-Driven Publisher"}),"\n",(0,s.jsx)(r.p,{children:"A demand-driven publisher inverts the control flow. Instead of pushing records into a buffer and waiting for space, the publisher waits for the streamer to request records and generates them on demand. This requires implementing two interfaces:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:(0,s.jsx)(r.code,{children:"Flow.Publisher"})}),": The outer class that accepts a subscriber and creates a subscription"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:(0,s.jsx)(r.code,{children:"Flow.Subscription"})}),": The inner class that tracks demand and delivers items"]}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["The subscription maintains an ",(0,s.jsx)(r.code,{children:"AtomicLong"})," counter for outstanding demand. When the streamer calls ",(0,s.jsx)(r.code,{children:"request(n)"}),", the subscription increments the counter and begins delivery. Each ",(0,s.jsx)(r.code,{children:"onNext()"})," call decrements the counter. When demand reaches zero, the publisher pauses until the next ",(0,s.jsx)(r.code,{children:"request(n)"})," call."]}),"\n",(0,s.jsx)(r.mermaid,{value:"sequenceDiagram\r\n participant Pub as DemandDrivenPublisher\r\n participant Sub as Subscription\r\n participant Str as StreamerSubscriber\r\n participant Buf as Partition Buffers\r\n participant Cluster as Ignite Cluster\r\n\r\n Pub->>Str: subscribe(subscriber)\r\n Str->>Sub: onSubscribe(subscription)\r\n\r\n loop Until onComplete()\r\n Str->>Sub: request(n)\r\n Note over Sub: demand.addAndGet(n)\r\n\r\n loop While demand > 0\r\n Sub->>Sub: generateItem()\r\n Sub->>Str: onNext(item)\r\n Note over Sub: demand.decrementAndGet()\r\n end\r\n\r\n Str->>Buf: buffer by partition\r\n\r\n alt Buffer reaches pageSize\r\n Buf->>Cluster: send batch\r\n Cluster--\x3e>Str: batch complete\r\n end\r\n end\r\n\r\n Sub->>Str: onComplete()"}),"\n",(0,s.jsx)(r.p,{children:"The following implementation demonstrates this pattern:"}),"\n",(0,s.jsx)(i.A,{children:(0,s.jsx)(l.A,{value:"java",label:"Java",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-java",children:'public class DemandDrivenPublisher implements Flow.Publisher> {\r\n\r\n private final long totalRecords;\r\n private final AtomicBoolean subscribed = new AtomicBoolean(false);\r\n\r\n public DemandDrivenPublisher(long totalRecords) {\r\n this.totalRecords = totalRecords;\r\n }\r\n\r\n @Override\r\n public void subscribe(Flow.Subscriber> subscriber) {\r\n // Flow.Publisher allows only one subscriber\r\n if (subscribed.compareAndSet(false, true)) {\r\n subscriber.onSubscribe(new DemandDrivenSubscription(subscriber));\r\n } else {\r\n subscriber.onError(new IllegalStateException("Publisher already has a subscriber"));\r\n }\r\n }\r\n\r\n private class DemandDrivenSubscription implements Flow.Subscription {\r\n private final Flow.Subscriber> subscriber;\r\n private final AtomicLong demand = new AtomicLong(0);\r\n private final AtomicLong generated = new AtomicLong(0);\r\n private final AtomicBoolean cancelled = new AtomicBoolean(false);\r\n\r\n DemandDrivenSubscription(Flow.Subscriber> subscriber) {\r\n this.subscriber = subscriber;\r\n }\r\n\r\n @Override\r\n public void request(long n) {\r\n if (n <= 0 || cancelled.get()) {\r\n return;\r\n }\r\n // Accumulate demand from streamer\r\n demand.addAndGet(n);\r\n deliverItems();\r\n }\r\n\r\n @Override\r\n public void cancel() {\r\n cancelled.set(true);\r\n }\r\n\r\n private void deliverItems() {\r\n // Generate items only while demand exists\r\n while (demand.get() > 0 && !cancelled.get()) {\r\n long index = generated.get();\r\n\r\n if (index >= totalRecords) {\r\n // Signal completion when all records are generated\r\n subscriber.onComplete();\r\n return;\r\n }\r\n\r\n // Generate record on-demand (replace with your data source)\r\n Tuple tuple = Tuple.create()\r\n .set("id", index)\r\n .set("data", "Record " + index);\r\n\r\n subscriber.onNext(DataStreamerItem.of(tuple));\r\n generated.incrementAndGet();\r\n demand.decrementAndGet();\r\n }\r\n // Loop exits when demand reaches zero; publisher pauses until next request(n)\r\n }\r\n }\r\n}\n'})})})}),"\n",(0,s.jsxs)(r.p,{children:["Use the publisher with ",(0,s.jsx)(r.code,{children:"streamData"}),":"]}),"\n",(0,s.jsx)(i.A,{children:(0,s.jsx)(l.A,{value:"java",label:"Java",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-java",children:'RecordView view = client.tables().table("records").recordView();\r\n\r\nDataStreamerOptions options = DataStreamerOptions.builder()\r\n .pageSize(500)\r\n .perPartitionParallelOperations(8)\r\n .autoFlushInterval(1000)\r\n .build();\r\n\r\nDemandDrivenPublisher publisher = new DemandDrivenPublisher(20_000_000);\r\nCompletableFuture streamFuture = view.streamData(publisher, options);\r\nstreamFuture.join();\n'})})})}),"\n",(0,s.jsx)(r.h3,{id:"configuration-tuning",children:"Configuration Tuning"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.code,{children:"pageSize"})," and ",(0,s.jsx)(r.code,{children:"perPartitionParallelOperations"})," settings control batch size and concurrency. Their interaction affects throughput and cluster load:"]}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Configuration"}),(0,s.jsx)(r.th,{children:"Behavior"}),(0,s.jsx)(r.th,{children:"Tradeoff"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:["Large ",(0,s.jsx)(r.code,{children:"pageSize"}),", low parallelism (e.g., 1000 \xd7 1)"]}),(0,s.jsx)(r.td,{children:"Fewer, larger batches"}),(0,s.jsx)(r.td,{children:"Lower network overhead, but uneven I/O"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:["Small ",(0,s.jsx)(r.code,{children:"pageSize"}),", high parallelism (e.g., 500 \xd7 8)"]}),(0,s.jsx)(r.td,{children:"More frequent, smaller batches"}),(0,s.jsx)(r.td,{children:"Higher network overhead, but steadier I/O"})]})]})]}),"\n",(0,s.jsx)(r.p,{children:"Cluster nodes periodically flush data to disk and synchronize replicas. Batch size and timing can affect how streaming interacts with these operations. Monitor your cluster's performance metrics and adjust settings based on observed behavior."}),"\n",(0,s.jsx)(r.h2,{id:"streaming-results-out",children:"Streaming Results Out"}),"\n",(0,s.jsx)(r.p,{children:"The previous sections covered streaming data into Ignite tables. To stream data through Ignite and forward results to downstream systems, use receivers with result subscribers. A receiver processes incoming batches on cluster nodes and returns results that flow back to your application for delivery to the next pipeline stage."}),"\n",(0,s.jsxs)(r.p,{children:["Receivers execute on cluster nodes, not on the client. The receiver class must be deployed to all cluster nodes before streaming begins. See ",(0,s.jsx)(r.a,{href:"./code-deployment",children:"Code Deployment"})," for deployment options."]}),"\n",(0,s.jsxs)(r.p,{children:["Result delivery differs from input streaming: the streamer does not respect backpressure signals from ",(0,s.jsx)(r.code,{children:"subscription.request(n)"})," on the result subscriber. Results arrive as fast as the cluster produces them, regardless of how many items your subscriber requests. Your subscriber must handle results without blocking or buffer them internally when downstream systems are slower than the cluster."]}),"\n",(0,s.jsx)(r.mermaid,{value:'flowchart LR\r\n subgraph Client["Client Application"]\r\n PUB[Flow.Publisher]\r\n SUB[Result Subscriber]\r\n end\r\n\r\n subgraph Ignite["Ignite Cluster"]\r\n RCV[Receiver]\r\n end\r\n\r\n subgraph Downstream["Downstream"]\r\n DS[Message Queue
                                                              HTTP API
                                                              Database]\r\n end\r\n\r\n PUB --\x3e|"Data In"| RCV\r\n RCV --\x3e|"Results Out"| SUB\r\n SUB --\x3e|"Forward"| DS'}),"\n",(0,s.jsx)(r.h3,{id:"understanding-receivers",children:"Understanding Receivers"}),"\n",(0,s.jsxs)(r.p,{children:["A receiver implements ",(0,s.jsx)(r.code,{children:"DataStreamerReceiver"})," with three type parameters:"]}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"T"})," (payload type): The data type sent to cluster nodes for processing"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"A"})," (argument type): Optional parameters passed to every receiver invocation"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"R"})," (result type): The data type returned from cluster nodes to your subscriber"]}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["The receiver's ",(0,s.jsx)(r.code,{children:"receive()"})," method executes on cluster nodes, not on your client. Each invocation receives a batch of items that share the same partition, enabling data-local operations. The method returns a ",(0,s.jsx)(r.code,{children:"CompletableFuture>"})," containing results for each processed item, or ",(0,s.jsx)(r.code,{children:"null"})," if no results are needed."]}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.code,{children:"DataStreamerReceiverContext"})," parameter provides access to the Ignite API within the receiver. Use ",(0,s.jsx)(r.code,{children:"ctx.ignite()"})," to access tables, execute SQL, or perform other cluster operations during processing."]}),"\n",(0,s.jsx)(r.h3,{id:"enrichment-example",children:"Enrichment Example"}),"\n",(0,s.jsx)(r.p,{children:"The following example demonstrates data flowing through Ignite. Account events enter the stream, receive processing metadata on cluster nodes, and continue to a downstream system. This complements the account streaming example from the previous section."}),"\n",(0,s.jsx)(r.h4,{id:"step-1-create-an-enrichment-receiver",children:"Step 1: Create an Enrichment Receiver"}),"\n",(0,s.jsx)(r.p,{children:"The receiver transforms each incoming record by adding processing metadata. This pattern applies to any enrichment scenario: adding timestamps, looking up related data, validating against cluster state, or computing derived fields."}),"\n",(0,s.jsxs)(r.p,{children:["The receiver class must be deployed to all cluster nodes before streaming begins. When the streamer sends a batch to a node, that node instantiates the receiver class and calls its ",(0,s.jsx)(r.code,{children:"receive()"})," method."]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"java",label:"Java",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-java",children:'public class EnrichmentReceiver implements DataStreamerReceiver {\r\n @Override\r\n public CompletableFuture> receive(\r\n List page,\r\n DataStreamerReceiverContext ctx,\r\n Void arg) {\r\n\r\n String nodeName = ctx.ignite().name();\r\n Instant processedAt = Instant.now();\r\n\r\n List enriched = new ArrayList<>(page.size());\r\n\r\n for (Tuple item : page) {\r\n Tuple result = Tuple.create()\r\n .set("accountId", item.intValue("accountId"))\r\n .set("eventType", item.stringValue("eventType"))\r\n .set("amount", item.longValue("amount"))\r\n .set("processedAt", processedAt.toString())\r\n .set("processedBy", nodeName);\r\n\r\n enriched.add(result);\r\n }\r\n\r\n return CompletableFuture.completedFuture(enriched);\r\n }\r\n}\n'})})}),(0,s.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-csharp",children:'public class EnrichmentReceiver : IDataStreamerReceiver\r\n{\r\n public ValueTask?> ReceiveAsync(\r\n IList page,\r\n object? arg,\r\n IDataStreamerReceiverContext context,\r\n CancellationToken cancellationToken)\r\n {\r\n var nodeName = context.Ignite.Name;\r\n var processedAt = DateTime.UtcNow;\r\n\r\n var enriched = new List(page.Count);\r\n\r\n foreach (var item in page)\r\n {\r\n var result = new IgniteTuple\r\n {\r\n ["accountId"] = item["accountId"],\r\n ["eventType"] = item["eventType"],\r\n ["amount"] = item["amount"],\r\n ["processedAt"] = processedAt.ToString("O"),\r\n ["processedBy"] = nodeName\r\n };\r\n\r\n enriched.Add(result);\r\n }\r\n\r\n return ValueTask.FromResult?>(enriched);\r\n }\r\n}\n'})})})]}),"\n",(0,s.jsx)(r.h4,{id:"step-2-create-a-forwarding-subscriber",children:"Step 2: Create a Forwarding Subscriber"}),"\n",(0,s.jsx)(r.p,{children:"The result subscriber receives enriched records as they return from cluster nodes. Because the streamer ignores backpressure on the result side, your subscriber must keep pace with incoming results or buffer them internally."}),"\n",(0,s.jsx)(r.p,{children:"This subscriber implements a common pattern: buffer incoming results until a batch threshold is reached, then forward the batch to a downstream system. Batching amortizes the cost of downstream operations (network calls, disk writes) across multiple records."}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.code,{children:"onSubscribe()"})," method requests ",(0,s.jsx)(r.code,{children:"Long.MAX_VALUE"})," items because backpressure signals have no effect on result delivery. The ",(0,s.jsx)(r.code,{children:"onNext()"})," method accumulates results and flushes when the buffer fills. The ",(0,s.jsx)(r.code,{children:"onComplete()"})," and ",(0,s.jsx)(r.code,{children:"onError()"})," methods flush any remaining buffered items before the stream ends."]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"java",label:"Java",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-java",children:"class ForwardingSubscriber implements Flow.Subscriber {\r\n private final int batchSize;\r\n private final List buffer;\r\n private final Consumer> downstream;\r\n\r\n ForwardingSubscriber(Consumer> downstream, int batchSize) {\r\n this.downstream = downstream;\r\n this.batchSize = batchSize;\r\n this.buffer = new ArrayList<>(batchSize);\r\n }\r\n\r\n @Override\r\n public void onSubscribe(Flow.Subscription subscription) {\r\n subscription.request(Long.MAX_VALUE);\r\n }\r\n\r\n @Override\r\n public void onNext(Tuple item) {\r\n buffer.add(item);\r\n\r\n if (buffer.size() >= batchSize) {\r\n downstream.accept(new ArrayList<>(buffer));\r\n buffer.clear();\r\n }\r\n }\r\n\r\n @Override\r\n public void onError(Throwable throwable) {\r\n if (!buffer.isEmpty()) {\r\n downstream.accept(new ArrayList<>(buffer));\r\n buffer.clear();\r\n }\r\n }\r\n\r\n @Override\r\n public void onComplete() {\r\n if (!buffer.isEmpty()) {\r\n downstream.accept(new ArrayList<>(buffer));\r\n buffer.clear();\r\n }\r\n }\r\n}\n"})})}),(0,s.jsxs)(l.A,{value:"dotnet",label:".NET",children:[(0,s.jsxs)(r.p,{children:["In .NET, the ",(0,s.jsx)(r.code,{children:"IAsyncEnumerable"})," pattern provides natural iteration over results. Buffering can be implemented inline:"]}),(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-csharp",children:"var buffer = new List(batchSize);\r\n\r\nawait foreach (IIgniteTuple result in results)\r\n{\r\n buffer.Add(result);\r\n\r\n if (buffer.Count >= batchSize)\r\n {\r\n await downstream.SendBatchAsync(buffer);\r\n buffer.Clear();\r\n }\r\n}\r\n\r\nif (buffer.Count > 0)\r\n{\r\n await downstream.SendBatchAsync(buffer);\r\n}\n"})})]})]}),"\n",(0,s.jsx)(r.h4,{id:"step-3-wire-the-pipeline",children:"Step 3: Wire the Pipeline"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.code,{children:"streamData()"})," overload for receivers accepts additional parameters that control how data flows through the pipeline:"]}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Parameter"}),(0,s.jsx)(r.th,{children:"Purpose"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"publisher"})}),(0,s.jsxs)(r.td,{children:["Source of input data (your ",(0,s.jsx)(r.code,{children:"Flow.Publisher"})," or ",(0,s.jsx)(r.code,{children:"SubmissionPublisher"}),")"]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"receiverDesc"})}),(0,s.jsx)(r.td,{children:"Descriptor identifying the receiver class and deployment units"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"keyFunc"})}),(0,s.jsx)(r.td,{children:"Extracts a key from each input item for partition routing"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"payloadFunc"})}),(0,s.jsx)(r.td,{children:"Transforms input items into the payload type expected by the receiver"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"receiverArg"})}),(0,s.jsx)(r.td,{children:"Optional argument passed to every receiver invocation"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"resultSubscriber"})}),(0,s.jsxs)(r.td,{children:["Receives results returned by the receiver (can be ",(0,s.jsx)(r.code,{children:"null"})," if no results needed)"]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"options"})}),(0,s.jsx)(r.td,{children:"Streaming configuration (batch size, parallelism, flush interval)"})]})]})]}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.code,{children:"keyFunc"})," determines which cluster node processes each item. Items with keys that hash to the same partition are batched together and sent to that partition's primary node. This enables data-local operations when the receiver accesses tables that share the same partitioning scheme."]}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.code,{children:"payloadFunc"})," separates the key extraction concern from the data sent to receivers. Your input items might contain fields used only for routing, while the receiver needs a different shape. Use ",(0,s.jsx)(r.code,{children:"Function.identity()"})," when the input and payload types are the same."]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"java",label:"Java",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-java",children:'// Source: account events from your data source\r\nList accountEvents = List.of(\r\n Tuple.create().set("accountId", 1).set("eventType", "deposit").set("amount", 500L),\r\n Tuple.create().set("accountId", 2).set("eventType", "withdrawal").set("amount", 200L),\r\n Tuple.create().set("accountId", 3).set("eventType", "transfer").set("amount", 1000L)\r\n);\r\n\r\n// Downstream: where enriched events go next\r\nConsumer> downstream = batch -> {\r\n // Send to Kafka, HTTP endpoint, another database, etc.\r\n messageBroker.send("enriched-events", batch);\r\n};\r\n\r\n// Configure receiver\r\nDataStreamerReceiverDescriptor receiverDesc =\r\n DataStreamerReceiverDescriptor.builder(EnrichmentReceiver.class).build();\r\n\r\n// Configure subscriber\r\nForwardingSubscriber resultSubscriber = new ForwardingSubscriber(downstream, 100);\r\n\r\n// Use accounts table for partition routing\r\nRecordView accountsView = client.tables().table("accounts").recordView();\r\n\r\nFunction keyFunc = event -> Tuple.create().set("id", event.intValue("accountId"));\r\nFunction payloadFunc = Function.identity();\r\n\r\n// Stream data through Ignite\r\ntry (var publisher = new SubmissionPublisher()) {\r\n CompletableFuture streamFuture = accountsView.streamData(\r\n publisher,\r\n receiverDesc,\r\n keyFunc,\r\n payloadFunc,\r\n null,\r\n resultSubscriber,\r\n DataStreamerOptions.DEFAULT\r\n );\r\n\r\n accountEvents.forEach(publisher::submit);\r\n}\r\n\r\nstreamFuture.join();\n'})})}),(0,s.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-csharp",children:'// Source: account events from your data source\r\nasync IAsyncEnumerable GetAccountEvents()\r\n{\r\n yield return new IgniteTuple\r\n { ["accountId"] = 1, ["eventType"] = "deposit", ["amount"] = 500L };\r\n yield return new IgniteTuple\r\n { ["accountId"] = 2, ["eventType"] = "withdrawal", ["amount"] = 200L };\r\n yield return new IgniteTuple\r\n { ["accountId"] = 3, ["eventType"] = "transfer", ["amount"] = 1000L };\r\n}\r\n\r\n// Configure receiver\r\nvar receiverDesc = ReceiverDescriptor.Of(new EnrichmentReceiver());\r\n\r\n// Use accounts table for partition routing\r\nvar accountsView = (await client.Tables.GetTableAsync("accounts"))!.RecordBinaryView;\r\n\r\n// Stream data through Ignite\r\nIAsyncEnumerable results = accountsView.StreamDataAsync(\r\n GetAccountEvents(),\r\n receiverDesc,\r\n keySelector: e => new IgniteTuple { ["id"] = e["accountId"] },\r\n payloadSelector: e => e,\r\n receiverArg: null\r\n);\r\n\r\n// Forward to downstream\r\nvar buffer = new List(100);\r\n\r\nawait foreach (IIgniteTuple enrichedEvent in results)\r\n{\r\n buffer.Add(enrichedEvent);\r\n\r\n if (buffer.Count >= 100)\r\n {\r\n await messageBroker.SendAsync("enriched-events", buffer);\r\n buffer.Clear();\r\n }\r\n}\r\n\r\nif (buffer.Count > 0)\r\n{\r\n await messageBroker.SendAsync("enriched-events", buffer);\r\n}\n'})})})]}),"\n",(0,s.jsx)(r.h3,{id:"managing-result-flow",children:"Managing Result Flow"}),"\n",(0,s.jsx)(r.p,{children:"For high-volume streams, the rate at which cluster nodes produce results may exceed the rate at which your downstream system can accept them. Unlike input streaming where backpressure signals control flow, result delivery continues regardless of subscriber readiness."}),"\n",(0,s.jsx)(r.p,{children:"Consider these patterns for managing result flow:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Bounded queue"}),": Place a ",(0,s.jsx)(r.code,{children:"BlockingQueue"})," between the subscriber and downstream operations. The subscriber adds to the queue (blocking if full), while a separate thread drains to downstream. This decouples cluster throughput from downstream latency."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Async forwarding"}),": If your downstream client supports async operations, use ",(0,s.jsx)(r.code,{children:"CompletableFuture"})," to pipeline multiple in-flight requests. This overlaps network latency with continued result processing."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Batch size alignment"}),": Match the forwarding subscriber's batch size to your downstream system's optimal batch size. Mismatched sizes cause either too many small operations or memory pressure from oversized batches."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"If results arrive faster than your subscriber can process them, memory usage grows until the JVM runs out of heap. Monitor result processing throughput relative to cluster output and adjust batch sizes or add buffering as needed."}),"\n",(0,s.jsx)(r.h2,{id:"handling-failures",children:"Handling Failures"}),"\n",(0,s.jsxs)(r.p,{children:["Whether streaming to tables or receivers, network failures, schema mismatches, or cluster issues can cause batch failures. The data streamer automatically retries failed batches up to ",(0,s.jsx)(r.code,{children:"retryLimit"})," times (default 16). Items that exhaust all retry attempts are collected in a ",(0,s.jsx)(r.code,{children:"DataStreamerException"}),"."]}),"\n",(0,s.jsxs)(r.p,{children:["Access failed entries using the ",(0,s.jsx)(r.code,{children:"failedItems()"})," method:"]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"java",label:"Java",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-java",children:'RecordView view = client.tables().table("accounts").recordView(Account.class);\r\n\r\nList> failedItems = new ArrayList<>();\r\nCompletableFuture streamerFut;\r\n\r\ntry (var publisher = new SubmissionPublisher>()) {\r\n streamerFut = view.streamData(publisher, options)\r\n .exceptionally(e -> {\r\n if (e.getCause() instanceof DataStreamerException dse) {\r\n failedItems.addAll(dse.failedItems());\r\n }\r\n return null;\r\n });\r\n\r\n Account entry = new Account(1, "Account name", rnd.nextLong(100_000), rnd.nextBoolean());\r\n publisher.submit(DataStreamerItem.of(entry));\r\n} catch (DataStreamerException e) {\r\n failedItems.addAll(e.failedItems());\r\n}\r\n\r\nstreamerFut.join();\r\n\r\n// Handle failed items after streaming completes\r\nif (!failedItems.isEmpty()) {\r\n // Log failures for investigation\r\n logger.error("Failed to stream {} items after {} retries",\r\n failedItems.size(), options.retryLimit());\r\n\r\n // Option 1: Write to dead-letter queue for later processing\r\n // Option 2: Retry with different options (e.g., smaller batch size)\r\n // Option 3: Use direct table operations for individual items\r\n}\n'})})}),(0,s.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-csharp",children:'ITable? table = await Client.Tables.GetTableAsync("my-table");\r\nIRecordView view = table!.RecordBinaryView;\r\nIList data = [new IgniteTuple { ["key"] = 1L, ["val"] = "v" }];\r\n\r\ntry\r\n{\r\n await view.StreamDataAsync(data.ToAsyncEnumerable());\r\n}\r\ncatch (DataStreamerException e)\r\n{\r\n Console.WriteLine("Failed items: " + string.Join(",", e.FailedItems));\r\n\r\n // Items have exhausted retryLimit attempts\r\n // Investigate failure cause before retrying\r\n}\n'})})})]}),"\n",(0,s.jsx)(r.h3,{id:"handling-persistent-failures",children:"Handling Persistent Failures"}),"\n",(0,s.jsx)(r.p,{children:"Items fail after exhausting retries for reasons such as:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Schema mismatch"}),": Entry fields do not match the table schema"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Constraint violations"}),": Duplicate keys or foreign key violations"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Cluster unavailability"}),": Partition leader unavailable during all retry attempts"]}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"Before retrying failed items:"}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsx)(r.li,{children:"Examine the exception cause to determine the failure reason"}),"\n",(0,s.jsx)(r.li,{children:"Fix data issues (schema mismatches, constraint violations)"}),"\n",(0,s.jsx)(r.li,{children:"Verify cluster health if failures were caused by unavailability"}),"\n",(0,s.jsxs)(r.li,{children:["Consider using direct table operations (",(0,s.jsx)(r.code,{children:"upsert"}),", ",(0,s.jsx)(r.code,{children:"insert"}),") for small numbers of failed items rather than restarting the streamer"]}),"\n"]}),"\n",(0,s.jsx)(r.h2,{id:"tuning-flush-behavior",children:"Tuning Flush Behavior"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.code,{children:"autoFlushInterval"})," setting (default 5000ms) controls how long the streamer waits before sending incomplete batches. This addresses two scenarios:"]}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Slow data sources"}),": When your publisher produces data slowly, buffers may not fill to ",(0,s.jsx)(r.code,{children:"pageSize"})," within a reasonable time. The auto-flush ensures data reaches the cluster without waiting for a full batch."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Uneven partition distribution"}),": If your data keys cluster into a few partitions, some partition buffers fill while others remain nearly empty. Auto-flush sends partial batches from slow-filling partitions."]}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["Set a shorter interval for latency-sensitive workloads. Set a longer interval (or increase ",(0,s.jsx)(r.code,{children:"pageSize"}),") for throughput-focused bulk loads where latency is less critical."]})]})}function p(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/2e3ac162.b259df81.js b/docs/ignite3/assets/js/2e3ac162.b259df81.js deleted file mode 100644 index 449bfe979e..0000000000 --- a/docs/ignite3/assets/js/2e3ac162.b259df81.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3280],{28453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>l});var s=r(96540);const i={},a=s.createContext(i);function t(e){const n=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(a.Provider,{value:n},e.children)}},67572:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"understand/performance/using-explain","title":"Using EXPLAIN Command","description":"The EXPLAIN command displays the execution plan for a SQL query without running it. Use this to understand how the query optimizer processes your query and identify performance bottlenecks.","source":"@site/docs/understand/performance/using-explain.md","sourceDirName":"understand/performance","slug":"/understand/performance/using-explain","permalink":"/docs/ignite3/3.1.0/understand/performance/using-explain","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"id":"using-explain","title":"Using EXPLAIN Command","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Performance","permalink":"/docs/ignite3/3.1.0/understand/performance/"},"next":{"title":"EXPLAIN Operators Reference","permalink":"/docs/ignite3/3.1.0/understand/performance/explain-operators"}}');var i=r(74848),a=r(28453);const t={id:"using-explain",title:"Using EXPLAIN Command",sidebar_position:1},l="Using EXPLAIN Command",o={},d=[{value:"EXPLAIN Command Syntax",id:"explain-command-syntax",level:2},{value:"Understanding The Output",id:"understanding-the-output",level:2},{value:"Operator Categories",id:"operator-categories",level:3},{value:"Plan Structure",id:"plan-structure",level:3},{value:"Common Query Optimization Issues",id:"common-query-optimization-issues",level:2},{value:"Full Scan Instead of Index Scan",id:"full-scan-instead-of-index-scan",level:2},{value:"Suboptimal Indexes",id:"suboptimal-indexes",level:2},{value:"Unexpected Sort Operation",id:"unexpected-sort-operation",level:2},{value:"Performance Impact of Correlated Subqueries",id:"performance-impact-of-correlated-subqueries",level:2},{value:"Excessive Sorting",id:"excessive-sorting",level:2},{value:"Select Count Optimization",id:"select-count-optimization",level:2},{value:"Index Scan Without Exact Search Bounds",id:"index-scan-without-exact-search-bounds",level:2},{value:"Prohibit Index Usage",id:"prohibit-index-usage",level:3},{value:"Manual Type Casting",id:"manual-type-casting",level:3},{value:"Colocation Usage",id:"colocation-usage",level:2},{value:"Additional EXPLAIN Examples",id:"additional-explain-examples",level:2},{value:"Example: Complex Join Query",id:"example-complex-join-query",level:3},{value:"Example: Query Mapping",id:"example-query-mapping",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",mermaid:"mermaid",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"using-explain-command",children:"Using EXPLAIN Command"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"EXPLAIN"})," command displays the execution plan for a SQL query without running it. Use this to understand how the query optimizer processes your query and identify performance bottlenecks."]}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Query Processing"\r\n SQL[SQL Query] --\x3e Parser\r\n Parser --\x3e Optimizer\r\n Optimizer --\x3e Plan[Execution Plan]\r\n end\r\n\r\n subgraph "EXPLAIN Output"\r\n Plan --\x3e PLAN[EXPLAIN PLAN
                                                              Operator Tree]\r\n Plan --\x3e MAP[EXPLAIN MAPPING
                                                              Fragment Distribution]\r\n end'}),"\n",(0,i.jsx)(n.p,{children:"The execution plan reveals:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Table access order and methods (full scan vs index scan)"}),"\n",(0,i.jsx)(n.li,{children:"Join algorithms (hash join, merge join, nested loop)"}),"\n",(0,i.jsx)(n.li,{children:"Index usage and search bounds"}),"\n",(0,i.jsx)(n.li,{children:"Row count estimates at each stage"}),"\n",(0,i.jsx)(n.li,{children:"Data distribution across cluster nodes (with MAPPING)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"explain-command-syntax",children:"EXPLAIN Command Syntax"}),"\n",(0,i.jsxs)(n.p,{children:["Apache Ignite supports two variations of the ",(0,i.jsx)(n.code,{children:"EXPLAIN"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN [PLAN | MAPPING] FOR \n"})}),"\n",(0,i.jsxs)(n.p,{children:["If neither ",(0,i.jsx)(n.code,{children:"PLAN"})," nor ",(0,i.jsx)(n.code,{children:"MAPPING"})," is specified, then ",(0,i.jsx)(n.code,{children:"PLAN"})," is implicit."]}),"\n",(0,i.jsx)(n.p,{children:"Parameters:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"PLAN"})," - explains query in terms of relational operators tree. This representation is suitable for investigation of performance issues related to the optimizer."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"MAPPING"})," - explains query in terms of mapping of query fragment to a particular node of the cluster. This representation is suitable for investigation of performance issues related to the data colocation."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Examples:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN SELECT * FROM lineitem;\r\nEXPLAIN PLAN FOR SELECT * FROM lineitem;\r\nEXPLAIN MAPPING FOR SELECT * FROM lineitem;\n"})}),"\n",(0,i.jsx)(n.h2,{id:"understanding-the-output",children:"Understanding The Output"}),"\n",(0,i.jsx)(n.p,{children:"Each query plan is a tree of relational operators. Data flows from leaf nodes (table scans) up through transformation nodes (joins, sorts) to the root node (final result)."}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Query Plan Tree"\r\n Root[Project
                                                              fieldNames: result columns]\r\n Join[HashJoin
                                                              predicate: join condition]\r\n Scan1[TableScan
                                                              table: ORDERS]\r\n Scan2[IndexScan
                                                              table: CUSTOMERS
                                                              index: IDX_CUST_ID]\r\n end\r\n\r\n Root --\x3e Join\r\n Join --\x3e Scan1\r\n Join --\x3e Scan2\r\n\r\n subgraph "Data Flow"\r\n direction TB\r\n D1[Rows from ORDERS] --\x3e D3[Joined Rows]\r\n D2[Rows from CUSTOMERS] --\x3e D3\r\n D3 --\x3e D4[Projected Result]\r\n end'}),"\n",(0,i.jsx)(n.p,{children:"Each operator node includes:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Name"}),": The algorithm used (TableScan, HashJoin, Sort, etc.)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Attributes"}),": Operator-specific details (table name, predicate, field names)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Estimate"}),": Expected row count at this stage (",(0,i.jsx)(n.code,{children:"est: (rows=N)"}),")"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"OperatorName\r\n attribute1: value1\r\n attribute2: value2\r\n est: (rows=N)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"operator-categories",children:"Operator Categories"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Category"}),(0,i.jsx)(n.th,{children:"Operators"}),(0,i.jsx)(n.th,{children:"Purpose"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Scan"})}),(0,i.jsx)(n.td,{children:"TableScan, IndexScan, SystemViewScan"}),(0,i.jsx)(n.td,{children:"Read data from tables"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Join"})}),(0,i.jsx)(n.td,{children:"HashJoin, MergeJoin, NestedLoopJoin"}),(0,i.jsx)(n.td,{children:"Combine rows from multiple sources"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Aggregate"})}),(0,i.jsx)(n.td,{children:"ColocatedHashAggregate, MapSortAggregate"}),(0,i.jsx)(n.td,{children:"GROUP BY operations"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Transform"})}),(0,i.jsx)(n.td,{children:"Project, Filter, Sort, Limit"}),(0,i.jsx)(n.td,{children:"Shape and order results"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Distribution"})}),(0,i.jsx)(n.td,{children:"Exchange, Sender, Receiver"}),(0,i.jsx)(n.td,{children:"Move data between nodes"})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"./explain-operators",children:"EXPLAIN Operators Reference"})," for the complete operator list."]}),"\n",(0,i.jsx)(n.h3,{id:"plan-structure",children:"Plan Structure"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Leaf nodes"}),": Data sources (TableScan, IndexScan)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Internal nodes"}),": Transformations (Join, Sort, Aggregate)"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Root node"}),": Final operator producing the query result"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"common-query-optimization-issues",children:"Common Query Optimization Issues"}),"\n",(0,i.jsx)(n.p,{children:"SQL EXPLAIN output analysis can help you optimize slow query execution. You can avoid common bottlenecks in SQL execution by following these guidelines:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Avoid scanning an entire table."}),"\n",(0,i.jsx)(n.li,{children:"Avoid scanning non-optimal indexes."}),"\n",(0,i.jsx)(n.li,{children:"Avoid suboptimal join ordering or join algorithm."}),"\n",(0,i.jsx)(n.li,{children:"Ensure optimal data colocation for your queries."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In the following sections, we will see some common issues with queries and ways to identify and fix them."}),"\n",(0,i.jsx)(n.h2,{id:"full-scan-instead-of-index-scan",children:"Full Scan Instead of Index Scan"}),"\n",(0,i.jsx)(n.p,{children:"Suppose related sql execution flow looks like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t (id INT PRIMARY KEY, col1 VARCHAR);\r\nCREATE INDEX t_col1_idx ON t(col1);\r\n\r\nSELECT id FROM t WHERE col1 = '1';\n"})}),"\n",(0,i.jsx)(n.p,{children:"And possible EXPLAIN output:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" TableScan\r\n table: PUBLIC.T\r\n predicate: =(COL1, _UTF-8'1')\r\n fieldNames: [ID]\r\n est: (rows=1)\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"For simplicity, here and below, information that is not related to the example is omitted from the EXPLAIN output."})}),"\n",(0,i.jsxs)(n.p,{children:["We can see a full scan (",(0,i.jsx)(n.em,{children:"TableScan"})," operator) with predicate. The execution planner chooses which scan implementation (",(0,i.jsx)(n.strong,{children:"TableScan"})," or ",(0,i.jsx)(n.strong,{children:"IndexScan"}),") to use. If you expect that index scan is preferable, you can use the ",(0,i.jsx)(n.code,{children:"FORCE_INDEX"})," hint to manually force ",(0,i.jsx)(n.code,{children:"IndexScan"})," approach:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ FORCE_INDEX(t_col1_idx) */ id FROM t WHERE col1 = '1';\n"})}),"\n",(0,i.jsx)(n.p,{children:"Will show a different plan, like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n type: SORTED\r\n predicate: =(COL1, _UTF-8'1')\r\n searchBounds: [ExactBounds [bound=_UTF-8'1']]\r\n fieldNames: [ID]\r\n collation: []\r\n est: (rows=1)\n"})}),"\n",(0,i.jsx)(n.h2,{id:"suboptimal-indexes",children:"Suboptimal Indexes"}),"\n",(0,i.jsx)(n.p,{children:"Indexes with less prediction can be chosen, for example schema and query may look as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t (id INT PRIMARY KEY, col1 VARCHAR, col2 VARCHAR);\r\nCREATE INDEX t_col1_col2_idx ON T(col1, col2);\r\nCREATE INDEX t_col1_idx ON t(col1);\r\n\r\nSELECT id FROM t WHERE col1 = '1' AND col2 = '2';\n"})}),"\n",(0,i.jsx)(n.p,{children:"and a possible plan would be:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see that the execution uses the ",(0,i.jsx)(n.strong,{children:"T_COL1_IDX"})," index, through both predicates ",(0,i.jsx)(n.strong,{children:"COL1 = '1' AND COL2 = '2'"})," are involved and the ",(0,i.jsx)(n.strong,{children:"T_COL1_COL2_IDX"})," is preferable. In this case, the optimal plan would be:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_COL2_IDX\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You can also use the ",(0,i.jsx)(n.code,{children:"FORCE_INDEX"})," hint to achieve this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ FORCE_INDEX(t_col1_col2_idx) */ id FROM t WHERE col1 = '1' AND col2 = '2';\n"})}),"\n",(0,i.jsx)(n.h2,{id:"unexpected-sort-operation",children:"Unexpected Sort Operation"}),"\n",(0,i.jsx)(n.p,{children:"By default, sorted indexes store their entries in ascending order. You can adjust the ordering of a sorted index by including the options ASC or DESC."}),"\n",(0,i.jsx)(n.p,{children:"Let's suppose the schema and related query look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t1 (id INT PRIMARY KEY, col1 VARCHAR);\r\nCREATE TABLE t2 (id INT PRIMARY KEY, col1 VARCHAR);\r\nCREATE INDEX t1_col1_desc_idx ON t1(col1 DESC);\r\nCREATE INDEX t2_col1_idx ON t2(col1);\r\n\r\nSELECT t1.id as t1id, t2.id as t2id FROM t1 JOIN t2 USING (col1);\n"})}),"\n",(0,i.jsx)(n.p,{children:"And the possible execution plan looks like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" MergeJoin\r\n ...\r\n Sort\r\n collation: [COL1 ASC]\r\n ...\r\n IndexScan\r\n index: T2_COL1_IDX\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["In the example above, the planner adds the ",(0,i.jsx)(n.strong,{children:"Sort"})," operation before performing the ",(0,i.jsx)(n.strong,{children:"IndexScan"}),", as the index used is sorted in descending order, while ascending order is required."]}),"\n",(0,i.jsxs)(n.p,{children:["Extra ",(0,i.jsx)(n.strong,{children:"Sort"})," operations adds performance costs, and we can avoid it by creating an index with the appropriate sort ordering:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE INDEX t1_col1_idx ON t1(col1);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And plan will no longer display the ",(0,i.jsx)(n.strong,{children:"Sort"})," operation, improving query execution speed:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" MergeJoin\r\n ...\r\n IndexScan\r\n index: T1_COL1_IDX\r\n ...\r\n IndexScan\r\n index: T2_COL1_IDX\r\n ...\n"})}),"\n",(0,i.jsx)(n.h2,{id:"performance-impact-of-correlated-subqueries",children:"Performance Impact of Correlated Subqueries"}),"\n",(0,i.jsx)(n.p,{children:"The SQL-99 standard allows for nested subqueries at nearly all places within a query, so Ignite 3 supports nested subqueries, both correlated and not. Performance of certain complex correlated subqueries may be insufficient. Let's consider a correlated query:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE emp(dept_id INTEGER PRIMARY KEY, name VARCHAR, salary INTEGER);\r\nCREATE TABLE dept(id INTEGER PRIMARY KEY, name VARCHAR);\r\n\r\nSELECT emp.name, (SELECT dept.name FROM dept WHERE emp.dept_id=dept.id)\r\nFROM emp\r\nWHERE emp.salary > 1000;\n"})}),"\n",(0,i.jsx)(n.p,{children:"We can see nested correlated subquery here, lets check the plan:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" CorrelatedNestedLoopJoin\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n predicate: >(SALARY, 1000)\r\n ...\r\n ColocatedHashAggregate\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n predicate: =($cor1.DEPT_ID, ID)\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The example above shows the slow ",(0,i.jsx)(n.strong,{children:"CorrelatedNestedLoopJoin"})," operation. Queries with this operation may cause a number of issues:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Such subqueries may become bottlenecks."}),"\n",(0,i.jsx)(n.li,{children:"Queries can cause high CPU load."}),"\n",(0,i.jsx)(n.li,{children:"Certain queries may perform slower than expected."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If performance issues are found in similar queries, it would be more efficient to rewrite the query without nested subqueries, for example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT emp.name, dept.name\r\nFROM emp, dept\r\nWHERE emp.salary > 1000 AND emp.dept_id=dept.id;\n"})}),"\n",(0,i.jsx)(n.p,{children:"And new plan becomes:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" HashJoin\r\n predicate: =(DEPT_ID, ID)\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n predicate: >(SALARY, 1000)\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Without the ",(0,i.jsx)(n.strong,{children:"CorrelatedNestedLoopJoin"})," operation, the query should perform much better than the previous one."]}),"\n",(0,i.jsx)(n.h2,{id:"excessive-sorting",children:"Excessive Sorting"}),"\n",(0,i.jsx)(n.p,{children:"Let's explain we have an index involved two columns one of them is participate in predicate and other in ordering, or in sql terms:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE emp(dept_id INTEGER PRIMARY KEY, name VARCHAR, salary INTEGER);\r\nCREATE INDEX emp_salary_name_idx ON emp(salary, name);\r\n\r\nSELECT dept_id FROM emp WHERE salary = 1 ORDER BY name;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Expectations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Index need to be used here."}),"\n",(0,i.jsxs)(n.li,{children:["No additional sort is needed because index is ordered by ",(0,i.jsx)(n.strong,{children:"name"})," column is satisfies initial query ordering."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"But the real execution plan shows a different result:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" Sort\r\n collation: [NAME ASC]\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n predicate: =(SALARY, 1)\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see a redundant ",(0,i.jsx)(n.strong,{children:"Sort"})," operator. A bit query refactoring can help to avoid excessive sorting:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT dept_id FROM emp WHERE salary = 1 ORDER BY salary, name;\n"})}),"\n",(0,i.jsx)(n.p,{children:"And the plan becomes as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.EMP\r\n index: EMP_SALARY_NAME_IDX\r\n predicate: =(SALARY, 1)\r\n ...\n"})}),"\n",(0,i.jsx)(n.h2,{id:"select-count-optimization",children:"Select Count Optimization"}),"\n",(0,i.jsx)(n.p,{children:"Some queries can be optimized to use more optimal plans which brings performance speed up. For example, plan for:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT COUNT(*) FROM emp;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Can look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" SelectCount\r\n table: PUBLIC.EMP\r\n est: (rows=43)\r\n ...\n"})}),"\n",(0,i.jsx)(n.p,{children:"But there are numerous cases where such optimization is not applicable. In such a cases, a plan can be different and the execution may require more time."}),"\n",(0,i.jsx)(n.p,{children:"The same query as above, but with explicit transaction may produce a different plan, for example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" ReduceSortAggregate\r\n ...\r\n MapSortAggregate\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n est: (rows=43)\r\n ...\n"})}),"\n",(0,i.jsx)(n.h2,{id:"index-scan-without-exact-search-bounds",children:"Index Scan Without Exact Search Bounds"}),"\n",(0,i.jsx)(n.p,{children:"Table scans are available in two implementations: direct table scan and scan through index. Index scans contain predicate and search bounds. Predicate provides final rows comparison. If search bounds are absent, the query degenerates into table scan through index scan (requiring an additional store look up), with further predicate comparison, that incurs additional performance overhead costs."}),"\n",(0,i.jsx)(n.p,{children:"Let's suppose we have schema and query like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t (id INTEGER PRIMARY KEY, col1 DECIMAL(5, 3));\r\nCREATE INDEX t_col1_idx ON t(col1);\r\n\r\nSELECT id FROM t WHERE col1 = 43;\n"})}),"\n",(0,i.jsx)(n.p,{children:"And possible plan would look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n predicate: =(CAST(COL1):DECIMAL(13, 3), 43.000)\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see here only ",(0,i.jsx)(n.strong,{children:"predicate"})," (and no ",(0,i.jsx)(n.strong,{children:"searchBounds"}),") which means that ",(0,i.jsx)(n.strong,{children:"all"})," rows from index will go through predicate and bring additional performance penalty."]}),"\n",(0,i.jsx)(n.p,{children:"Two type of solutions are possible here:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"You can prohibit suboptimal index usage."}),"\n",(0,i.jsx)(n.li,{children:"You can explicitly help the planner with type derivation."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"prohibit-index-usage",children:"Prohibit Index Usage"}),"\n",(0,i.jsxs)(n.p,{children:["For the first approach, use the ",(0,i.jsx)(n.strong,{children:"NO_INDEX"})," hint to prohibit index usage:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ NO_INDEX */ id FROM t WHERE col1 = 43;\r\n\r\n-- or with direct index mention:\r\n\r\nSELECT /*+ NO_INDEX(t_col1_idx) */ id FROM t WHERE col1 = 43;\n"})}),"\n",(0,i.jsx)(n.p,{children:"As a result, you will have a plan similar to this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" TableScan\r\n table: PUBLIC.T\r\n predicate: =(CAST(COL1):DECIMAL(13, 3), 43.000)\r\n ...\n"})}),"\n",(0,i.jsx)(n.h3,{id:"manual-type-casting",children:"Manual Type Casting"}),"\n",(0,i.jsx)(n.p,{children:"You can append additional cast to the same query to explicitly cast data as a specific type:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT id FROM t WHERE col1 = 43::DECIMAL(5, 3);\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n predicate: =(COL1, 43.000)\r\n searchBounds: [ExactBounds [bound=43.000:DECIMAL(5, 3)]]\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see here both ",(0,i.jsx)(n.strong,{children:"searchBounds"})," and ",(0,i.jsx)(n.strong,{children:"predicate"})," which means that only exact lookup through index will be involved."]}),"\n",(0,i.jsx)(n.p,{children:"The same case as above but for a bit complicated query:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t (id INT PRIMARY KEY, col1 INT);\r\nCREATE INDEX t_col1_asc_idx ON t (col1);\r\n\r\nSELECT * FROM t WHERE col1::varchar = SUBSTR(CURRENT_DATE::varchar, 4);\n"})}),"\n",(0,i.jsx)(n.p,{children:"Possible plan:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:' IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n predicate: =(CAST(COL1):VARCHAR CHARACTER SET "UTF-8", SUBSTR(CAST(CURRENT_DATE):VARCHAR CHARACTER SET "UTF-8" NOT NULL, 4))\r\n ...\n'})}),"\n",(0,i.jsxs)(n.p,{children:["And we also can see that no ",(0,i.jsx)(n.strong,{children:"search bounds"})," are involved here."]}),"\n",(0,i.jsx)(n.p,{children:"Try to change it like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT * FROM t WHERE col1 = SUBSTR(CURRENT_DATE::varchar, 4)::int;\n"})}),"\n",(0,i.jsx)(n.p,{children:"And the possible plan will become:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:' IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_ASC_IDX\r\n predicate: =(COL1, CAST(SUBSTR(CAST(CURRENT_DATE):VARCHAR CHARACTER SET "UTF-8" NOT NULL, 4)):INTEGER NOT NULL)\r\n searchBounds: [ExactBounds [bound=CAST(SUBSTR(CAST(CURRENT_DATE):VARCHAR CHARACTER SET "UTF-8" NOT NULL, 4)):INTEGER]]\r\n ...\n'})}),"\n",(0,i.jsxs)(n.p,{children:["We can see that ",(0,i.jsx)(n.strong,{children:"searchBounds"})," are present, thus more productive execution flow is expected here."]}),"\n",(0,i.jsx)(n.h2,{id:"colocation-usage",children:"Colocation Usage"}),"\n",(0,i.jsx)(n.p,{children:"Data colocation eliminates network transfers during joins by ensuring related rows reside on the same node. The EXPLAIN output shows this through Exchange operators."}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Without Colocation"\r\n direction TB\r\n J1[HashJoin]\r\n E1[Exchange
                                                              distribution: single]\r\n E2[Exchange
                                                              distribution: single]\r\n T1[TableScan: emp]\r\n T2[TableScan: dept]\r\n\r\n J1 --\x3e E1 --\x3e T1\r\n J1 --\x3e E2 --\x3e T2\r\n end\r\n\r\n subgraph "With Colocation"\r\n direction TB\r\n J2[HashJoin]\r\n T3[TableScan: emp]\r\n T4[TableScan: dept]\r\n\r\n J2 --\x3e T3\r\n J2 --\x3e T4\r\n end'}),"\n",(0,i.jsx)(n.p,{children:"Exchange operators indicate data movement between nodes. Fewer Exchange operators mean less network overhead."}),"\n",(0,i.jsx)(n.p,{children:"For example, if tables are created without colocation consideration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- by default, the table is implicitly colocated by PRIMARY KEY\r\nCREATE TABLE emp(dept_id INTEGER, name VARCHAR, salary INTEGER, PRIMARY KEY(dept_id, name));\r\n\r\n-- implicitly colocated by PRIMARY KEY\r\nCREATE TABLE dept(id INTEGER, name VARCHAR, PRIMARY KEY(name, id));\n"})}),"\n",(0,i.jsx)(n.p,{children:"And query as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT emp.name, dept.name FROM emp JOIN dept ON emp.dept_id = dept.id AND emp.salary > 1000;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Bring plan like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" HashJoin\r\n predicate: =(DEPT_ID, ID)\r\n ...\r\n Exchange\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n ...\r\n Exchange\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see two ",(0,i.jsx)(n.strong,{children:"Exchange"})," operators, which means that all rows are transferred into a single node and then are joined. This execution flow brings a performance cost and slows down query execution."]}),"\n",(0,i.jsxs)(n.p,{children:["Let's try to improve it by adding explicit colocation for the ",(0,i.jsx)(n.strong,{children:"dept"})," table by the ",(0,i.jsx)(n.strong,{children:"ID"})," column:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- implicitly colocated by PRIMARY KEY\r\nCREATE TABLE emp(dept_id INTEGER, name VARCHAR, salary INTEGER, PRIMARY KEY(dept_id, name));\r\n-- explicitly colocated by ID\r\nCREATE TABLE dept(id INTEGER, name VARCHAR, PRIMARY KEY(name, id)) COLOCATE BY (id);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now the dependent rows from ",(0,i.jsx)(n.strong,{children:"emp"})," table are transferred into the appropriate node where ",(0,i.jsx)(n.strong,{children:"dept"})," holds the rows according to ",(0,i.jsx)(n.strong,{children:"DEPT.ID"})," distribution:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:' HashJoin\r\n predicate: =(DEPT_ID, ID)\r\n ...\r\n Exchange\r\n distribution: table PUBLIC.DEPT in zone "Default" by [DEPT_ID]\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n ...\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Only one ",(0,i.jsx)(n.strong,{children:"Exchange"})," operator for now, which, once again, mean only rows transferring from ",(0,i.jsx)(n.strong,{children:"emp"})," table to appropriate ",(0,i.jsx)(n.strong,{children:"dept"})," one."]}),"\n",(0,i.jsx)(n.p,{children:"And finally, both join predicate related columns are colocated:"}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["The following colocation example will only work if the ",(0,i.jsx)(n.strong,{children:"emp"})," and ",(0,i.jsx)(n.strong,{children:"dept"})," tables belong to the same distribution zone."]})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- explicitly colocated by DEPT_ID\r\nCREATE TABLE emp(dept_id INTEGER, name VARCHAR, salary INTEGER, PRIMARY KEY(dept_id, name)) COLOCATE BY(dept_id);\r\n-- explicitly colocated by ID\r\nCREATE TABLE dept(id INTEGER, name VARCHAR, PRIMARY KEY(id, name)) COLOCATE BY(id);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now, the ",(0,i.jsx)(n.strong,{children:"emp"})," and ",(0,i.jsx)(n.strong,{children:"dept"})," tables are both colocated."]}),"\n",(0,i.jsx)(n.p,{children:"And the final plan will look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" HashJoin\r\n predicate: =(DEPT_ID, ID)\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["No ",(0,i.jsx)(n.strong,{children:"Exchange"})," operators are involved in the explanation, which means that no excessive rows transfer has occurred."]}),"\n",(0,i.jsx)(n.h2,{id:"additional-explain-examples",children:"Additional EXPLAIN Examples"}),"\n",(0,i.jsx)(n.h3,{id:"example-complex-join-query",children:"Example: Complex Join Query"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN PLAN FOR\r\n SELECT\r\n U.UserName, P.ProductName, R.ReviewText, R.Rating\r\n FROM Users U, Reviews R, Products P\r\n WHERE U.UserID = R.UserID\r\n AND R.ProductID = P.ProductID\r\n AND P.ProductName = 'Product_' || ?::varchar\n"})}),"\n",(0,i.jsx)(n.p,{children:"The resulting output is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"Project\r\n fieldNames: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n projection: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n est: (rows=16650)\r\n HashJoin\r\n predicate: =(USERID$0, USERID)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME, USERID$0, USERNAME]\r\n type: inner\r\n est: (rows=16650)\r\n HashJoin\r\n predicate: =(PRODUCTID, PRODUCTID$0)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME]\r\n type: inner\r\n est: (rows=16650)\r\n Exchange\r\n distribution: single\r\n est: (rows=50000)\r\n TableScan\r\n table: PUBLIC.REVIEWS\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n est: (rows=50000)\r\n Exchange\r\n distribution: single\r\n est: (rows=1665)\r\n TableScan\r\n table: PUBLIC.PRODUCTS\r\n predicate: =(PRODUCTNAME, ||(_UTF-8'Product_', CAST(?0):VARCHAR CHARACTER SET \"UTF-8\"))\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n est: (rows=1665)\r\n Exchange\r\n distribution: single\r\n est: (rows=10000)\r\n TableScan\r\n table: PUBLIC.USERS\r\n fieldNames: [USERID, USERNAME]\r\n est: (rows=10000)\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This execution plan represents a query that joins three tables: ",(0,i.jsx)(n.code,{children:"USERS"}),", ",(0,i.jsx)(n.code,{children:"REVIEWS"}),", and ",(0,i.jsx)(n.code,{children:"PRODUCTS"}),", and selects four fields after filtering by product name."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Project"})," (root node): Outputs the final selected fields (USERNAME, PRODUCTNAME, REVIEWTEXT, and RATING)."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"HashJoins"})," (two levels): Perform the inner joins.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The first (bottom-most) joins REVIEWS with PRODUCTS on PRODUCTID."}),"\n",(0,i.jsx)(n.li,{children:"The second joins the result with USERS on USERID."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"TableScans"}),": Each table is scanned:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"REVIEWS is fully scanned."}),"\n",(0,i.jsx)(n.li,{children:"PRODUCTS is scanned with a filter on PRODUCTNAME."}),"\n",(0,i.jsx)(n.li,{children:"USERS is fully scanned."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Exchange"})," nodes: Indicate data redistribution between operators."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Each node includes:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"fieldNames"}),": Output columns at that stage."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"predicate"}),": Join or filter condition."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"est"}),": Estimated number of rows at that point in the plan."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"example-query-mapping",children:"Example: Query Mapping"}),"\n",(0,i.jsx)(n.p,{children:"A result of EXPLAIN MAPPING command includes additional metadata providing insight at how the query is mapped on cluster topology. So, for the command like below:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN MAPPING FOR\r\n SELECT\r\n U.UserName, P.ProductName, R.ReviewText, R.Rating\r\n FROM Users U, Reviews R, Products P\r\n WHERE U.UserID = R.UserID\r\n AND R.ProductID = P.ProductID\r\n AND P.ProductName = 'Product_' || ?::varchar\n"})}),"\n",(0,i.jsx)(n.p,{children:"The resulting output is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:'Fragment#0 root\r\n distribution: single\r\n executionNodes: [node_1]\r\n tree:\r\n Project\r\n fieldNames: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n projection: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n est: (rows=1)\r\n HashJoin\r\n predicate: =(USERID$0, USERID)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME, USERID$0, USERNAME]\r\n type: inner\r\n est: (rows=1)\r\n HashJoin\r\n predicate: =(PRODUCTID, PRODUCTID$0)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME]\r\n type: inner\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n sourceFragmentId: 1\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n sourceFragmentId: 2\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [USERID, USERNAME]\r\n sourceFragmentId: 3\r\n est: (rows=1)\r\n\r\nFragment#1\r\n distribution: random\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [REVIEWS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=50000)\r\n TableScan\r\n table: PUBLIC.REVIEWS\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n est: (rows=50000)\r\n\r\nFragment#2\r\n distribution: table PUBLIC.PRODUCTS in zone "Default"\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [PRODUCTS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=1665)\r\n TableScan\r\n table: PUBLIC.PRODUCTS\r\n predicate: =(PRODUCTNAME, ||(_UTF-8\'Product_\', CAST(?0):VARCHAR CHARACTER SET "UTF-8"))\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n est: (rows=1665)\r\n\r\nFragment#3\r\n distribution: table PUBLIC.USERS in zone "Default"\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [USERS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=10000)\r\n TableScan\r\n table: PUBLIC.USERS\r\n fieldNames: [USERID, USERNAME]\r\n est: (rows=10000)\n'})}),"\n",(0,i.jsx)(n.p,{children:"Where:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Fragment#0"})," means fragment with id=0"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"root"})," marks a fragment which is considered as root fragment, i.e. a fragment which represents user's cursor"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"distribution"})," attribute provides an insight into which mapping strategy was applied to this particular fragment"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"executionNodes"})," attribute provides a list of nodes this fragment will be executed on"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"partitions"})," attribute provides an insight into which partitions of which tables will be read from which nodes"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"tree"})," attribute specifies which part of the relational tree corresponds to this fragment"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The output above shows how the query is broken into multiple execution fragments and distributed across the cluster. It gives insight into both the logical execution plan and how it maps to the physical topology."}),"\n",(0,i.jsxs)(n.p,{children:["The query starts execution in ",(0,i.jsx)(n.em,{children:"Fragment#0"}),", which serves as the root of the plan (this is where the final result is produced). It runs on a single node (",(0,i.jsx)(n.code,{children:"node_1"}),") and contains the main logic of the query, including the projection and two nested hash joins. Instead of scanning tables directly, it receives data from other fragments through ",(0,i.jsx)(n.code,{children:"Receiver"})," operators. These incoming streams correspond to the ",(0,i.jsx)(n.code,{children:"REVIEWS"}),", ",(0,i.jsx)(n.code,{children:"PRODUCTS"}),", and ",(0,i.jsx)(n.code,{children:"USERS"})," tables."]}),"\n",(0,i.jsxs)(n.p,{children:["The actual table scans happen in ",(0,i.jsx)(n.em,{children:"Fragments 1 through 3"}),", each responsible for one of the involved tables. These fragments operate in parallel across the cluster. Each performs a scan on its respective table and then sends the results back to Fragment#0."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"Fragment#1"})," handles the ",(0,i.jsx)(n.code,{children:"REVIEWS"})," table. It runs on all nodes and uses a random distribution strategy. Data is partitioned across nodes, and after scanning the table, results are sent upstream."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"Fragment#2"})," is in charge of the ",(0,i.jsx)(n.code,{children:"PRODUCTS"})," table. It also spans all nodes but follows a zone-based distribution linked to the table's partitioning. There's a filter applied to ",(0,i.jsx)(n.code,{children:"PRODUCTNAME"}),", which limits the amount of data sent to the root."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"Fragment#3"})," covers the ",(0,i.jsx)(n.code,{children:"USERS"})," table. Like the others, it's distributed and reads from table partitions spread across the cluster."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Each fragment includes metadata such as the nodes it's executed on, how data is partitioned, and how results are sent between fragments. This layout provides a clear view of not only how the query is logically processed, but also how the workload is split and coordinated in a distributed environment."})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/2e4f0f2d.7a87b667.js b/docs/ignite3/assets/js/2e4f0f2d.7a87b667.js deleted file mode 100644 index 17c6b89c83..0000000000 --- a/docs/ignite3/assets/js/2e4f0f2d.7a87b667.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5606],{28453:(e,r,n)=>{n.d(r,{R:()=>a,x:()=>o});var t=n(96540);const i={},s=t.createContext(i);function a(e){const r=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(s.Provider,{value:r},e.children)}},58754:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"understand/architecture/architecture-overview","title":"Architecture Overview","description":"Apache Ignite 3 is a distributed database built on a modular component architecture. Each node runs the same set of services, enabling any node to handle client requests and participate in data storage. This document provides a deeper look at the system architecture introduced in What is Apache Ignite 3?.","source":"@site/docs/understand/architecture/architecture-overview.md","sourceDirName":"understand/architecture","slug":"/understand/architecture/architecture-overview","permalink":"/docs/ignite3/3.1.0/understand/architecture/architecture-overview","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":0,"frontMatter":{"id":"architecture-overview","title":"Architecture Overview","sidebar_position":0},"sidebar":"tutorialSidebar","previous":{"title":"Architecture","permalink":"/docs/ignite3/3.1.0/understand/architecture/"},"next":{"title":"Storage Architecture","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-architecture"}}');var i=n(74848),s=n(28453);const a={id:"architecture-overview",title:"Architecture Overview",sidebar_position:0},o="Architecture Overview",d={},c=[{value:"System Architecture",id:"system-architecture",level:2},{value:"Node Components",id:"node-components",level:2},{value:"Core Services",id:"core-services",level:3},{value:"Cluster Coordination",id:"cluster-coordination",level:3},{value:"Data Management",id:"data-management",level:3},{value:"Query and Transaction Processing",id:"query-and-transaction-processing",level:3},{value:"Cluster Coordination",id:"cluster-coordination-1",level:2},{value:"Cluster Management Group (CMG)",id:"cluster-management-group-cmg",level:3},{value:"MetaStorage",id:"metastorage",level:3},{value:"Placement Driver",id:"placement-driver",level:3},{value:"RAFT Replication",id:"raft-replication",level:2},{value:"Partition RAFT Groups",id:"partition-raft-groups",level:3},{value:"Transaction Processing",id:"transaction-processing",level:2},{value:"Transaction Coordination",id:"transaction-coordination",level:3},{value:"Concurrency Control",id:"concurrency-control",level:3},{value:"Query Execution",id:"query-execution",level:2},{value:"SQL Processing Pipeline",id:"sql-processing-pipeline",level:3},{value:"Fragment Distribution",id:"fragment-distribution",level:3},{value:"Request Flow",id:"request-flow",level:2},{value:"Component Initialization Order",id:"component-initialization-order",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.header,{children:(0,i.jsx)(r.h1,{id:"architecture-overview",children:"Architecture Overview"})}),"\n",(0,i.jsxs)(r.p,{children:["Apache Ignite 3 is a distributed database built on a modular component architecture. Each node runs the same set of services, enabling any node to handle client requests and participate in data storage. This document provides a deeper look at the system architecture introduced in ",(0,i.jsx)(r.a,{href:"../core-concepts/what-is-ignite",children:"What is Apache Ignite 3?"}),"."]}),"\n",(0,i.jsx)(r.h2,{id:"system-architecture",children:"System Architecture"}),"\n",(0,i.jsx)(r.mermaid,{value:'flowchart TB\r\n subgraph "Client Layer"\r\n TC[Thin Clients
                                                              Java, .NET, C++]\r\n JDBC[JDBC/ODBC]\r\n REST[REST API]\r\n end\r\n\r\n subgraph "Node Architecture"\r\n subgraph "Request Processing"\r\n CH[Client Handler]\r\n SQL[SQL Query Processor
                                                              Calcite-based]\r\n TXM[Transaction Manager]\r\n end\r\n\r\n subgraph "Cluster Coordination"\r\n CMG[Cluster Management Group]\r\n MS[MetaStorage]\r\n PD[Placement Driver]\r\n end\r\n\r\n subgraph "Data Management"\r\n RM[Replica Manager]\r\n TM[Table Manager]\r\n DZM[Distribution Zone Manager]\r\n end\r\n\r\n subgraph "Storage"\r\n SE[Storage Engines
                                                              aimem, aipersist, rocksdb]\r\n RAFT[RAFT Groups
                                                              per partition]\r\n end\r\n end\r\n\r\n TC & JDBC & REST --\x3e CH\r\n CH --\x3e SQL\r\n SQL --\x3e TXM\r\n TXM --\x3e PD\r\n PD --\x3e RM\r\n RM --\x3e RAFT\r\n RAFT --\x3e SE\r\n CMG --\x3e MS\r\n MS --\x3e PD'}),"\n",(0,i.jsx)(r.h2,{id:"node-components",children:"Node Components"}),"\n",(0,i.jsx)(r.p,{children:'Every Ignite node runs the same component set. There is no distinction between "server" and "coordinator" nodes at the software level. Node roles emerge from RAFT group membership and placement driver lease assignments.'}),"\n",(0,i.jsx)(r.h3,{id:"core-services",children:"Core Services"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Component"}),(0,i.jsx)(r.th,{children:"Responsibility"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Cluster Service"})}),(0,i.jsx)(r.td,{children:"Network communication, node discovery, message routing"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Vault Manager"})}),(0,i.jsx)(r.td,{children:"Local persistent storage for node-specific data"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Hybrid Clock"})}),(0,i.jsx)(r.td,{children:"Distributed timestamp generation for MVCC"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Failure Manager"})}),(0,i.jsx)(r.td,{children:"Node failure detection and handling"})]})]})]}),"\n",(0,i.jsx)(r.h3,{id:"cluster-coordination",children:"Cluster Coordination"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Component"}),(0,i.jsx)(r.th,{children:"Responsibility"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Cluster Management Group (CMG)"})}),(0,i.jsx)(r.td,{children:"Cluster initialization, node admission, logical topology"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"MetaStorage"})}),(0,i.jsx)(r.td,{children:"Distributed metadata (schemas, configurations, leases)"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Placement Driver"})}),(0,i.jsx)(r.td,{children:"Primary replica selection via time-bounded leases"})]})]})]}),"\n",(0,i.jsx)(r.h3,{id:"data-management",children:"Data Management"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Component"}),(0,i.jsx)(r.th,{children:"Responsibility"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Table Manager"})}),(0,i.jsx)(r.td,{children:"Table lifecycle and distributed operations"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Replica Manager"})}),(0,i.jsx)(r.td,{children:"Partition replica lifecycle and request routing"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Distribution Zone Manager"})}),(0,i.jsx)(r.td,{children:"Data placement policies and partition assignments"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Index Manager"})}),(0,i.jsx)(r.td,{children:"Index creation, maintenance, and async building"})]})]})]}),"\n",(0,i.jsx)(r.h3,{id:"query-and-transaction-processing",children:"Query and Transaction Processing"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Component"}),(0,i.jsx)(r.th,{children:"Responsibility"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"SQL Query Processor"})}),(0,i.jsx)(r.td,{children:"Query parsing, optimization, distributed execution"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Transaction Manager"})}),(0,i.jsx)(r.td,{children:"ACID transaction coordination, 2PC protocol"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Compute Component"})}),(0,i.jsx)(r.td,{children:"Distributed job execution"})]})]})]}),"\n",(0,i.jsx)(r.h2,{id:"cluster-coordination-1",children:"Cluster Coordination"}),"\n",(0,i.jsx)(r.h3,{id:"cluster-management-group-cmg",children:"Cluster Management Group (CMG)"}),"\n",(0,i.jsx)(r.p,{children:"The CMG is a dedicated RAFT group responsible for cluster-wide coordination:"}),"\n",(0,i.jsx)(r.mermaid,{value:'flowchart TB\r\n subgraph "CMG RAFT Group"\r\n L[Leader Node]\r\n V1[Voting Node]\r\n V2[Voting Node]\r\n LN1[Learner Node]\r\n LN2[Learner Node]\r\n end\r\n\r\n subgraph "Responsibilities"\r\n INIT[Cluster Initialization]\r\n JOIN[Node Join Validation]\r\n TOPO[Logical Topology]\r\n STATE[Cluster State Storage]\r\n end\r\n\r\n L <--\x3e V1 & V2\r\n L --\x3e LN1 & LN2\r\n L --\x3e INIT & JOIN & TOPO & STATE'}),"\n",(0,i.jsx)(r.p,{children:"CMG membership is established during cluster initialization. Typically 3 to 5 nodes are selected as voting members; remaining nodes participate as learners. The CMG validates new nodes before admitting them to the cluster."}),"\n",(0,i.jsx)(r.h3,{id:"metastorage",children:"MetaStorage"}),"\n",(0,i.jsx)(r.p,{children:"MetaStorage is a distributed key-value store replicated across all nodes via RAFT:"}),"\n",(0,i.jsx)(r.mermaid,{value:'flowchart LR\r\n subgraph "MetaStorage Contents"\r\n CAT[System Catalog
                                                              tables, indexes]\r\n CFG[Configuration
                                                              zones, profiles]\r\n LEASE[Placement Leases
                                                              primary assignments]\r\n DEPLOY[Deployment Units
                                                              compute code]\r\n end\r\n\r\n subgraph "Replication"\r\n LEAD[Leader
                                                              handles writes]\r\n VOTE[Voting Nodes
                                                              3-5 nodes]\r\n LEARN[Learner Nodes
                                                              remaining nodes]\r\n end\r\n\r\n CAT & CFG & LEASE & DEPLOY --\x3e LEAD\r\n LEAD --\x3e VOTE --\x3e LEARN'}),"\n",(0,i.jsx)(r.p,{children:"All cluster metadata changes flow through MetaStorage. Nodes maintain local replicas and receive updates via RAFT log replication. The watch mechanism enables real-time notification of metadata changes."}),"\n",(0,i.jsx)(r.h3,{id:"placement-driver",children:"Placement Driver"}),"\n",(0,i.jsx)(r.p,{children:"The Placement Driver manages primary replica selection through time-bounded leases:"}),"\n",(0,i.jsx)(r.mermaid,{value:"sequenceDiagram\r\n participant PD as Placement Driver\r\n participant MS as MetaStorage\r\n participant P1 as Primary Replica\r\n participant P2 as Backup Replica\r\n\r\n Note over PD: Lease Negotiation\r\n PD->>MS: Store Lease (partition, node, expiry)\r\n MS--\x3e>P1: Lease Notification\r\n P1->>P1: Accept Primary Role\r\n\r\n Note over PD: Lease Renewal (every 2.5s for 5s lease)\r\n loop Every renewal interval\r\n PD->>MS: Extend Lease\r\n MS--\x3e>P1: Renewed\r\n end\r\n\r\n Note over PD: Failover (lease expires)\r\n PD->>MS: Grant New Lease to P2\r\n MS--\x3e>P2: Lease Notification\r\n P2->>P2: Accept Primary Role"}),"\n",(0,i.jsx)(r.p,{children:"Lease properties:"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Duration"}),": Configurable, default 5 seconds"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Renewal"}),": Automatic, every half of expiration interval"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Selection priority"}),": Current holder, then RAFT leader, then stable assignments"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Persistence"}),": Stored in MetaStorage for cluster-wide visibility"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"raft-replication",children:"RAFT Replication"}),"\n",(0,i.jsx)(r.p,{children:"Apache Ignite 3 uses multiple RAFT groups for different purposes:"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"RAFT Group"}),(0,i.jsx)(r.th,{children:"Purpose"}),(0,i.jsx)(r.th,{children:"Members"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"CMG"})}),(0,i.jsx)(r.td,{children:"Cluster management"}),(0,i.jsx)(r.td,{children:"3-5 voting nodes"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"MetaStorage"})}),(0,i.jsx)(r.td,{children:"Cluster metadata"}),(0,i.jsx)(r.td,{children:"3-5 voting + learner nodes"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Placement Driver"})}),(0,i.jsx)(r.td,{children:"Lease management"}),(0,i.jsx)(r.td,{children:"Placement driver nodes"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Partition Groups"})}),(0,i.jsx)(r.td,{children:"Data replication"}),(0,i.jsx)(r.td,{children:"Nodes in partition assignments"})]})]})]}),"\n",(0,i.jsx)(r.h3,{id:"partition-raft-groups",children:"Partition RAFT Groups"}),"\n",(0,i.jsx)(r.p,{children:"Each table partition forms its own RAFT group:"}),"\n",(0,i.jsx)(r.mermaid,{value:'flowchart TB\r\n subgraph "Table: orders (Zone: financial, 25 partitions)"\r\n subgraph "Partition 0"\r\n P0L[Leader
                                                              Node 1]\r\n P0F1[Follower
                                                              Node 2]\r\n P0F2[Follower
                                                              Node 3]\r\n end\r\n subgraph "Partition 1"\r\n P1L[Leader
                                                              Node 2]\r\n P1F1[Follower
                                                              Node 1]\r\n P1F2[Follower
                                                              Node 3]\r\n end\r\n subgraph "Partition N..."\r\n PNL[Leader]\r\n PNF1[Follower]\r\n PNF2[Follower]\r\n end\r\n end\r\n\r\n P0L <--\x3e P0F1 & P0F2\r\n P1L <--\x3e P1F1 & P1F2'}),"\n",(0,i.jsx)(r.p,{children:"Partition RAFT groups provide:"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Write linearization"}),": All writes go through the leader"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Replication"}),": Log entries replicated to followers"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Automatic failover"}),": New leader elected on failure"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"State machine"}),": Multi-version storage with B+ trees"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"transaction-processing",children:"Transaction Processing"}),"\n",(0,i.jsx)(r.h3,{id:"transaction-coordination",children:"Transaction Coordination"}),"\n",(0,i.jsx)(r.p,{children:"The Transaction Manager coordinates distributed transactions using two-phase commit:"}),"\n",(0,i.jsx)(r.mermaid,{value:"sequenceDiagram\r\n participant C as Client\r\n participant TM as Transaction Manager\r\n participant PD as Placement Driver\r\n participant P1 as Partition 1 Primary\r\n participant P2 as Partition 2 Primary\r\n\r\n C->>TM: BEGIN TRANSACTION\r\n TM->>TM: Create TX Context\r\n\r\n C->>TM: UPDATE table1 SET ...\r\n TM->>PD: Locate Primary (partition 1)\r\n PD--\x3e>TM: Node 1\r\n TM->>P1: Enlist + Execute\r\n P1--\x3e>TM: Enlisted\r\n\r\n C->>TM: UPDATE table2 SET ...\r\n TM->>PD: Locate Primary (partition 2)\r\n PD--\x3e>TM: Node 2\r\n TM->>P2: Enlist + Execute\r\n P2--\x3e>TM: Enlisted\r\n\r\n C->>TM: COMMIT\r\n TM->>P1: PREPARE\r\n TM->>P2: PREPARE\r\n P1--\x3e>TM: PREPARED\r\n P2--\x3e>TM: PREPARED\r\n TM->>P1: COMMIT\r\n TM->>P2: COMMIT\r\n P1--\x3e>TM: COMMITTED\r\n P2--\x3e>TM: COMMITTED\r\n TM--\x3e>C: COMMIT SUCCESS"}),"\n",(0,i.jsx)(r.h3,{id:"concurrency-control",children:"Concurrency Control"}),"\n",(0,i.jsx)(r.p,{children:"Apache Ignite 3 uses a hybrid concurrency control model:"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Transaction Type"}),(0,i.jsx)(r.th,{children:"Concurrency Control"}),(0,i.jsx)(r.th,{children:"Isolation"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Read-Write"})}),(0,i.jsx)(r.td,{children:"Lock-based with MVCC"}),(0,i.jsx)(r.td,{children:"Serializable"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:(0,i.jsx)(r.strong,{children:"Read-Only"})}),(0,i.jsx)(r.td,{children:"Timestamp-based snapshot"}),(0,i.jsx)(r.td,{children:"Snapshot"})]})]})]}),"\n",(0,i.jsx)(r.p,{children:"Read-write transactions acquire locks through the primary replica. Read-only transactions use timestamp-based reads against MVCC version chains without acquiring locks."}),"\n",(0,i.jsx)(r.h2,{id:"query-execution",children:"Query Execution"}),"\n",(0,i.jsx)(r.h3,{id:"sql-processing-pipeline",children:"SQL Processing Pipeline"}),"\n",(0,i.jsx)(r.mermaid,{value:'flowchart LR\r\n subgraph "Query Processing"\r\n SQL[SQL Text] --\x3e PARSE[Parser]\r\n PARSE --\x3e AST[AST]\r\n AST --\x3e VAL[Validator]\r\n VAL --\x3e OPT[Optimizer
                                                              Calcite]\r\n OPT --\x3e PHYS[Physical Plan]\r\n PHYS --\x3e MAP[Mapper]\r\n MAP --\x3e FRAG[Fragments]\r\n end\r\n\r\n subgraph "Distributed Execution"\r\n FRAG --\x3e N1[Node 1
                                                              Fragment A]\r\n FRAG --\x3e N2[Node 2
                                                              Fragment B]\r\n FRAG --\x3e N3[Node 3
                                                              Fragment C]\r\n N1 & N2 & N3 --\x3e AGG[Aggregation]\r\n AGG --\x3e RES[Result]\r\n end'}),"\n",(0,i.jsx)(r.p,{children:"The SQL engine is built on Apache Calcite and executes queries in stages:"}),"\n",(0,i.jsxs)(r.ol,{children:["\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Parsing"}),": SQL text converted to abstract syntax tree"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Validation"}),": Semantic validation against the system catalog"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Optimization"}),": Cost-based optimization using Calcite rules"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Physical Planning"}),": Conversion to physical operators (IgniteRel)"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Mapping"}),": Plan fragments assigned to cluster nodes"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Execution"}),": Distributed execution with inter-node data exchange"]}),"\n"]}),"\n",(0,i.jsx)(r.h3,{id:"fragment-distribution",children:"Fragment Distribution"}),"\n",(0,i.jsx)(r.p,{children:"Query plans are split into fragments that execute on different nodes:"}),"\n",(0,i.jsx)(r.mermaid,{value:'flowchart TB\r\n subgraph "Fragment 0 (Coordinator)"\r\n ROOT[Project]\r\n JOIN[HashJoin]\r\n R1[Receiver]\r\n R2[Receiver]\r\n end\r\n\r\n subgraph "Fragment 1 (Node 1, 2, 3)"\r\n S1[Sender]\r\n TS1[TableScan: orders]\r\n end\r\n\r\n subgraph "Fragment 2 (Node 1, 2, 3)"\r\n S2[Sender]\r\n TS2[TableScan: customers]\r\n end\r\n\r\n ROOT --\x3e JOIN\r\n JOIN --\x3e R1 --\x3e S1 --\x3e TS1\r\n JOIN --\x3e R2 --\x3e S2 --\x3e TS2'}),"\n",(0,i.jsx)(r.p,{children:"Exchange operators (Sender/Receiver) handle data movement between fragments. Colocation optimization reduces exchanges when joined data resides on the same nodes."}),"\n",(0,i.jsx)(r.h2,{id:"request-flow",children:"Request Flow"}),"\n",(0,i.jsx)(r.p,{children:"A typical SQL query flows through these components:"}),"\n",(0,i.jsx)(r.mermaid,{value:"sequenceDiagram\r\n participant C as Client\r\n participant CH as Client Handler\r\n participant SQL as SQL Processor\r\n participant TM as TX Manager\r\n participant PD as Placement Driver\r\n participant RM as Replica Manager\r\n participant SE as Storage Engine\r\n\r\n C->>CH: SQL Query\r\n CH->>SQL: Parse + Plan\r\n SQL->>TM: Create TX Context\r\n TM->>PD: Locate Primaries\r\n PD--\x3e>TM: Lease Info\r\n\r\n loop For each partition\r\n TM->>RM: Route to Primary\r\n RM->>SE: Execute on Storage\r\n SE--\x3e>RM: Results\r\n RM--\x3e>TM: Partition Results\r\n end\r\n\r\n TM--\x3e>SQL: Aggregated Results\r\n SQL--\x3e>CH: Query Response\r\n CH--\x3e>C: Response"}),"\n",(0,i.jsx)(r.h2,{id:"component-initialization-order",children:"Component Initialization Order"}),"\n",(0,i.jsx)(r.p,{children:"Components start in dependency order:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{children:"VaultManager \u2192 ClusterService \u2192 CMG \u2192 MetaStorage \u2192 PlacementDriver \u2192\r\nReplicaManager \u2192 TxManager \u2192 TableManager \u2192 SqlQueryProcessor\n"})}),"\n",(0,i.jsx)(r.p,{children:"This ordering ensures each component's dependencies are available before it starts."}),"\n",(0,i.jsx)(r.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.a,{href:"./storage-architecture",children:"Storage Architecture"})," for storage layer details"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.a,{href:"../core-concepts/data-partitioning",children:"Data Partitioning"})," for partition distribution and replication"]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.a,{href:"../core-concepts/transactions-and-mvcc",children:"Transactions and MVCC"})," for transaction processing details"]}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/2e631686.c2a58dfc.js b/docs/ignite3/assets/js/2e631686.c2a58dfc.js deleted file mode 100644 index 29bcae19e4..0000000000 --- a/docs/ignite3/assets/js/2e631686.c2a58dfc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4766],{11470:(e,r,t)=>{t.d(r,{A:()=>j});var a=t(96540),n=t(34164),s=t(17559),i=t(23104),l=t(56347),o=t(205),c=t(57485),u=t(31682),d=t(70679);function m(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:r}=e;return!!r&&"object"==typeof r&&"value"in r}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:r,children:t}=e;return(0,a.useMemo)(()=>{const e=r??function(e){return m(e).map(({props:{value:e,label:r,attributes:t,default:a}})=>({value:e,label:r,attributes:t,default:a}))}(t);return function(e){const r=(0,u.XI)(e,(e,r)=>e.value===r.value);if(r.length>0)throw new Error(`Docusaurus error: Duplicate values "${r.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[r,t])}function h({value:e,tabValues:r}){return r.some(r=>r.value===e)}function g({queryString:e=!1,groupId:r}){const t=(0,l.W6)(),n=function({queryString:e=!1,groupId:r}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:e,groupId:r});return[(0,c.aZ)(n),(0,a.useCallback)(e=>{if(!n)return;const r=new URLSearchParams(t.location.search);r.set(n,e),t.replace({...t.location,search:r.toString()})},[n,t])]}function b(e){const{defaultValue:r,queryString:t=!1,groupId:n}=e,s=p(e),[i,l]=(0,a.useState)(()=>function({defaultValue:e,tabValues:r}){if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!h({value:e,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${r.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=r.find(e=>e.default)??r[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:r,tabValues:s})),[c,u]=g({queryString:t,groupId:n}),[m,b]=function({groupId:e}){const r=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,n]=(0,d.Dv)(r);return[t,(0,a.useCallback)(e=>{r&&n.set(e)},[r,n])]}({groupId:n}),v=(()=>{const e=c??m;return h({value:e,tabValues:s})?e:null})();(0,o.A)(()=>{v&&l(v)},[v]);return{selectedValue:i,selectValue:(0,a.useCallback)(e=>{if(!h({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),u(e),b(e)},[u,b,s]),tabValues:s}}var v=t(92303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=t(74848);function T({className:e,block:r,selectedValue:t,selectValue:a,tabValues:s}){const l=[],{blockElementScrollPositionUntilNextRender:o}=(0,i.a_)(),c=e=>{const r=e.currentTarget,n=l.indexOf(r),i=s[n].value;i!==t&&(o(r),a(i))},u=e=>{let r=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;r=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;r=l[t]??l[l.length-1];break}}r?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,n.A)("tabs",{"tabs--block":r},e),children:s.map(({value:e,label:r,attributes:a})=>(0,y.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{l.push(e)},onKeyDown:u,onClick:c,...a,className:(0,n.A)("tabs__item",x.tabItem,a?.className,{"tabs__item--active":t===e}),children:r??e},e))})}function I({lazy:e,children:r,selectedValue:t}){const s=(Array.isArray(r)?r:[r]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===t);return e?(0,a.cloneElement)(e,{className:(0,n.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:s.map((e,r)=>(0,a.cloneElement)(e,{key:r,hidden:e.props.value!==t}))})}function f(e){const r=b(e);return(0,y.jsxs)("div",{className:(0,n.A)(s.G.tabs.container,"tabs-container",x.tabList),children:[(0,y.jsx)(T,{...r,...e}),(0,y.jsx)(I,{...r,...e})]})}function j(e){const r=(0,v.A)();return(0,y.jsx)(f,{...e,children:m(e.children)},String(r))}},19365:(e,r,t)=>{t.d(r,{A:()=>i});t(96540);var a=t(34164);const n={tabItem:"tabItem_Ymn6"};var s=t(74848);function i({children:e,hidden:r,className:t}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,a.A)(n.tabItem,t),hidden:r,children:e})}},28453:(e,r,t)=>{t.d(r,{R:()=>i,x:()=>l});var a=t(96540);const n={},s=a.createContext(n);function i(e){const r=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),a.createElement(s.Provider,{value:r},e.children)}},59464:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>c,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"developers-guide/data-streamer","title":"Streaming Data","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/data-streamer.md","sourceDirName":"developers-guide","slug":"/developers-guide/data-streamer","permalink":"/docs/ignite3/3.0.0/developers-guide/data-streamer","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Streaming Data","sidebar_label":"Streaming Data"},"sidebar":"tutorialSidebar","previous":{"title":"Performing Transactions","permalink":"/docs/ignite3/3.0.0/developers-guide/transactions"},"next":{"title":"Code Deployment","permalink":"/docs/ignite3/3.0.0/developers-guide/code-deployment/"}}');var n=t(74848),s=t(28453),i=t(11470),l=t(19365);const o={title:"Streaming Data",sidebar_label:"Streaming Data"},c=void 0,u={},d=[{value:"Using Data Streamer API",id:"using-data-streamer-api",level:2},{value:"Configuring Data Streamer",id:"configuring-data-streamer",level:3},{value:"Streaming Data",id:"streaming-data",level:3},{value:"Streaming with Receiver",id:"streaming-with-receiver",level:3},{value:"Examples",id:"examples",level:3},{value:"Updating Multiple Tables",id:"updating-multiple-tables",level:4},{value:"Distributed Computations",id:"distributed-computations",level:4},{value:"Custom Marshallers in .NET",id:"custom-marshallers-in-net",level:4},{value:"Tracking Failed Entries",id:"tracking-failed-entries",level:2},{value:"Tuning Memory Usage",id:"tuning-memory-usage",level:3}];function m(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:["\n","\n",(0,n.jsx)(r.p,{children:"Data streaming provides a fast, efficient method for loading, organizing, and distributing large volumes of data across your cluster.\r\nData streamer accepts a stream of data and distributes data entries across the cluster, where the processing takes place. Data streaming is available in all table views."}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsx)(r.img,{alt:"Data streaming diagram",src:t(73381).A+"",width:"1278",height:"673"})}),"\n",(0,n.jsx)(r.p,{children:"Data streaming provides at-least-once delivery guarantee."}),"\n",(0,n.jsx)(r.h2,{id:"using-data-streamer-api",children:"Using Data Streamer API"}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(r.a,{href:"https://ignite.apache.org/releases/3.0.0/javadoc/org/apache/ignite/table/DataStreamerTarget.html",children:"Data Streamer API"})," lets you load large amounts of data into your cluster quickly and reliably using a publisher\u2013subscriber model, where you create a publisher that streams your data entries to a table view, and the system distributes these entries across the cluster. You can configure how the data is processed via a ",(0,n.jsx)(r.code,{children:"DataStreamerOptions"})," object that allows to set batch sizes, auto-flush intervals, retry limits."]}),"\n",(0,n.jsx)(r.h3,{id:"configuring-data-streamer",children:"Configuring Data Streamer"}),"\n",(0,n.jsxs)(r.p,{children:[(0,n.jsx)(r.code,{children:"DataStreamerOptions"})," lets you fine-tune how data is streamed into your cluster by setting parameters for batching, retries, parallelism, and auto-flush timing:"]}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:"DataStreamerOptions options = DataStreamerOptions.builder()\r\n.pageSize(1000)\r\n.perPartitionParallelOperations(1)\r\n.autoFlushInterval(1000)\r\n.retryLimit(16)\r\n.build();\n"})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:"var options = new DataStreamerOptions\r\n{\r\n PageSize = 1000,\r\n RetryLimit = 8,\r\n AutoFlushInterval = TimeSpan.FromSeconds(3)\r\n};\n"})})})]}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"pageSize"}),": Specifies the number of entries to process in each page or chunk of data."]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"perPartitionParallelOperations"}),": Determines the number of parallel operations allowed on each partition."]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"autoFlushInterval"}),": Defines the time interval (in milliseconds) after which the system automatically flushes any incomplete buffers."]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"retryLimit"}),": Specifies the maximum number of retry attempts for a failed data submission before giving up."]}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"streaming-data",children:"Streaming Data"}),"\n",(0,n.jsxs)(r.p,{children:["Before data is streamed to the cluster, each entry must be wrapped in an instance of the ",(0,n.jsx)(r.code,{children:"DataStreamerItem"})," class. This wrapper allows you to perform ",(0,n.jsx)(r.code,{children:"PUT"})," and ",(0,n.jsx)(r.code,{children:"REMOVE"})," operations with data:"]}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["Use ",(0,n.jsx)(r.code,{children:"DataStreamerItem.of(entry)"})," to insert new entries into the table."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["Use ",(0,n.jsx)(r.code,{children:"DataStreamerItem.removed(entry)"})," to delete existing ones."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(r.p,{children:"Wrapped data then can be passed to a publisher and streamed to the table."}),"\n",(0,n.jsxs)(r.p,{children:["The example below demonstrates how to use ",(0,n.jsx)(r.a,{href:"/docs/ignite3/3.0.0/developers-guide/table-api#record-view",children:(0,n.jsx)(r.code,{children:"RecordView"})}),", create a publisher, configure the data streamer, insert account records into the existing ",(0,n.jsx)(r.code,{children:"accounts"})," table and then delete them:"]}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'public class RecordViewPojoDataStreamerExample {\r\n private static final int ACCOUNTS_COUNT = 1000;\r\n\r\n public static void main(String[] args) throws Exception {\r\n /**\r\n * Assuming the \'accounts\' table already exists.\r\n */\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()) {\r\n RecordView view = client.tables().table("accounts").recordView(Account.class);\r\n\r\n streamAccountDataPut(view);\r\n streamAccountDataRemove(view);\r\n }\r\n }\r\n\r\n /**\r\n * Streaming data using DataStreamerOperationType#PUT operation type.\r\n */\r\n private static void streamAccountDataPut(RecordView view) {\r\n DataStreamerOptions options = DataStreamerOptions.builder()\r\n .pageSize(1000)\r\n .perPartitionParallelOperations(1)\r\n .autoFlushInterval(1000)\r\n .retryLimit(16)\r\n .build();\r\n\r\n CompletableFuture streamerFut;\r\n try (var publisher = new SubmissionPublisher>()) {\r\n streamerFut = view.streamData(publisher, options);\r\n ThreadLocalRandom rnd = ThreadLocalRandom.current();\r\n for (int i = 0; i < ACCOUNTS_COUNT; i++) {\r\n Account entry = new Account(i, "name" + i, rnd.nextLong(100_000), rnd.nextBoolean());\r\n publisher.submit(DataStreamerItem.of(entry));\r\n }\r\n }\r\n streamerFut.join();\r\n }\r\n\r\n /**\r\n * Streaming data using DataStreamerOperationType#REMOVE operation type\r\n */\r\n private static void streamAccountDataRemove(RecordView view) {\r\n DataStreamerOptions options = DataStreamerOptions.builder()\r\n .pageSize(1000)\r\n .perPartitionParallelOperations(1)\r\n .autoFlushInterval(1000)\r\n .retryLimit(16)\r\n .build();\r\n\r\n CompletableFuture streamerFut;\r\n try (var publisher = new SubmissionPublisher>()) {\r\n streamerFut = view.streamData(publisher, options);\r\n for (int i = 0; i < ACCOUNTS_COUNT; i++) {\r\n Account entry = new Account(i);\r\n publisher.submit(DataStreamerItem.removed(entry));\r\n }\r\n }\r\n streamerFut.join();\r\n }\r\n}\n'})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:'using Apache.Ignite;\r\nusing Apache.Ignite.Table;\r\n\r\nusing var client = await IgniteClient.StartAsync(new("localhost"));\r\nITable? table = await client.Tables.GetTableAsync("accounts");\r\nIRecordView view = table!.GetRecordView();\r\n\r\nvar options = new DataStreamerOptions\r\n{\r\n PageSize = 10_000,\r\n AutoFlushInterval = TimeSpan.FromSeconds(1),\r\n RetryLimit = 32\r\n};\r\n\r\nawait view.StreamDataAsync(GetAccountsToAdd(5_000), options);\r\nawait view.StreamDataAsync(GetAccountsToRemove(1_000), options);\r\n\r\nasync IAsyncEnumerable> GetAccountsToAdd(int count)\r\n{\r\n for (int i = 0; i < count; i++)\r\n {\r\n yield return DataStreamerItem.Create(\r\n new Account(i, $"Account {i}"));\r\n }\r\n}\r\n\r\nasync IAsyncEnumerable> GetAccountsToRemove(int count)\r\n{\r\n for (int i = 0; i < count; i++)\r\n {\r\n yield return DataStreamerItem.Create(\r\n new Account(i, string.Empty), DataStreamerOperationType.Remove);\r\n }\r\n}\r\n\r\npublic record Account(int Id, string Name);\n'})})})]}),"\n",(0,n.jsx)(r.h3,{id:"streaming-with-receiver",children:"Streaming with Receiver"}),"\n",(0,n.jsx)(r.p,{children:"The Apache Ignite 3 streaming API supports advanced streaming scenarios by allowing you to create a custom receiver that defines server-side processing logic. Use a receiver when you need to process or transform data on the server, update multiple tables from a single data stream, or work with incoming data that does not match a table schema."}),"\n",(0,n.jsxs)(r.p,{children:["With a receiver, you can stream data in any format, as it is schema-agnostic.\r\nThe receiver also has access to the full Ignite 3 API through the ",(0,n.jsx)(r.a,{href:"https://ignite.apache.org/releases/3.0.0/javadoc/org/apache/ignite/table/DataStreamerReceiverContext.html",children:(0,n.jsx)(r.code,{children:"DataStreamerReceiverContext"})}),"."]}),"\n",(0,n.jsxs)(r.p,{children:["The data streamer controls data flow by requesting items only when partition buffers have space. ",(0,n.jsx)(r.code,{children:"DataStreamerOptions.perPartitionParallelOperations"})," controls how many buffers can be allocated per partition. When buffers are full, the streamer stops requesting more data until some items are processed.\r\nAdditionally, if a ",(0,n.jsx)(r.code,{children:"resultSubscriber"})," is specified, it also applies backpressure on the streamer. If the subscriber is slow at consuming results, the streamer reduces its request rate from the publisher accordingly."]}),"\n",(0,n.jsxs)(r.p,{children:["To use a receiver, you need to implement the ",(0,n.jsx)(r.a,{href:"https://ignite.apache.org/releases/3.0.0/javadoc/org/apache/ignite/table/DataStreamerReceiver.html",children:(0,n.jsx)(r.code,{children:"DataStreamerReceiver"})})," interface. The receiver's ",(0,n.jsx)(r.code,{children:"receive"})," method processes each batch of items streamed to the server, so you can apply custom logic and return results for each item as needed:"]}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:"@Nullable CompletableFuture> receive(\r\nList page,\r\nDataStreamerReceiverContext ctx,\r\n@Nullable A arg);\r\n\n"})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:"ValueTask?> ReceiveAsync(\r\nIList page,\r\nTArg arg,\r\nIDataStreamerReceiverContext context,\r\nCancellationToken cancellationToken);\n"})})})]}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"page"}),": The current batch of data items to process."]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"ctx"}),": The receiver context, which lets you interact with Ignite 3 API."]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"arg"}),": An optional argument that can be used to pass custom parameters to your receiver logic."]}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"examples",children:"Examples"}),"\n",(0,n.jsx)(r.h4,{id:"updating-multiple-tables",children:"Updating Multiple Tables"}),"\n",(0,n.jsx)(r.p,{children:"The following example demonstrates how to implement a receiver that processes data containing customer and address information, and updates two separate tables on the server:"}),"\n",(0,n.jsxs)(r.ol,{children:["\n",(0,n.jsxs)(r.li,{children:["First, create the custom receiver that will extract data from the provided source and write it into two separate tables: ",(0,n.jsx)(r.code,{children:"customers"})," and ",(0,n.jsx)(r.code,{children:"addresses"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'private static class TwoTableReceiver implements DataStreamerReceiver {\r\n@Override\r\npublic @Nullable CompletableFuture> receive(List page, DataStreamerReceiverContext ctx, @Nullable Void arg) {\r\n// List is the source data. Those tuples do not conform to any table and can have arbitrary data.\r\n\r\n RecordView customersTable = ctx.ignite().tables().table("customers").recordView();\r\n RecordView addressesTable = ctx.ignite().tables().table("addresses").recordView();\r\n\r\n for (Tuple sourceItem : page) {\r\n // For each source item, receiver extracts customer and address data and upserts it into respective tables.\r\n Tuple customer = Tuple.create()\r\n .set("id", sourceItem.intValue("customerId"))\r\n .set("name", sourceItem.stringValue("customerName"))\r\n .set("addressId", sourceItem.intValue("addressId"));\r\n\r\n Tuple address = Tuple.create()\r\n .set("id", sourceItem.intValue("addressId"))\r\n .set("street", sourceItem.stringValue("street"))\r\n .set("city", sourceItem.stringValue("city"));\r\n\r\n customersTable.upsert(null, customer);\r\n addressesTable.upsert(null, address);\r\n }\r\n\r\n return null;\r\n }\r\n }\n'})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:'class TwoTableReceiver : IDataStreamerReceiver\r\n{\r\n public async ValueTask?> ReceiveAsync(\r\n IList page,\r\n object? arg,\r\n IDataStreamerReceiverContext context,\r\n CancellationToken cancellationToken)\r\n {\r\n IRecordView customerTable = (await context.Ignite.Tables.GetTableAsync("customers"))!.RecordBinaryView;\r\n IRecordView addressesTable = (await context.Ignite.Tables.GetTableAsync("addresses"))!.RecordBinaryView;\r\n\r\n foreach (IIgniteTuple sourceItem in page)\r\n {\r\n // For each source item, the receiver extracts customer and address data and upserts it into respective tables.\r\n var customer = new IgniteTuple\r\n {\r\n ["id"] = sourceItem["customerId"],\r\n ["name"] = sourceItem["customerName"],\r\n ["addressId"] = sourceItem["addressId"]\r\n };\r\n\r\n var address = new IgniteTuple\r\n {\r\n ["id"] = sourceItem["addressId"],\r\n ["street"] = sourceItem["street"],\r\n ["city"] = sourceItem["city"],\r\n };\r\n\r\n await customerTable.UpsertAsync(null, customer);\r\n await addressesTable.UpsertAsync(null, address);\r\n }\r\n\r\n return null;\r\n }\r\n}\n'})})})]}),"\n",(0,n.jsxs)(r.ol,{start:"2",children:["\n",(0,n.jsxs)(r.li,{children:["Create a descriptor that refers to your receiver implementation. This descriptor will be passed later to a ",(0,n.jsx)(r.code,{children:"SubmissionPublisher"})," when streaming data."]}),"\n"]}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:"DataStreamerReceiverDescriptor desc = DataStreamerReceiverDescriptor\r\n.builder(TwoTableReceiver.class)\r\n.build();\n"})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:"ReceiverDescriptor desc = ReceiverDescriptor.Of(new TwoTableReceiver());\n"})})})]}),"\n",(0,n.jsxs)(r.ol,{start:"3",children:["\n",(0,n.jsxs)(r.li,{children:["Next, obtain the target table to partition the data for streaming. In this example we partition by ",(0,n.jsx)(r.code,{children:"customerId"})," to ensure the receiver is colocated with the customer data, enabling local upserts. Then define how to extract keys and payloads from the source, and stream the data using a ",(0,n.jsx)(r.code,{children:"SubmissionPublisher"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'// Example source data\r\nList sourceData = IntStream.range(1, 10)\r\n.mapToObj(i -> Tuple.create()\r\n.set("customerId", i)\r\n.set("customerName", "Customer " + i)\r\n.set("addressId", i)\r\n.set("street", "Street " + i)\r\n.set("city", "City " + i))\r\n.collect(Collectors.toList());\r\n\r\nCompletableFuture streamerFut;\r\n\r\nRecordView customersTable = client.tables().table("customers").recordView();\r\n\r\n// Extract the target table key from each source item; since the source has "customerId" but the target table uses "id", the function maps customerId to id accordingly.\r\nFunction keyFunc = sourceItem -> Tuple.create().set("id", sourceItem.intValue("customerId"));\r\n\r\n// Extract the data payload sent to the receiver. In this case, we use the entire source item as the payload.\r\nFunction payloadFunc = Function.identity();\r\n\r\n// Stream data using a publisher.\r\ntry (var publisher = new SubmissionPublisher()) {\r\n streamerFut = customersTable.streamData(\r\n publisher,\r\n desc,\r\n keyFunc,\r\n payloadFunc,\r\n null, // Optional receiver arguments\r\n null, // Result subscriber\r\n null // Options\r\n );\r\n\r\n for (Tuple item : sourceData) {\r\n publisher.submit(item);\r\n }\r\n}\r\n\r\nstreamerFut.join();\n'})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:'IAsyncEnumerable sourceData = GetSourceData();\r\n\r\nIRecordView customersTable = (await client.Tables.GetTableAsync("customers"))!.RecordBinaryView;\r\n\r\nIAsyncEnumerable streamerResults = customersTable.StreamDataAsync(\r\nsourceData,\r\ndesc,\r\nx => new IgniteTuple { ["id"] = x["customerId"] },\r\nx => x,\r\nnull,\r\nDataStreamerOptions.Default,\r\nCancellationToken.None);\r\n\r\nawait foreach (object result in streamerResults)\r\n{\r\n// ...\r\n}\r\n\r\nstatic async IAsyncEnumerable GetSourceData()\r\n{\r\nawait Task.Yield(); // Simulate async enumeration.\r\n\r\n for (int i = 0; i < 10; i++)\r\n {\r\n yield return new IgniteTuple\r\n {\r\n ["customerId"] = i,\r\n ["customerName"] = $"Customer {i}",\r\n ["addressId"] = i,\r\n ["street"] = $"Street {i}",\r\n ["city"] = $"City {i}"\r\n };\r\n }\r\n}\n'})})})]}),"\n",(0,n.jsx)(r.h4,{id:"distributed-computations",children:"Distributed Computations"}),"\n",(0,n.jsxs)(r.p,{children:["You can also use a streamer with a receiver to perform distributed computations, such as per-item calculations and ",(0,n.jsx)(r.a,{href:"/docs/ignite3/3.0.0/developers-guide/compute/#mapreduce-tasks",children:"map-reduce"})," tasks on the returned results."]}),"\n",(0,n.jsx)(r.p,{children:"This example demonstrates a simulated fraud detection process, which typically involves intensive processing of each transaction using ML models."}),"\n",(0,n.jsxs)(r.ol,{children:["\n",(0,n.jsx)(r.li,{children:"First, create a custom receiver that will handle fraud detection computations on the results:"}),"\n"]}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'private static class FraudDetectorReceiver implements DataStreamerReceiver {\r\n@Override\r\npublic @Nullable CompletableFuture> receive(List page, DataStreamerReceiverContext ctx, @Nullable Void arg) {\r\nList results = new ArrayList<>(page.size());\r\n\r\n for (Tuple tx : page) {\r\n results.add(detectFraud(tx));\r\n }\r\n\r\n return CompletableFuture.completedFuture(results);\r\n }\r\n\r\n private static Tuple detectFraud(Tuple txInfo) {\r\n // Simulate fraud detection processing.\r\n double fraudRisk = Math.random();\r\n\r\n // Add result to the tuple and return.\r\n return txInfo.set("fraudRisk", fraudRisk);\r\n }\r\n }\n'})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:'class FraudDetectorReceiver : IDataStreamerReceiver\r\n{\r\n public async ValueTask?> ReceiveAsync(\r\n IList page,\r\n object? arg,\r\n IDataStreamerReceiverContext context,\r\n CancellationToken cancellationToken)\r\n {\r\n var result = new List(page.Count);\r\n\r\n foreach (var tx in page)\r\n {\r\n IIgniteTuple resTuple = await DetectFraud(tx);\r\n result.Add(resTuple);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static async Task DetectFraud(IIgniteTuple transaction)\r\n {\r\n // Simulate fraud detection logic - add a random risk score to the tuple.\r\n await Task.Delay(10);\r\n transaction["fraudRisk"] = Random.Shared.NextDouble();\r\n return transaction;\r\n }\r\n}\n'})})})]}),"\n",(0,n.jsxs)(r.ol,{start:"2",children:["\n",(0,n.jsxs)(r.li,{children:["Next, stream a list of sample transactions across the cluster using a dummy table that partitions data by transaction ID and ",(0,n.jsx)(r.code,{children:"FraudDetectorReceiver"})," for fraud detection. Subscribe to the results to log each processed transaction, handle errors, and confirm when streaming completes:"]}),"\n"]}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'public void runReceiverStreamProcessing() {\r\n\r\n // Source data is a list of financial transactions.\r\n // We distribute this processing across the cluster, then gather and return results.\r\n List sourceData = IntStream.range(1, 10)\r\n .mapToObj(i -> Tuple.create()\r\n .set("txId", i)\r\n .set("txData", "{some-json-data}"))\r\n .collect(Collectors.toList());\r\n\r\n DataStreamerReceiverDescriptor desc = DataStreamerReceiverDescriptor\r\n .builder(FraudDetectorReceiver.class)\r\n .build();\r\n\r\n CompletableFuture streamerFut;\r\n\r\n // Streaming requires a target table to partition data.\r\n // Use a dummy table for this scenario, because we are not going to store any data.\r\n TableDefinition txDummyTableDef = TableDefinition.builder("tx_dummy")\r\n .columns(column("id", ColumnType.INTEGER))\r\n .primaryKey("id")\r\n .build();\r\n\r\n Table dummyTable = client.catalog().createTable(txDummyTableDef);\r\n\r\n // Source data has "txId" field, but target dummy table has "id" column, so keyFunc maps "txId" to "id".\r\n Function keyFunc = sourceItem -> Tuple.create().set("id", sourceItem.value("txId"));\r\n\r\n // Payload function is used to extract the payload (data that goes to the receiver) from the source item.\r\n // In our case, we want to use the whole source item as the payload.\r\n Function payloadFunc = Function.identity();\r\n\r\n Flow.Subscriber resultSubscriber = new Flow.Subscriber<>() {\r\n @Override\r\n public void onSubscribe(Flow.Subscription subscription) {\r\n subscription.request(Long.MAX_VALUE);\r\n }\r\n\r\n @Override\r\n public void onNext(Tuple item) {\r\n System.out.println("Transaction processed: " + item);\r\n }\r\n\r\n @Override\r\n public void onError(Throwable throwable) {\r\n System.err.println("Error during streaming: " + throwable.getMessage());\r\n }\r\n\r\n @Override\r\n public void onComplete() {\r\n System.out.println("Streaming completed.");\r\n }\r\n };\r\n\r\n try (var publisher = new SubmissionPublisher()) {\r\n streamerFut = dummyTable.recordView().streamData(\r\n publisher,\r\n desc,\r\n keyFunc,\r\n payloadFunc,\r\n null, // Arg\r\n resultSubscriber,\r\n null // Options\r\n );\r\n\r\n for (Tuple item : sourceData) {\r\n publisher.submit(item);\r\n }\r\n }\r\n\r\n streamerFut.join();\r\n }\n'})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:'// Source data is a list of financial transactions.\r\n// We want to distribute this processing across the cluster, then gather and return results\r\nIAsyncEnumerable data = GetSourceData();\r\n\r\nReceiverDescriptor fraudDetectorReceiverDesc = ReceiverDescriptor.Of(new FraudDetectorReceiver());\r\n\r\n// Streaming requires a target table to partition data.\r\n// Use a dummy table for this scenario, because we are not going to store any data.\r\nawait client.Sql.ExecuteScriptAsync("CREATE TABLE IF NOT EXISTS TX_DUMMY (ID LONG)");\r\n\r\nITable dummyTable = await client.Tables.GetTableAsync("TX_DUMMY");\r\n\r\n// Source data has "txId" field, but target dummy table has "id" column, so keyFunc maps "txId" to "id".\r\nFunc keyFunc = tuple => new IgniteTuple { ["id"] = tuple["txId"] };\r\n\r\n// Payload function is used to extract the payload (data that goes to the receiver) from the source item.\r\n// In our case, we want to use the whole source item as the payload.\r\nFunc payloadFunc = tuple => tuple;\r\n\r\nIAsyncEnumerable results = dummyTable.RecordBinaryView.StreamDataAsync(\r\ndata,\r\nfraudDetectorReceiverDesc,\r\nkeyFunc,\r\npayloadFunc,\r\nreceiverArg: null);\r\n\r\nawait foreach (IIgniteTuple processedTx in results)\r\n{\r\nConsole.WriteLine("Transaction processed: " + processedTx);\r\n}\r\n\r\nasync IAsyncEnumerable GetSourceData()\r\n{\r\nawait Task.Yield(); // Simulate async data source.\r\n\r\n for (int i = 0; i < 1000; i++)\r\n {\r\n yield return new IgniteTuple\r\n {\r\n ["txId"] = i,\r\n ["txData"] = "{some-json-data}"\r\n };\r\n }\r\n}\n'})})})]}),"\n",(0,n.jsx)(r.h4,{id:"custom-marshallers-in-net",children:"Custom Marshallers in .NET"}),"\n",(0,n.jsxs)(r.p,{children:["In .NET, you can define custom marshallers by implementing the ",(0,n.jsx)(r.a,{href:"https://ignite.apache.org/releases/3.0.0/dotnetdoc/api/Apache.Ignite.Marshalling.IMarshaller-1.html",children:(0,n.jsx)(r.code,{children:"IMarshaller"})})," interface."]}),"\n",(0,n.jsxs)(r.p,{children:["For example, the code below demonstrates how to use ",(0,n.jsx)(r.code,{children:"JsonMarshaller"})," to serialize data, arguments, and results."]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:'ITable? table = await client.Tables.GetTableAsync("my-table");\r\n\r\nReceiverDescriptor receiverDesc = ReceiverDescriptor.Of(new MyReceiver());\r\n\r\nIAsyncEnumerable data = Enumerable\r\n .Range(1, 100)\r\n .Select(x => new MyData(x, $"Name {x}"))\r\n .ToAsyncEnumerable();\r\n\r\nIAsyncEnumerable results = table!.RecordBinaryView.StreamDataAsync(\r\n data: data,\r\n receiver: receiverDesc,\r\n keySelector: dataItem => new IgniteTuple { ["id"] = dataItem.Id },\r\n payloadSelector: dataItem => dataItem,\r\n receiverArg: new MyArg("Some info"));\r\n\r\nawait foreach (MyResult result in results)\r\n{\r\n Console.WriteLine(result);\r\n}\r\n\r\npublic record MyData(int Id, string Name);\r\n\r\npublic record MyArg(string Info);\r\n\r\npublic record MyResult(MyData Data, MyArg Arg);\r\n\r\npublic class MyReceiver : IDataStreamerReceiver\r\n{\r\n public IMarshaller PayloadMarshaller =>\r\n new JsonMarshaller();\r\n\r\n public IMarshaller ArgumentMarshaller =>\r\n new JsonMarshaller();\r\n\r\n public IMarshaller ResultMarshaller =>\r\n new JsonMarshaller();\r\n\r\n public ValueTask?> ReceiveAsync(IList page, MyArg arg, IDataStreamerReceiverContext context, CancellationToken cancellationToken)\r\n {\r\n IList results = page\r\n .Select(data => new MyResult(data, arg))\r\n .ToList();\r\n\r\n return ValueTask.FromResult(results)!;\r\n }\r\n}\n'})}),"\n",(0,n.jsx)(r.h2,{id:"tracking-failed-entries",children:"Tracking Failed Entries"}),"\n",(0,n.jsxs)(r.p,{children:["If the data streamer fails to process any entries, it collects the failed items in a ",(0,n.jsx)(r.code,{children:"DataStreamerException"}),". You can catch this exception and access the failed entries using the ",(0,n.jsx)(r.code,{children:"failedItems()"})," method, as shown in the example below."]}),"\n",(0,n.jsx)(r.p,{children:"You can catch both asynchronous errors during background streaming and immediate submission errors:"}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'RecordView view = client.tables().table("accounts").recordView(Account.class);\r\n\r\nCompletableFuture streamerFut;\r\n\r\ntry (var publisher = new SubmissionPublisher>()) {\r\nstreamerFut = view.streamData(publisher, options)\r\n.exceptionally(e -> {\r\nSystem.out.println("Failed items during background streaming: " +\r\n((DataStreamerException)e.getCause()).failedItems());\r\nreturn null;\r\n});\r\n\r\n /** Trying to insert an account record. */\r\n Account entry = new Account(1, "Account name", rnd.nextLong(100_000), rnd.nextBoolean());\r\n publisher.submit(DataStreamerItem.of(entry));\r\n} catch (DataStreamerException e) {\r\n /** Handle entries that failed during submission. */\r\n System.out.println("Failed items during submission: " + e.failedItems());\r\n}\r\n\r\nstreamerFut.join();\n'})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:'ITable? table = await Client.Tables.GetTableAsync("my-table");\r\nIRecordView view = table!.RecordBinaryView;\r\nIList data = [new IgniteTuple { ["key"] = 1L, ["val"] = "v" }];\r\n\r\ntry\r\n{\r\nawait view.StreamDataAsync(data.ToAsyncEnumerable());\r\n}\r\ncatch (DataStreamerException e)\r\n{\r\nConsole.WriteLine("Failed items: " + string.Join(",", e.FailedItems));\r\n}\n'})})})]}),"\n",(0,n.jsx)(r.h3,{id:"tuning-memory-usage",children:"Tuning Memory Usage"}),"\n",(0,n.jsx)(r.p,{children:"The data streamer may require a significant amount of memory to handle the requests in an orderly manner. Depending on your environment, you may want to increase or reduce the amount of memory reserved by the data streamer."}),"\n",(0,n.jsxs)(r.p,{children:["For every node in the cluster, the streamer reserves an amount of memory equal to ",(0,n.jsx)(r.code,{children:"pageSize"})," (1000 entries by default) multiplied by ",(0,n.jsx)(r.code,{children:"perPartitionParallelOperations"})," (1 by default) setting. For example, a 10-partition table with default parameters and average entry size of 1KB will reserve 10MB for operations."]}),"\n",(0,n.jsxs)(r.p,{children:["You can change these options while creating a ",(0,n.jsx)(r.code,{children:"DataStreamerOptions"})," object:"]}),"\n",(0,n.jsxs)(i.A,{groupId:"programming-languages",children:[(0,n.jsx)(l.A,{value:"java",label:"Java",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'RecordView view = client.tables().table("accounts").recordView();\r\nvar publisher = new SubmissionPublisher();\r\n\r\nvar options = DataStreamerOptions.builder()\r\n .pageSize(10_000)\r\n .perPartitionParallelOperations(10)\r\n .build();\r\n\r\nstreamerFut = view.streamData(publisher, options);\n'})})}),(0,n.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-csharp",children:"// .NET streamer does not have a perPartitionParallelOperations option yet.\r\nvar options = new DataStreamerOptions\r\n{\r\nPageSize = 10_000\r\n};\n"})})})]}),"\n",(0,n.jsx)(r.p,{children:"Additionally, the data streamer periodically flushes incomplete buffers to ensure that messages are not delayed indefinitely. This is especially useful when a buffer fills slowly or never completely fills due to uneven data distribution."}),"\n",(0,n.jsxs)(r.p,{children:["This behavior is controlled by the ",(0,n.jsx)(r.code,{children:"autoFlushInterval"})," property, which is set to 5000 ms by default. You can also configure the ",(0,n.jsx)(r.code,{children:"retryLimit"})," parameter to define the maximum number of retry attempts for failed submissions, with a default value of 16."]})]})}function p(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}},73381:(e,r,t)=>{t.d(r,{A:()=>a});const a=t.p+"assets/images/data_streaming-6b2d018b11aa91d7b373e308efcd713f.png"}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/2f89ca13.e2eed46d.js b/docs/ignite3/assets/js/2f89ca13.e2eed46d.js deleted file mode 100644 index 07d5bf9a26..0000000000 --- a/docs/ignite3/assets/js/2f89ca13.e2eed46d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[666],{28453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>o});var t=i(96540);const r={},s=t.createContext(r);function c(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),t.createElement(s.Provider,{value:n},e.children)}},45237:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"develop/integrate/spring-boot","title":"Spring Boot Integration","description":"Apache Ignite 3 provides a Spring Boot starter that auto-configures an IgniteClient bean. The starter handles connection lifecycle, supports property-based configuration, and allows programmatic customization.","source":"@site/docs/develop/integrate/spring-boot.md","sourceDirName":"develop/integrate","slug":"/develop/integrate/spring-boot","permalink":"/docs/ignite3/3.1.0/develop/integrate/spring-boot","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"spring-boot","title":"Spring Boot Integration"},"sidebar":"tutorialSidebar","previous":{"title":"Integrate","permalink":"/docs/ignite3/3.1.0/develop/integrate/"},"next":{"title":"Spring Data Integration","permalink":"/docs/ignite3/3.1.0/develop/integrate/spring-data"}}');var r=i(74848),s=i(28453);const c={id:"spring-boot",title:"Spring Boot Integration"},o=void 0,l={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Basic Configuration",id:"basic-configuration",level:2},{value:"Configuration Properties",id:"configuration-properties",level:2},{value:"Connection Properties",id:"connection-properties",level:3},{value:"Authentication Properties",id:"authentication-properties",level:3},{value:"SSL/TLS Properties",id:"ssltls-properties",level:3},{value:"Programmatic Customization",id:"programmatic-customization",level:2},{value:"Custom Authenticator",id:"custom-authenticator",level:3},{value:"Available Customization Options",id:"available-customization-options",level:2},{value:"Using the Client",id:"using-the-client",level:2},{value:"Next Steps",id:"next-steps",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Apache Ignite 3 provides a Spring Boot starter that auto-configures an ",(0,r.jsx)(n.code,{children:"IgniteClient"})," bean. The starter handles connection lifecycle, supports property-based configuration, and allows programmatic customization."]}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Java 17 or later"}),"\n",(0,r.jsx)(n.li,{children:"Spring Boot 3.x"}),"\n",(0,r.jsx)(n.li,{children:"Running Ignite 3 cluster"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.p,{children:"Add the starter dependency to your project. The starter version must match your Apache Ignite cluster version."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Maven:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:"\r\n 3.1.0\r\n\r\n\r\n\r\n org.apache.ignite\r\n spring-boot-starter-ignite-client\r\n ${ignite.version}\r\n\n"})}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Gradle:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-groovy",children:"ext {\r\n igniteVersion = '3.1.0'\r\n}\r\n\r\nimplementation \"org.apache.ignite:spring-boot-starter-ignite-client:${igniteVersion}\"\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Version Matching",type:"note",children:(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"spring-boot-starter-ignite-client"})," artifact is released as part of Apache Ignite, so its version matches the Ignite release version. For Ignite 3.1.0, use ",(0,r.jsx)(n.code,{children:"spring-boot-starter-ignite-client:3.1.0"}),"."]})}),"\n",(0,r.jsx)(n.h2,{id:"basic-configuration",children:"Basic Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["Configure the Ignite client connection in ",(0,r.jsx)(n.code,{children:"application.properties"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-properties",children:"ignite.client.addresses=127.0.0.1:10800\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"IgniteClient"})," bean is automatically created and available for injection:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@SpringBootApplication\r\npublic class MyApplication {\r\n\r\n public static void main(String[] args) {\r\n SpringApplication.run(MyApplication.class, args);\r\n }\r\n\r\n @Bean\r\n ApplicationRunner runner(IgniteClient client) {\r\n return args -> {\r\n client.sql().execute(null, "CREATE TABLE IF NOT EXISTS Person (id INT PRIMARY KEY, name VARCHAR)");\r\n client.sql().execute(null, "INSERT INTO Person (id, name) VALUES (1, \'John\')");\r\n };\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"configuration-properties",children:"Configuration Properties"}),"\n",(0,r.jsxs)(n.p,{children:["All properties use the ",(0,r.jsx)(n.code,{children:"ignite.client"})," prefix."]}),"\n",(0,r.jsx)(n.h3,{id:"connection-properties",children:"Connection Properties"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"addresses"})}),(0,r.jsx)(n.td,{children:"String[]"}),(0,r.jsxs)(n.td,{children:["Cluster node addresses in ",(0,r.jsx)(n.code,{children:"host:port"})," format"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"connectTimeout"})}),(0,r.jsx)(n.td,{children:"Long"}),(0,r.jsx)(n.td,{children:"Connection timeout in milliseconds"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"operationTimeout"})}),(0,r.jsx)(n.td,{children:"Long"}),(0,r.jsx)(n.td,{children:"Operation timeout in milliseconds"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"heartbeatInterval"})}),(0,r.jsx)(n.td,{children:"Long"}),(0,r.jsx)(n.td,{children:"Heartbeat message interval in milliseconds"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"heartbeatTimeout"})}),(0,r.jsx)(n.td,{children:"Long"}),(0,r.jsx)(n.td,{children:"Heartbeat message timeout in milliseconds"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"backgroundReconnectInterval"})}),(0,r.jsx)(n.td,{children:"Long"}),(0,r.jsx)(n.td,{children:"Background reconnect interval in milliseconds"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"metricsEnabled"})}),(0,r.jsx)(n.td,{children:"Boolean"}),(0,r.jsx)(n.td,{children:"Enable client metrics"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-properties",children:"ignite.client.addresses=node1:10800,node2:10800,node3:10800\r\nignite.client.connectTimeout=5000\r\nignite.client.operationTimeout=3000\r\nignite.client.heartbeatInterval=30000\r\nignite.client.heartbeatTimeout=5000\r\nignite.client.backgroundReconnectInterval=30000\r\nignite.client.metricsEnabled=true\n"})}),"\n",(0,r.jsx)(n.h3,{id:"authentication-properties",children:"Authentication Properties"}),"\n",(0,r.jsx)(n.p,{children:"Configure basic authentication via properties:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"auth.basic.username"})}),(0,r.jsx)(n.td,{children:"String"}),(0,r.jsx)(n.td,{children:"Authentication username"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"auth.basic.password"})}),(0,r.jsx)(n.td,{children:"String"}),(0,r.jsx)(n.td,{children:"Authentication password"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-properties",children:"ignite.client.addresses=127.0.0.1:10800\r\nignite.client.auth.basic.username=ignite\r\nignite.client.auth.basic.password=ignite\n"})}),"\n",(0,r.jsx)(n.h3,{id:"ssltls-properties",children:"SSL/TLS Properties"}),"\n",(0,r.jsxs)(n.p,{children:["Configure SSL/TLS via the ",(0,r.jsx)(n.code,{children:"sslConfiguration"})," nested property:"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"sslConfiguration.enabled"})}),(0,r.jsx)(n.td,{children:"Boolean"}),(0,r.jsx)(n.td,{children:"Enable SSL/TLS"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"sslConfiguration.keyStorePath"})}),(0,r.jsx)(n.td,{children:"String"}),(0,r.jsx)(n.td,{children:"Path to key store file"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"sslConfiguration.keyStorePassword"})}),(0,r.jsx)(n.td,{children:"String"}),(0,r.jsx)(n.td,{children:"Key store password"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"sslConfiguration.trustStorePath"})}),(0,r.jsx)(n.td,{children:"String"}),(0,r.jsx)(n.td,{children:"Path to trust store file"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"sslConfiguration.trustStorePassword"})}),(0,r.jsx)(n.td,{children:"String"}),(0,r.jsx)(n.td,{children:"Trust store password"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"sslConfiguration.ciphers"})}),(0,r.jsx)(n.td,{children:"List"}),(0,r.jsx)(n.td,{children:"Allowed cipher suites"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example:"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-properties",children:"ignite.client.addresses=127.0.0.1:10800\r\nignite.client.sslConfiguration.enabled=true\r\nignite.client.sslConfiguration.keyStorePath=/path/to/keystore.jks\r\nignite.client.sslConfiguration.keyStorePassword=changeit\r\nignite.client.sslConfiguration.trustStorePath=/path/to/truststore.jks\r\nignite.client.sslConfiguration.trustStorePassword=changeit\n"})}),"\n",(0,r.jsx)(n.h2,{id:"programmatic-customization",children:"Programmatic Customization"}),"\n",(0,r.jsxs)(n.p,{children:["For configuration that cannot be expressed via properties, implement ",(0,r.jsx)(n.code,{children:"IgniteClientPropertiesCustomizer"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"@SpringBootApplication\r\npublic class MyApplication {\r\n\r\n public static void main(String[] args) {\r\n SpringApplication.run(MyApplication.class, args);\r\n }\r\n\r\n @Bean\r\n public IgniteClientPropertiesCustomizer customizeClient() {\r\n return config -> {\r\n config.setRetryPolicy(new RetryLimitPolicy().retryLimit(5));\r\n config.setLoggerFactory(System::getLogger);\r\n };\r\n }\r\n}\n"})}),"\n",(0,r.jsx)(n.h3,{id:"custom-authenticator",children:"Custom Authenticator"}),"\n",(0,r.jsx)(n.p,{children:"Override the default authentication by providing a custom authenticator:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Bean\r\npublic IgniteClientPropertiesCustomizer customizeClient() {\r\n return config -> config.setAuthenticator(\r\n BasicAuthenticator.builder()\r\n .username("ignite")\r\n .password("ignite")\r\n .build()\r\n );\r\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["When both property-based authentication (",(0,r.jsx)(n.code,{children:"auth.basic.*"}),") and a programmatic authenticator are configured, the programmatic authenticator takes precedence."]}),"\n",(0,r.jsx)(n.h2,{id:"available-customization-options",children:"Available Customization Options"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"IgniteClientPropertiesCustomizer"})," provides access to all ",(0,r.jsx)(n.code,{children:"IgniteClientProperties"})," setters:"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Method"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"setAddresses(String[])"})}),(0,r.jsx)(n.td,{children:"Cluster node addresses"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"setRetryPolicy(RetryPolicy)"})}),(0,r.jsx)(n.td,{children:"Request retry policy"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"setLoggerFactory(LoggerFactory)"})}),(0,r.jsx)(n.td,{children:"Custom logger factory"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"setAddressFinder(IgniteClientAddressFinder)"})}),(0,r.jsx)(n.td,{children:"Dynamic address discovery"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"setAuthenticator(IgniteClientAuthenticator)"})}),(0,r.jsx)(n.td,{children:"Custom authenticator"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"setAsyncContinuationExecutor(Executor)"})}),(0,r.jsx)(n.td,{children:"Executor for async continuations"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"using-the-client",children:"Using the Client"}),"\n",(0,r.jsxs)(n.p,{children:["Inject ",(0,r.jsx)(n.code,{children:"IgniteClient"})," anywhere in your application:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Service\r\npublic class PersonService {\r\n\r\n private final IgniteClient client;\r\n\r\n public PersonService(IgniteClient client) {\r\n this.client = client;\r\n }\r\n\r\n public void createPerson(int id, String name) {\r\n client.sql().execute(null,\r\n "INSERT INTO Person (id, name) VALUES (?, ?)",\r\n id, name);\r\n }\r\n\r\n public void createPersonInTransaction(int id, String name) {\r\n Transaction tx = client.transactions().begin();\r\n try {\r\n client.sql().execute(tx,\r\n "INSERT INTO Person (id, name) VALUES (?, ?)",\r\n id, name);\r\n tx.commit();\r\n } catch (Exception e) {\r\n tx.rollback();\r\n throw e;\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"./spring-data",children:"Spring Data Integration"})," - Repository-based data access"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"../ignite-clients/java-client",children:"Java Client"})," - Client API reference"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"../work-with-data/transactions",children:"Transactions"})," - Transaction management"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/31dfd8c3.e394cf0c.js b/docs/ignite3/assets/js/31dfd8c3.e394cf0c.js deleted file mode 100644 index abe6d5bc51..0000000000 --- a/docs/ignite3/assets/js/31dfd8c3.e394cf0c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9655],{25231:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"api-reference/sql-only-apis/python","title":"Python DB-API","description":"The Apache Ignite 3 Python driver implements PEP 249 (Python Database API Specification 2.0) for Python applications. It provides SQL access through a standard Python interface backed by a native C++ extension for performance.","source":"@site/docs/api-reference/sql-only-apis/python.md","sourceDirName":"api-reference/sql-only-apis","slug":"/api-reference/sql-only-apis/python","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/python","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Python DB-API","id":"python","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"ODBC Driver","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc"},"next":{"title":"API Documentation","permalink":"/docs/ignite3/3.1.0/api-reference/api/"}}');var s=r(74848),t=r(28453);const c={title:"Python DB-API",id:"python",sidebar_position:3},o="Python DB-API",l={},d=[{value:"Installation",id:"installation",level:2},{value:"Connection Function",id:"connection-function",level:2},{value:"Parameters",id:"parameters",level:3},{value:"Keyword Arguments",id:"keyword-arguments",level:3},{value:"Returns",id:"returns",level:3},{value:"Connection Object",id:"connection-object",level:2},{value:"Attributes",id:"attributes",level:3},{value:"Methods",id:"methods",level:3},{value:"Context Manager Support",id:"context-manager-support",level:3},{value:"Cursor Object",id:"cursor-object",level:2},{value:"Attributes",id:"attributes-1",level:3},{value:"Methods",id:"methods-1",level:3},{value:"Context Manager Support",id:"context-manager-support-1",level:3},{value:"Column Description",id:"column-description",level:2},{value:"Type Constants",id:"type-constants",level:2},{value:"Parameter Style",id:"parameter-style",level:2},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Basic Connection",id:"basic-connection",level:3},{value:"Connection with Context Manager",id:"connection-with-context-manager",level:3},{value:"Connection with Authentication",id:"connection-with-authentication",level:3},{value:"Connection with SSL",id:"connection-with-ssl",level:3},{value:"Multiple Node Addresses",id:"multiple-node-addresses",level:3},{value:"Parameterized Queries",id:"parameterized-queries",level:3},{value:"Insert with Parameters",id:"insert-with-parameters",level:3},{value:"Batch Insert",id:"batch-insert",level:3},{value:"Transaction Control",id:"transaction-control",level:3},{value:"Fetch Strategies",id:"fetch-strategies",level:3},{value:"Iterator Protocol",id:"iterator-protocol",level:3},{value:"Column Metadata",id:"column-metadata",level:3},{value:"Type Handling",id:"type-handling",level:3},{value:"Error Handling",id:"error-handling",level:3},{value:"Exception Hierarchy",id:"exception-hierarchy",level:2},{value:"Ignite-Specific Behavior",id:"ignite-specific-behavior",level:2},{value:"Type Mapping",id:"type-mapping",level:3},{value:"Autocommit Default",id:"autocommit-default",level:3},{value:"Page Size",id:"page-size",level:3},{value:"Network Timeout",id:"network-timeout",level:3},{value:"Thread Safety",id:"thread-safety",level:3},{value:"lastrowid Limitation",id:"lastrowid-limitation",level:3},{value:"Connection Examples",id:"connection-examples",level:2},{value:"Reference",id:"reference",level:2},{value:"Module Attributes",id:"module-attributes",level:3},{value:"DB-API Compliance",id:"db-api-compliance",level:3},{value:"Limitations",id:"limitations",level:3}];function a(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"python-db-api",children:"Python DB-API"})}),"\n",(0,s.jsx)(n.p,{children:"The Apache Ignite 3 Python driver implements PEP 249 (Python Database API Specification 2.0) for Python applications. It provides SQL access through a standard Python interface backed by a native C++ extension for performance."}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pip install pyignite_dbapi\n"})}),"\n",(0,s.jsx)(n.h2,{id:"connection-function",children:"Connection Function"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"connect(address, **kwargs)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"address"})," - List of node addresses in format ",(0,s.jsx)(n.code,{children:"['host:port', 'host:port']"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"keyword-arguments",children:"Keyword Arguments"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Connection Options"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"identity"})," - Username for authentication"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"secret"})," - Password for authentication"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"schema"})," - Default schema name (default: ",(0,s.jsx)(n.code,{children:"'PUBLIC'"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"page_size"})," - Rows fetched per request (default: ",(0,s.jsx)(n.code,{children:"1024"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"timeout"})," - Network timeout in seconds (default: ",(0,s.jsx)(n.code,{children:"30"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"autocommit"})," - Enable autocommit mode (default: ",(0,s.jsx)(n.code,{children:"True"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"SSL Options"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"use_ssl"})," - Enable SSL connection (boolean)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ssl_keyfile"})," - Path to PEM-encoded private key file"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ssl_certfile"})," - Path to PEM-encoded certificate file"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ssl_ca_certfile"})," - Path to PEM-encoded CA certificate file"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"returns",children:"Returns"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Connection"})," object."]}),"\n",(0,s.jsx)(n.h2,{id:"connection-object",children:"Connection Object"}),"\n",(0,s.jsx)(n.h3,{id:"attributes",children:"Attributes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"autocommit"})," - Get or set autocommit mode (property)"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"methods",children:"Methods"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"close()"})," - Close connection and all associated cursors"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"commit()"})," - Commit pending transaction"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"rollback()"})," - Roll back pending transaction"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"cursor()"})," - Create and return new cursor object"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"context-manager-support",children:"Context Manager Support"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"with pyignite_dbapi.connect(address=['localhost:10800']) as conn:\r\n # Use connection\r\n pass\r\n# Connection automatically closes\n"})}),"\n",(0,s.jsx)(n.h2,{id:"cursor-object",children:"Cursor Object"}),"\n",(0,s.jsx)(n.h3,{id:"attributes-1",children:"Attributes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"arraysize"})," - Number of rows returned by ",(0,s.jsx)(n.code,{children:"fetchmany()"})," (default: ",(0,s.jsx)(n.code,{children:"1"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"description"})," - Read-only sequence of 7-tuples describing result columns"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"rowcount"})," - Number of rows affected or returned (read-only)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"rownumber"})," - Current row index (read-only, 0-based)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"connection"})," - Parent connection object (read-only)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"lastrowid"})," - Always ",(0,s.jsx)(n.code,{children:"None"})," (not supported by Ignite)"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"methods-1",children:"Methods"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"execute(query, params=None)"})," - Execute SQL query with optional parameters"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"executemany(query, params_list)"})," - Execute SQL query multiple times with parameter sequences"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"fetchone()"})," - Fetch next row as tuple or ",(0,s.jsx)(n.code,{children:"None"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"fetchmany(size=None)"})," - Fetch next ",(0,s.jsx)(n.code,{children:"size"})," rows as list of tuples (uses ",(0,s.jsx)(n.code,{children:"arraysize"})," if ",(0,s.jsx)(n.code,{children:"size"})," is ",(0,s.jsx)(n.code,{children:"None"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"fetchall()"})," - Fetch all remaining rows as list of tuples"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"close()"})," - Close cursor"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"next()"})," / ",(0,s.jsx)(n.code,{children:"__next__()"})," - Fetch next row (iterator protocol)"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"context-manager-support-1",children:"Context Manager Support"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"with conn.cursor() as cursor:\r\n cursor.execute('SELECT * FROM users')\r\n # Use cursor\r\n pass\r\n# Cursor automatically closes\n"})}),"\n",(0,s.jsx)(n.h2,{id:"column-description",children:"Column Description"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"cursor.description"})," attribute returns a sequence of 7-tuples for each result column:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"name"})," - Column name (string)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"type_code"})," - Python type constant"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"display_size"})," - Display width (integer or ",(0,s.jsx)(n.code,{children:"None"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"internal_size"})," - Internal storage size (integer or ",(0,s.jsx)(n.code,{children:"None"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"precision"})," - Numeric precision (integer or ",(0,s.jsx)(n.code,{children:"None"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"scale"})," - Numeric scale (integer or ",(0,s.jsx)(n.code,{children:"None"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"null_ok"})," - Whether column allows NULL (boolean or ",(0,s.jsx)(n.code,{children:"None"}),")"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"type-constants",children:"Type Constants"}),"\n",(0,s.jsx)(n.p,{children:"The module exposes type constants for column descriptions:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"NULL"})," - None type"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BOOLEAN"})," - Boolean type (bool)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"INT"})," - Integer type (int)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"FLOAT"})," - Floating point type (float)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"NUMBER"})," - Decimal type (decimal.Decimal)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"DATE"})," - Date type (datetime.date)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"TIME"})," - Time type (datetime.time)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"DATETIME"})," - Datetime type (datetime.datetime)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"DURATION"})," - Duration type (datetime.timedelta)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"STRING"})," - String type (str)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BINARY"})," - Binary type (bytes)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"UUID"})," - UUID type (uuid.UUID)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"TIMESTAMP"})," - Timestamp type (float subclass)"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"parameter-style",children:"Parameter Style"}),"\n",(0,s.jsxs)(n.p,{children:["The driver uses question mark (",(0,s.jsx)(n.code,{children:"?"}),") parameter style:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"cursor.execute('SELECT * FROM users WHERE id = ?', [101])\r\ncursor.execute('INSERT INTO users (id, name) VALUES (?, ?)', [101, 'John'])\n"})}),"\n",(0,s.jsx)(n.p,{children:"Parameters bind positionally to question marks in the query."}),"\n",(0,s.jsx)(n.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,s.jsx)(n.h3,{id:"basic-connection",children:"Basic Connection"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"import pyignite_dbapi\r\n\r\nconn = pyignite_dbapi.connect(address=['127.0.0.1:10800'])\r\n\r\ntry:\r\n cursor = conn.cursor()\r\n cursor.execute('SELECT id, name FROM users')\r\n\r\n for row in cursor:\r\n print(f\"{row[0]}: {row[1]}\")\r\n\r\n cursor.close()\r\nfinally:\r\n conn.close()\n"})}),"\n",(0,s.jsx)(n.h3,{id:"connection-with-context-manager",children:"Connection with Context Manager"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"import pyignite_dbapi\r\n\r\nwith pyignite_dbapi.connect(address=['127.0.0.1:10800']) as conn:\r\n with conn.cursor() as cursor:\r\n cursor.execute('SELECT id, name FROM users')\r\n\r\n for row in cursor:\r\n print(f\"{row[0]}: {row[1]}\")\n"})}),"\n",(0,s.jsx)(n.h3,{id:"connection-with-authentication",children:"Connection with Authentication"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn = pyignite_dbapi.connect(\r\n address=['127.0.0.1:10800'],\r\n identity='admin',\r\n secret='password'\r\n)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"connection-with-ssl",children:"Connection with SSL"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn = pyignite_dbapi.connect(\r\n address=['127.0.0.1:10800'],\r\n use_ssl=True,\r\n ssl_certfile='/path/to/client.pem',\r\n ssl_keyfile='/path/to/client-key.pem',\r\n ssl_ca_certfile='/path/to/ca.pem'\r\n)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"multiple-node-addresses",children:"Multiple Node Addresses"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn = pyignite_dbapi.connect(\r\n address=['node1:10800', 'node2:10800', 'node3:10800']\r\n)\n"})}),"\n",(0,s.jsx)(n.p,{children:"The driver attempts connections to addresses in order until one succeeds."}),"\n",(0,s.jsx)(n.h3,{id:"parameterized-queries",children:"Parameterized Queries"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"cursor.execute(\r\n 'SELECT * FROM users WHERE age > ? AND city = ?',\r\n [25, 'New York']\r\n)\r\n\r\nrows = cursor.fetchall()\n"})}),"\n",(0,s.jsx)(n.h3,{id:"insert-with-parameters",children:"Insert with Parameters"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"cursor.execute(\r\n 'INSERT INTO users (id, name, email) VALUES (?, ?, ?)',\r\n [101, 'John Doe', 'john@example.com']\r\n)\r\n\r\nprint(f\"Rows affected: {cursor.rowcount}\")\n"})}),"\n",(0,s.jsx)(n.h3,{id:"batch-insert",children:"Batch Insert"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"users = [\r\n (1, 'Alice', 'alice@example.com'),\r\n (2, 'Bob', 'bob@example.com'),\r\n (3, 'Charlie', 'charlie@example.com')\r\n]\r\n\r\ncursor.executemany(\r\n 'INSERT INTO users (id, name, email) VALUES (?, ?, ?)',\r\n users\r\n)\r\n\r\nprint(f\"Rows affected: {cursor.rowcount}\")\n"})}),"\n",(0,s.jsx)(n.h3,{id:"transaction-control",children:"Transaction Control"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn = pyignite_dbapi.connect(\r\n address=['127.0.0.1:10800'],\r\n autocommit=False\r\n)\r\n\r\ntry:\r\n cursor = conn.cursor()\r\n cursor.execute('INSERT INTO accounts (id, balance) VALUES (?, ?)', [1, 1000])\r\n cursor.execute('INSERT INTO accounts (id, balance) VALUES (?, ?)', [2, 2000])\r\n\r\n conn.commit()\r\nexcept Exception as e:\r\n conn.rollback()\r\n raise\r\nfinally:\r\n conn.close()\n"})}),"\n",(0,s.jsx)(n.h3,{id:"fetch-strategies",children:"Fetch Strategies"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"cursor.execute('SELECT * FROM large_table')\r\n\r\n# Fetch one row at a time\r\nrow = cursor.fetchone()\r\nif row:\r\n print(row)\r\n\r\n# Fetch specific number of rows\r\ncursor.arraysize = 100\r\nrows = cursor.fetchmany(100) # Fetch 100 rows\r\n\r\n# Fetch all remaining rows\r\nall_rows = cursor.fetchall()\n"})}),"\n",(0,s.jsx)(n.h3,{id:"iterator-protocol",children:"Iterator Protocol"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"cursor.execute('SELECT * FROM users')\r\n\r\nfor row in cursor:\r\n print(row)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"column-metadata",children:"Column Metadata"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'cursor.execute(\'SELECT id, name, created_at FROM users\')\r\n\r\nfor col in cursor.description:\r\n print(f"Column: {col.name}")\r\n print(f" Type: {col.type_code}")\r\n print(f" Nullable: {col.null_ok}")\n'})}),"\n",(0,s.jsx)(n.h3,{id:"type-handling",children:"Type Handling"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"import datetime\r\nimport uuid\r\nfrom decimal import Decimal\r\n\r\n# Insert various types\r\ncursor.execute('''\r\n INSERT INTO products (id, uuid, name, price, created, active)\r\n VALUES (?, ?, ?, ?, ?, ?)\r\n''', [\r\n 1,\r\n uuid.uuid4(),\r\n 'Widget',\r\n Decimal('19.99'),\r\n datetime.datetime.now(),\r\n True\r\n])\r\n\r\n# Retrieve and use typed values\r\ncursor.execute('SELECT uuid, price, created FROM products WHERE id = ?', [1])\r\nrow = cursor.fetchone()\r\n\r\nproduct_uuid = row[0] # uuid.UUID\r\nproduct_price = row[1] # Decimal\r\nproduct_created = row[2] # datetime.datetime\n"})}),"\n",(0,s.jsx)(n.h3,{id:"error-handling",children:"Error Handling"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"import pyignite_dbapi\r\n\r\ntry:\r\n conn = pyignite_dbapi.connect(address=['127.0.0.1:10800'])\r\n cursor = conn.cursor()\r\n cursor.execute('SELECT * FROM nonexistent_table')\r\nexcept pyignite_dbapi.DatabaseError as e:\r\n print(f\"Database error: {e}\")\r\nexcept pyignite_dbapi.OperationalError as e:\r\n print(f\"Connection error: {e}\")\r\nfinally:\r\n if conn:\r\n conn.close()\n"})}),"\n",(0,s.jsx)(n.h2,{id:"exception-hierarchy",children:"Exception Hierarchy"}),"\n",(0,s.jsxs)(n.p,{children:["All exceptions inherit from ",(0,s.jsx)(n.code,{children:"Error"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"Error (base exception)\r\n\u251c\u2500\u2500 Warning\r\n\u251c\u2500\u2500 InterfaceError\r\n\u2514\u2500\u2500 DatabaseError\r\n \u251c\u2500\u2500 DataError\r\n \u251c\u2500\u2500 OperationalError\r\n \u251c\u2500\u2500 IntegrityError\r\n \u251c\u2500\u2500 InternalError\r\n \u251c\u2500\u2500 ProgrammingError\r\n \u2514\u2500\u2500 NotSupportedError\n"})}),"\n",(0,s.jsx)(n.p,{children:"Access exceptions through the connection object or module:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"try:\r\n cursor.execute(query)\r\nexcept conn.DatabaseError as e:\r\n # Handle error\r\n pass\r\n\r\n# Or\r\nexcept pyignite_dbapi.DatabaseError as e:\r\n # Handle error\r\n pass\n"})}),"\n",(0,s.jsx)(n.h2,{id:"ignite-specific-behavior",children:"Ignite-Specific Behavior"}),"\n",(0,s.jsx)(n.h3,{id:"type-mapping",children:"Type Mapping"}),"\n",(0,s.jsx)(n.p,{children:"Python types map to SQL types:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Python Type"}),(0,s.jsx)(n.th,{children:"SQL Type"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"None"}),(0,s.jsx)(n.td,{children:"NULL"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"bool"}),(0,s.jsx)(n.td,{children:"BOOLEAN"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"int"}),(0,s.jsx)(n.td,{children:"BIGINT"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"float"}),(0,s.jsx)(n.td,{children:"DOUBLE"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Decimal"}),(0,s.jsx)(n.td,{children:"DECIMAL"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"str"}),(0,s.jsx)(n.td,{children:"VARCHAR"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"bytes"}),(0,s.jsx)(n.td,{children:"VARBINARY"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"date"}),(0,s.jsx)(n.td,{children:"DATE"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"time"}),(0,s.jsx)(n.td,{children:"TIME"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"datetime"}),(0,s.jsx)(n.td,{children:"TIMESTAMP"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"timedelta"}),(0,s.jsx)(n.td,{children:"INTERVAL"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"UUID"}),(0,s.jsx)(n.td,{children:"UUID"})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"autocommit-default",children:"Autocommit Default"}),"\n",(0,s.jsxs)(n.p,{children:["Autocommit defaults to ",(0,s.jsx)(n.code,{children:"True"}),". Disable for explicit transaction control:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn = pyignite_dbapi.connect(\r\n address=['127.0.0.1:10800'],\r\n autocommit=False\r\n)\n"})}),"\n",(0,s.jsx)(n.p,{children:"Or change after connection:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn.autocommit = False\n"})}),"\n",(0,s.jsx)(n.h3,{id:"page-size",children:"Page Size"}),"\n",(0,s.jsx)(n.p,{children:"The driver fetches results in pages (default: 1024 rows). Increase page size for large result sets to reduce network overhead:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn = pyignite_dbapi.connect(\r\n address=['127.0.0.1:10800'],\r\n page_size=4096\r\n)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"network-timeout",children:"Network Timeout"}),"\n",(0,s.jsx)(n.p,{children:"Configure network timeout for socket operations:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn = pyignite_dbapi.connect(\r\n address=['127.0.0.1:10800'],\r\n timeout=60 # 60 seconds\r\n)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"thread-safety",children:"Thread Safety"}),"\n",(0,s.jsx)(n.p,{children:"The module provides thread safety level 1 (module level). Each thread requires its own connection. Do not share connections across threads."}),"\n",(0,s.jsx)(n.h3,{id:"lastrowid-limitation",children:"lastrowid Limitation"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"cursor.lastrowid"})," attribute always returns ",(0,s.jsx)(n.code,{children:"None"}),". Ignite does not track auto-generated keys through the DB-API interface."]}),"\n",(0,s.jsx)(n.h2,{id:"connection-examples",children:"Connection Examples"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"# Basic\r\nconn = pyignite_dbapi.connect(address=['127.0.0.1:10800'])\r\n\r\n# With schema\r\nconn = pyignite_dbapi.connect(\r\n address=['127.0.0.1:10800'],\r\n schema='analytics'\r\n)\r\n\r\n# With authentication\r\nconn = pyignite_dbapi.connect(\r\n address=['127.0.0.1:10800'],\r\n identity='admin',\r\n secret='password'\r\n)\r\n\r\n# With SSL\r\nconn = pyignite_dbapi.connect(\r\n address=['127.0.0.1:10800'],\r\n use_ssl=True,\r\n ssl_certfile='/opt/certs/client.pem',\r\n ssl_keyfile='/opt/certs/client-key.pem',\r\n ssl_ca_certfile='/opt/certs/ca.pem'\r\n)\r\n\r\n# Complete configuration\r\nconn = pyignite_dbapi.connect(\r\n address=['node1:10800', 'node2:10800', 'node3:10800'],\r\n identity='admin',\r\n secret='password',\r\n schema='mySchema',\r\n page_size=2048,\r\n timeout=60,\r\n autocommit=False,\r\n use_ssl=True,\r\n ssl_certfile='/opt/certs/client.pem',\r\n ssl_keyfile='/opt/certs/client-key.pem',\r\n ssl_ca_certfile='/opt/certs/ca.pem'\r\n)\n"})}),"\n",(0,s.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,s.jsx)(n.h3,{id:"module-attributes",children:"Module Attributes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"apilevel"})," - ",(0,s.jsx)(n.code,{children:"'2.0'"})," (PEP 249 API level)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"threadsafety"})," - ",(0,s.jsx)(n.code,{children:"1"})," (module-level thread safety)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"paramstyle"})," - ",(0,s.jsx)(n.code,{children:"'qmark'"})," (question mark parameter style)"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"db-api-compliance",children:"DB-API Compliance"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"PEP 249 Database API Specification 2.0 compliant"}),"\n",(0,s.jsx)(n.li,{children:"Implements Connection, Cursor objects"}),"\n",(0,s.jsx)(n.li,{children:"Supports context managers (with statements)"}),"\n",(0,s.jsx)(n.li,{children:"Implements iterator protocol for cursors"}),"\n",(0,s.jsx)(n.li,{children:"Provides standard exception hierarchy"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Thread safety level 1 (connections not thread-safe)"}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"lastrowid"})," not supported (always returns ",(0,s.jsx)(n.code,{children:"None"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:["Binary data must use ",(0,s.jsx)(n.code,{children:"bytes"})," type (no special Binary constructor)"]}),"\n",(0,s.jsx)(n.li,{children:"Date/time values use standard library types (no special constructors)"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>c,x:()=>o});var i=r(96540);const s={},t=i.createContext(s);function c(e){const n=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/3293c63f.cfba7f5e.js b/docs/ignite3/assets/js/3293c63f.cfba7f5e.js deleted file mode 100644 index fb92ac1fd2..0000000000 --- a/docs/ignite3/assets/js/3293c63f.cfba7f5e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[404],{11470:(e,n,t)=>{t.d(n,{A:()=>j});var a=t(96540),r=t(34164),s=t(17559),l=t(23104),i=t(56347),c=t(205),o=t(57485),u=t(31682),d=t(70679);function h(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:a}})=>({value:e,label:n,attributes:t,default:a}))}(t);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const t=(0,i.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,o.aZ)(r),(0,a.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=p(e),[l,i]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s})),[o,u]=x({queryString:t,groupId:r}),[h,g]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,d.Dv)(n);return[t,(0,a.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),b=(()=>{const e=o??h;return m({value:e,tabValues:s})?e:null})();(0,c.A)(()=>{b&&i(b)},[b]);return{selectedValue:l,selectValue:(0,a.useCallback)(e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),g(e)},[u,g,s]),tabValues:s}}var b=t(92303);const E={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var T=t(74848);function f({className:e,block:n,selectedValue:t,selectValue:a,tabValues:s}){const i=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.a_)(),o=e=>{const n=e.currentTarget,r=i.indexOf(n),l=s[r].value;l!==t&&(c(n),a(l))},u=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,T.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:a})=>(0,T.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{i.push(e)},onKeyDown:u,onClick:o,...a,className:(0,r.A)("tabs__item",E.tabItem,a?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:t}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===t);return e?(0,a.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,T.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function S(e){const n=g(e);return(0,T.jsxs)("div",{className:(0,r.A)(s.G.tabs.container,"tabs-container",E.tabList),children:[(0,T.jsx)(f,{...n,...e}),(0,T.jsx)(A,{...n,...e})]})}function j(e){const n=(0,b.A)();return(0,T.jsx)(S,{...e,children:h(e.children)},String(n))}},12661:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>c,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"sql/working-with-sql/execute-queries","title":"Executing SQL Queries","description":"In your Java projects, you can use the Java SQL API to execute SQL statements and getting results.","source":"@site/docs/sql/working-with-sql/execute-queries.md","sourceDirName":"sql/working-with-sql","slug":"/sql/working-with-sql/execute-queries","permalink":"/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"execute-queries","title":"Executing SQL Queries","sidebar_label":"Execute Queries"},"sidebar":"tutorialSidebar","previous":{"title":"SQL Operations","permalink":"/docs/ignite3/3.1.0/sql/working-with-sql/"},"next":{"title":"System Views","permalink":"/docs/ignite3/3.1.0/sql/working-with-sql/system-views"}}');var r=t(74848),s=t(28453),l=t(11470),i=t(19365);const c={id:"execute-queries",title:"Executing SQL Queries",sidebar_label:"Execute Queries"},o="Java SQL API",u={},d=[{value:"Creating Tables",id:"creating-tables",level:2},{value:"Using Sequences",id:"using-sequences",level:3},{value:"Filling Tables",id:"filling-tables",level:2},{value:"Partition-Specific SELECTs",id:"partition-specific-selects",level:2},{value:"Getting Data From Tables",id:"getting-data-from-tables",level:2},{value:"SQL Scripts",id:"sql-scripts",level:2},{value:"Query Cancellation",id:"query-cancellation",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"java-sql-api",children:"Java SQL API"})}),"\n",(0,r.jsx)(n.p,{children:"In your Java projects, you can use the Java SQL API to execute SQL statements and getting results."}),"\n",(0,r.jsx)(n.h2,{id:"creating-tables",children:"Creating Tables"}),"\n",(0,r.jsx)(n.p,{children:"Here is an example of how you can create a new table on a cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'client.sql().executeScript(\r\n "CREATE TABLE CITIES ("\r\n + "ID INT PRIMARY KEY,"\r\n + "NAME VARCHAR);"\r\n\r\n + "CREATE TABLE ACCOUNTS ("\r\n + " ACCOUNT_ID INT PRIMARY KEY,"\r\n + " CITY_ID INT,"\r\n + " FIRST_NAME VARCHAR,"\r\n + " LAST_NAME VARCHAR,"\r\n + " BALANCE DOUBLE)"\r\n);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"using-sequences",children:"Using Sequences"}),"\n",(0,r.jsx)(n.p,{children:"When creating a table, you can designate the primary key column to be filled automatically from the sequence the values for your primary key by using sql sequences:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'client.sql().execute(null, "CREATE SEQUENCE IF NOT EXISTS defaultSequence;");\r\nclient.sql().execute(null, "CREATE TABLE IF NOT EXISTS Person (ID BIGINT DEFAULT NEXTVAL(\'defaultSequence\') PRIMARY KEY, "\r\n + "CITY_ID BIGINT, "\r\n + "NAME VARCHAR, "\r\n + "AGE INT, "\r\n + "COMPANY VARCHAR);");\r\n\r\n\r\nclient.sql().execute(null,\r\n "INSERT INTO Person (CITY_ID, NAME, AGE, COMPANY) VALUES " +\r\n "(1, \'Alice\', 30, \'Google\'), " +\r\n "(2, \'Bob\', 40, \'Meta\'), " +\r\n "(3, \'Charlie\', 25, \'Spotify\')");\n'})}),"\n",(0,r.jsx)(n.h2,{id:"filling-tables",children:"Filling Tables"}),"\n",(0,r.jsxs)(n.p,{children:["With Apache Ignite 3, you can fill the table by adding rows one by one, or in a batch. In both cases, you create an ",(0,r.jsx)(n.code,{children:"INSERT"})," statement, and then execute it:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'rowsAdded = Arrays.stream(client.sql().executeBatch(tx,\r\n "INSERT INTO ACCOUNTS (ACCOUNT_ID, CITY_ID, FIRST_NAME, LAST_NAME, BALANCE) values (?, ?, ?, ?, ?)",\r\n BatchedArguments.of(1, 1, "John", "Doe", 1000.0d)\r\n .add(2, 1, "Jane", "Roe", 2000.0d)\r\n .add(3, 2, "Mary", "Major", 1500.0d)\r\n .add(4, 3, "Richard", "Miles", 1450.0d)))\r\n .sum();\r\n\r\nSystem.out.println("\\nAdded accounts: " + rowsAdded);\n'})}),"\n",(0,r.jsx)(n.h2,{id:"partition-specific-selects",children:"Partition-Specific SELECTs"}),"\n",(0,r.jsxs)(n.p,{children:["When executing a SELECT operation, you can use the system ",(0,r.jsx)(n.code,{children:"__part"})," column to only ",(0,r.jsx)(n.code,{children:"SELECT"})," data in a specific partition. To find out partition information, use the SELECT request that explicitly includes the ",(0,r.jsx)(n.code,{children:"__part"})," column as its part:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:'SELECT city_id, id, "__part" FROM Person;\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Once you know the partition, you can use it in the ",(0,r.jsx)(n.code,{children:"WHERE"})," clause:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:'SELECT city_id, id FROM Person WHERE "__part"=23;\n'})}),"\n",(0,r.jsx)(n.h2,{id:"getting-data-from-tables",children:"Getting Data From Tables"}),"\n",(0,r.jsxs)(n.p,{children:["To get data from a table, execute the ",(0,r.jsx)(n.code,{children:"SELECT"})," statement to get a set of results. SqlRow can provide access to column values by column name or column index. You can then iterate through results to get data."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Always close the ",(0,r.jsx)(n.code,{children:"ResultSet"}),", either by using a ",(0,r.jsx)(n.code,{children:"try-with-resources"})," statement or by calling its ",(0,r.jsx)(n.code,{children:"close()"})," method directly."]})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (ResultSet rs = client.sql().execute(null,\r\n "SELECT a.FIRST_NAME, a.LAST_NAME, c.NAME FROM ACCOUNTS a "\r\n + "INNER JOIN CITIES c on c.ID = a.CITY_ID ORDER BY a.ACCOUNT_ID")) {\r\n while (rs.hasNext()) {\r\n SqlRow row = rs.next();\r\n\r\n System.out.println(" "\r\n + row.stringValue(0) + ", "\r\n + row.stringValue(1) + ", "\r\n + row.stringValue(2));\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"sql-scripts",children:"SQL Scripts"}),"\n",(0,r.jsxs)(n.p,{children:["The default API executes SQL statements one at a time. For large SQL statements, pass them to the ",(0,r.jsx)(n.code,{children:"executeScript()"})," method. The statements will be batched together similar to using ",(0,r.jsx)(n.code,{children:"SET STREAMING"})," command in Apache Ignite 2, significantly improving performance when executing a large number of queries at once. These statements will be executed in order."]}),"\n","\n",(0,r.jsx)(l.A,{children:(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"String script = \"CREATE TABLE IF NOT EXISTS Person (id int primary key, name varchar, age int default 0);\"\r\n + \"INSERT INTO Person (id, name, age) VALUES ('1', 'John', '46');\";\r\nclient.sql().executeScript(script);\n"})})})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"Execution of each statement is considered complete when the first page is ready to be returned. As a result, when working with large data sets, SELECT statement may be affected by later statements in the same script."})}),"\n",(0,r.jsx)(n.h3,{id:"query-cancellation",children:"Query Cancellation"}),"\n",(0,r.jsx)(n.p,{children:"To cancel a query, create and pass the cancellation token to the execution method:"}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'CancelHandle cancelHandle = CancelHandle.create();\r\nCancellationToken cancelToken = cancelHandle.token();\r\n\r\nclient.sql().executeAsync(\r\n null, cancelToken,\r\n "SELECT a.FIRST_NAME, b.LAST_NAME " +\r\n "FROM ACCOUNTS a, ACCOUNTS b, ACCOUNTS c ORDER BY a.ACCOUNT_ID"\r\n);\n'})})}),(0,r.jsx)(i.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'std::shared_ptr handle = cancel_handle::create();\r\nstd::shared_ptr token = handle->get_token();\r\n\r\nclient.get_sql().execute(nullptr, token.get(), "CREATE TABLE IF NOT EXISTS Person (id int primary key, name varchar, age int);", {});\n'})})})]}),"\n",(0,r.jsxs)(n.p,{children:["After the query is submitted, you can cancel all queries that use the tokens from the same ",(0,r.jsx)(n.code,{children:"cancelHandle"})," object at any point by using the ",(0,r.jsx)(n.code,{children:"cancel()"})," or ",(0,r.jsx)(n.code,{children:"cancelAsync()"})," methods, for example:"]}),"\n",(0,r.jsxs)(l.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'CompletableFuture cancelled = cancelHandle.cancelAsync();\r\ncancelled.get(5, TimeUnit.SECONDS);\r\n\r\nSystem.out.println("\\nIs query cancelled: " + cancelled.isDone());\n'})})}),(0,r.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var cts = new CancellationTokenSource();\r\nawait using var resultSet = await Client.Sql.ExecuteAsync(null, "CREATE TABLE IF NOT EXISTS Person (id int primary key)", cts.Token);\r\nawait cts.CancelAsync();\n'})})}),(0,r.jsx)(i.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:"handle->cancel_async(ignite_result cancellationResult) {\r\n// Handle cancellationResult here\r\n});\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Another way to cancel queries is by using the SQL ",(0,r.jsx)(n.a,{href:"/3.1.0/sql/reference/data-types-and-functions/operational-commands#kill-query",children:"KILL QUERY"})," command. The query id can be retrieved via the ",(0,r.jsx)(n.code,{children:"SQL_QUERIES"})," ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/monitoring/metrics-system-views",children:"system view"}),"."]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},19365:(e,n,t)=>{t.d(n,{A:()=>l});t(96540);var a=t(34164);const r={tabItem:"tabItem_Ymn6"};var s=t(74848);function l({children:e,hidden:n,className:t}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>i});var a=t(96540);const r={},s=a.createContext(r);function l(e){const n=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/32c93f0c.e7550de4.js b/docs/ignite3/assets/js/32c93f0c.e7550de4.js deleted file mode 100644 index c5b0bcb432..0000000000 --- a/docs/ignite3/assets/js/32c93f0c.e7550de4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2276],{11470:(e,n,r)=>{r.d(n,{A:()=>T});var a=r(96540),t=r(34164),l=r(17559),i=r(23104),s=r(56347),c=r(205),o=r(57485),u=r(31682),d=r(70679);function h(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:r}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:r,default:a}})=>({value:e,label:n,attributes:r,default:a}))}(r);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function b({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const r=(0,s.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,o.aZ)(t),(0,a.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(r.location.search);n.set(t,e),r.replace({...r.location,search:n.toString()})},[t,r])]}function v(e){const{defaultValue:n,queryString:r=!1,groupId:t}=e,l=p(e),[i,s]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!b({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l})),[o,u]=m({queryString:r,groupId:t}),[h,v]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,t]=(0,d.Dv)(n);return[r,(0,a.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),j=(()=>{const e=o??h;return b({value:e,tabValues:l})?e:null})();(0,c.A)(()=>{j&&s(j)},[j]);return{selectedValue:i,selectValue:(0,a.useCallback)(e=>{if(!b({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),v(e)},[u,v,l]),tabValues:l}}var j=r(92303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=r(74848);function g({className:e,block:n,selectedValue:r,selectValue:a,tabValues:l}){const s=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),o=e=>{const n=e.currentTarget,t=s.indexOf(n),i=l[t].value;i!==r&&(c(n),a(i))},u=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const r=s.indexOf(e.currentTarget)+1;n=s[r]??s[0];break}case"ArrowLeft":{const r=s.indexOf(e.currentTarget)-1;n=s[r]??s[s.length-1];break}}n?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:a})=>(0,y.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{s.push(e)},onKeyDown:u,onClick:o,...a,className:(0,t.A)("tabs__item",x.tabItem,a?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function w({lazy:e,children:n,selectedValue:r}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===r);return e?(0,a.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function f(e){const n=v(e);return(0,y.jsxs)("div",{className:(0,t.A)(l.G.tabs.container,"tabs-container",x.tabList),children:[(0,y.jsx)(g,{...n,...e}),(0,y.jsx)(w,{...n,...e})]})}function T(e){const n=(0,j.A)();return(0,y.jsx)(f,{...e,children:h(e.children)},String(n))}},19365:(e,n,r)=>{r.d(n,{A:()=>i});r(96540);var a=r(34164);const t={tabItem:"tabItem_Ymn6"};var l=r(74848);function i({children:e,hidden:n,className:r}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,a.A)(t.tabItem,r),hidden:n,children:e})}},28453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>s});var a=r(96540);const t={},l=a.createContext(t);function i(e){const n=a.useContext(l);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),a.createElement(l.Provider,{value:n},e.children)}},49389:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>c,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"develop/work-with-data/table-api","title":"Table API","description":"To execute table operations on a specific table, you need to get a specific view of the table and use one of its methods. You can only create new tables by using SQL API.","source":"@site/docs/develop/work-with-data/table-api.md","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/table-api","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/table-api","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"table-api","title":"Table API"},"sidebar":"tutorialSidebar","previous":{"title":"Work with Data","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/"},"next":{"title":"Performing Transactions","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/transactions"}}');var t=r(74848),l=r(28453),i=r(11470),s=r(19365);const c={id:"table-api",title:"Table API"},o=void 0,u={},d=[{value:"Table Views in Apache Ignite",id:"table-views-in-apache-ignite",level:2},{value:"Tuple and Key-Value Views",id:"tuple-and-key-value-views",level:3},{value:"Record and Key-Value Views",id:"record-and-key-value-views",level:3},{value:"Data Type Support",id:"data-type-support",level:2},{value:"Time and Date Data Types",id:"time-and-date-data-types",level:3},{value:"Getting a Table Instance",id:"getting-a-table-instance",level:2},{value:"Qualified Table Name Object",id:"qualified-table-name-object",level:3},{value:"Basic Table Operations",id:"basic-table-operations",level:2},{value:"Tuple Record View",id:"tuple-record-view",level:3},{value:"Record View",id:"record-view",level:3},{value:"Key-Value Tuple View",id:"key-value-tuple-view",level:3},{value:"Key-Value View",id:"key-value-view",level:3},{value:"Criterion Queries",id:"criterion-queries",level:2},{value:"Asynchronous Queries",id:"asynchronous-queries",level:3},{value:"Comparison Expressions",id:"comparison-expressions",level:3},{value:"Comparison Operators",id:"comparison-operators",level:3}];function h(e){const n={code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"To execute table operations on a specific table, you need to get a specific view of the table and use one of its methods. You can only create new tables by using SQL API."}),"\n",(0,t.jsx)(n.p,{children:"Apache Ignite supports mapping user objects to table tuples. This ensures that objects created in any programming language can be used for key-value operations directly."}),"\n",(0,t.jsx)(n.h2,{id:"table-views-in-apache-ignite",children:"Table Views in Apache Ignite"}),"\n",(0,t.jsx)(n.h3,{id:"tuple-and-key-value-views",children:"Tuple and Key-Value Views"}),"\n",(0,t.jsx)(n.p,{children:"When working with tables, Apache Ignite offers two approaches: directly handling the data or mapping the data to classes. The direct data handling approach handles data tuples. Alternatively, when mapping data to classes, the data is converted to and from these classes as needed for database interactions."}),"\n",(0,t.jsx)(n.h3,{id:"record-and-key-value-views",children:"Record and Key-Value Views"}),"\n",(0,t.jsxs)(n.p,{children:["When creating views, you can create a ",(0,t.jsx)(n.code,{children:"RecordView"})," or ",(0,t.jsx)(n.code,{children:"KeyValueView"}),". The primary difference between these view types is the API used."]}),"\n",(0,t.jsx)(n.p,{children:'In a RecordView, you create a single "record" that includes all the information about a row to be updated or retrieved from the table, and send this record to the server. This record should contain all the fields, including the primary key.'}),"\n",(0,t.jsx)(n.p,{children:"In a KeyValueView, you work with key-value mappings. Think of it as a dictionary where the key object contains the primary key field or fields, and the value object contains the data fields. This approach is useful when primary key is not directly related to the domain object thus you prefer not to add the primary key to it."}),"\n",(0,t.jsx)(n.h2,{id:"data-type-support",children:"Data Type Support"}),"\n",(0,t.jsx)(n.h3,{id:"time-and-date-data-types",children:"Time and Date Data Types"}),"\n",(0,t.jsx)(n.p,{children:"Only JavaTime API is supported for working with table views. The following data types are not supported:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.util.Date"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.sql.Date"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.sql.Time"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.sql.Timestamp"})}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Use the following data types instead:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.time.LocalDate"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.time.LocalTime"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.time.LocalDateTime"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"java.time.Instant"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"getting-a-table-instance",children:"Getting a Table Instance"}),"\n",(0,t.jsxs)(n.p,{children:["First, get an instance of the table. To obtain an instance of table, use the ",(0,t.jsx)(n.code,{children:"IgniteTables.table(String)"})," method. You can also use ",(0,t.jsx)(n.code,{children:"IgniteTables.tables()"})," method to list all existing tables."]}),"\n","\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:"IgniteTables tableApi = client.tables();\r\nList
                                                              existingTables = tableApi.tables();\r\nTable firstTable = existingTables.get(0);\n"})})}),(0,t.jsx)(s.A,{value:"net",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'var existingTables = await Client.Tables.GetTablesAsync();\r\nvar firstTable = existingTables[0];\r\n\r\nvar myTable = await Client.Tables.GetTableAsync("MY_TABLE");\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nauto table_api = client.get_tables();\r\nstd::vector
                                                              existing_tables = table_api.get_tables();\r\ntable first_table = existing_tables.front();\r\n\r\nstd::optional
                                                              my_table = table_api.get_table("MY_TABLE");\n'})})})]}),"\n",(0,t.jsxs)(n.p,{children:["By default, if the schema name is not specified, the ",(0,t.jsx)(n.code,{children:"PUBLIC"})," schema is used. If a qualified name is specified, the table is taken from the specified schema."]}),"\n",(0,t.jsx)(n.h3,{id:"qualified-table-name-object",children:"Qualified Table Name Object"}),"\n",(0,t.jsxs)(n.p,{children:["Instead of using a string to specify table name, you can create a ",(0,t.jsx)(n.code,{children:"QualifiedName"})," object to hold a fully qualified table name. Apache Ignite provides 2 methods for creating qualified names:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["You can parse the fully qualified table name with the ",(0,t.jsx)(n.code,{children:"parse"})," method:"]}),"\n"]}),"\n",(0,t.jsx)(i.A,{children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'QualifiedName qualifiedTableName = QualifiedName.parse("PUBLIC.Person");\r\nTable myTable = tableApi.table(qualifiedTableName);\n'})})})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["You can provide schema name and table name separately with the ",(0,t.jsx)(n.code,{children:"of"})," method:"]}),"\n"]}),"\n",(0,t.jsx)(i.A,{children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'QualifiedName qualifiedTableName = QualifiedName.of("PUBLIC", "MY_TABLE");\r\nTable myTable = tableApi.table(qualifiedTableName);\n'})})})}),"\n",(0,t.jsx)(n.p,{children:"The provided names must follow SQL syntax rules for identifiers:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:['Identifier must start from a character in the "Lu", "Ll", "Lt", "Lm", "Lo", or "Nl" Unicode categories or ',(0,t.jsx)(n.code,{children:"U+0331"})," (underscore);"]}),"\n",(0,t.jsxs)(n.li,{children:["Identifier characters (except for the first one) may be ",(0,t.jsx)(n.code,{children:"U+00B7"}),' (middle dot), or any character in the "Mn", "Mc", "Nd", "Pc", or "Cf" Unicode categories;']}),"\n",(0,t.jsxs)(n.li,{children:["Identifiers that contain any other characters must be quoted with ",(0,t.jsx)(n.code,{children:"U+2033"})," (double-quotes);"]}),"\n",(0,t.jsx)(n.li,{children:"Double-quote inside the identifier must be escaped with 2 double-quote characters."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Any unquoted names will be cast to upper case. In this case, ",(0,t.jsx)(n.code,{children:"Person"})," and ",(0,t.jsx)(n.code,{children:"PERSON"})," names are equivalent. To avoid this, add escaped quotes around the name. For example, ",(0,t.jsx)(n.code,{children:'\\"Person\\"'})," will be encoded as a case-sensitive ",(0,t.jsx)(n.code,{children:"Person"})," name. If the name contains the ",(0,t.jsx)(n.code,{children:"U+2033"})," (double quote) symbol, it must be escaped as ",(0,t.jsx)(n.code,{children:'""'})," (2 double quote symbols)."]}),"\n",(0,t.jsx)(n.p,{children:"For example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'// Case-insensitive table `MY_TABLE` in a case-insensitive `PUBLIC` schema.\r\nQualifiedName.parse("public.my_table"))\r\n\r\n// Case-sensitive table `my_table` in a case-sensitive `public` schema.\r\nQualifiedName.parse("\\"public\\".\\"my_table\\""))\r\n\r\n// Same as above, but with comma as separator that needs to be surrounded by quote characters.\r\nQualifiedName.of("\\"public\\"","\\"my_table\\""))\r\n\r\n// Case-sensitive name my"table.\r\nQualifiedName.parse("\\"my\\"\\"table\\""));\r\n\r\n// Case-sensitive table name `public.my_table` in a default schema.\r\nQualifiedName.parse("\\"public.my_table\\""));\n'})}),"\n",(0,t.jsx)(n.h2,{id:"basic-table-operations",children:"Basic Table Operations"}),"\n",(0,t.jsx)(n.p,{children:"Once you've got a table you need to get a specific view to choose how you want to operate table records."}),"\n",(0,t.jsx)(n.h3,{id:"tuple-record-view",children:"Tuple Record View"}),"\n",(0,t.jsx)(n.p,{children:"A tuple record view can be used to operate on table tuples directly. When retrieving data from tuple views, you can use a wide variety of methods to retrieve type-specific data stored in tuples. A full list of methods is available in the Tuple object javadoc."}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'RecordView accounts = client.tables().table("accounts").recordView();\r\n\r\nSystem.out.println("\\nInserting a record into the \'accounts\' table...");\r\n\r\nTuple newAccountTuple = Tuple.create()\r\n .set("accountNumber", 123456)\r\n .set("firstName", "Val")\r\n .set("lastName", "Kulichenko")\r\n .set("balance", 100.00d);\r\n\r\naccounts.insert(null, newAccountTuple);\r\n\r\nSystem.out.println("\\nRetrieving a record using RecordView API...");\r\n\r\nTuple accountNumberTuple = Tuple.create().set("accountNumber", 123456);\r\n\r\nTuple accountTuple = accounts.get(null, accountNumberTuple);\r\n\r\nSystem.out.println(\r\n "\\nRetrieved record:\\n"\r\n + " Account Number: " + accountTuple.intValue("accountNumber") + \'\\n\'\r\n + " Owner: " + accountTuple.stringValue("firstName") + " " + accountTuple.stringValue("lastName") + \'\\n\'\r\n + " Balance: $" + accountTuple.doubleValue("balance"));\n'})})}),(0,t.jsx)(s.A,{value:"net",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'IRecordView view = table.RecordBinaryView;\r\n\r\nIIgniteTuple fullRecord = new IgniteTuple\r\n{\r\n ["id"] = 42,\r\n ["name"] = "John Doe"\r\n};\r\n\r\nawait view.UpsertAsync(transaction: null, fullRecord);\r\n\r\nIIgniteTuple keyRecord = new IgniteTuple { ["id"] = 42 };\r\n(IIgniteTuple value, bool hasValue) = await view.GetAsync(transaction: null, keyRecord);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.FieldCount == 2);\r\nDebug.Assert(value["id"] as int? == 42);\r\nDebug.Assert(value["name"] as string == "John Doe");\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'record_view view = table.get_record_binary_view();\r\n\r\nignite_tuple record{\r\n {"id", 42},\r\n {"name", "John Doe"}\r\n};\r\n\r\nview.upsert(nullptr, record);\r\nstd::optional res_record = view.get(nullptr, {"id", 42});\r\n\r\nassert(res_record.has_value());\r\nassert(res_record->column_count() == 2);\r\nassert(res_record->get("id") == 42);\r\nassert(res_record->get("name") == "John Doe");\n'})})})]}),"\n",(0,t.jsx)(n.h3,{id:"record-view",children:"Record View"}),"\n",(0,t.jsx)(n.p,{children:"A record view maps to a user-defined type and enables table operations on user objects which are mapped to table tuples."}),"\n",(0,t.jsx)(n.p,{children:"Create the type converter:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:"static class CityIdConverter implements TypeConverter {\r\n\r\n @Override\r\n public String toObjectType(Integer columnValue) {\r\n return columnValue.toString();\r\n }\r\n\r\n @Override\r\n public Integer toColumnType(String cityId) {\r\n return Integer.parseInt(cityId);\r\n }\r\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Then build the mapper and get the ",(0,t.jsx)(n.code,{children:"RecordView"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'public static void main(String[] args) throws Exception {\r\n var mapper = Mapper.builder(Person.class)\r\n .automap()\r\n .map("cityId", "city_id", new CityIdConverter())\r\n .build();\r\n\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n ) {\r\n RecordView view = client.tables()\r\n .table("person")\r\n .recordView(mapper);\r\n\r\n\r\n Person myPerson = new Person(2, "2", "John Doe", 40, "Apache");\r\n\r\n view.upsert(null, myPerson);\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"Perform table operations on your custom objects mapped to table tuples:"}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'RecordView accounts = client.tables()\r\n .table("accounts")\r\n .recordView(Account.class);\r\n\r\nSystem.out.println("\\nInserting a record into the \'accounts\' table...");\r\n\r\nAccount newAccount = new Account(\r\n 123456,\r\n "Val",\r\n "Kulichenko",\r\n 100.00d\r\n);\r\n\r\naccounts.insert(null, newAccount);\r\n\r\nSystem.out.println("\\nRetrieving a record using RecordView API...");\r\n\r\nAccount account = accounts.get(null, new Account(123456));\r\n\r\nSystem.out.println(\r\n "\\nRetrieved record:\\n"\r\n + " Account Number: " + account.accountNumber + \'\\n\'\r\n + " Owner: " + account.firstName + " " + account.lastName + \'\\n\'\r\n + " Balance: $" + account.balance);\n'})})}),(0,t.jsx)(s.A,{value:"net",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'var pocoView = table.GetRecordView();\r\n\r\nawait pocoView.UpsertAsync(transaction: null, new Poco(42, "John Doe"));\r\nvar (value, hasValue) = await pocoView.GetAsync(transaction: null, new Poco(42));\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.Name == "John Doe");\r\n\r\npublic record Poco(long Id, string? Name = null);\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'record_view view = table.get_record_view();\r\n\r\nperson record(42, "John Doe");\r\n\r\nview.upsert(nullptr, record);\r\nstd::optional res_record = view.get(nullptr, person{42});\r\n\r\nassert(res.has_value());\r\nassert(res->id == 42);\r\nassert(res->name == "John Doe");\n'})})})]}),"\n",(0,t.jsx)(n.h3,{id:"key-value-tuple-view",children:"Key-Value Tuple View"}),"\n",(0,t.jsx)(n.p,{children:"A tuple key-value view. It can be used to operate table using key and value tuples separately. When retrieving data from tuple views, you can use a wide variety of methods to retrieve type-specific data stored in tuples. A full list of methods is available in the Tuple object javadoc."}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'KeyValueView kvView = client.tables().table("accounts").keyValueView();\r\n\r\nSystem.out.println("\\nInserting a key-value pair into the \'accounts\' table...");\r\n\r\nTuple key = Tuple.create()\r\n .set("accountNumber", 123456);\r\n\r\nTuple value = Tuple.create()\r\n .set("firstName", "Val")\r\n .set("lastName", "Kulichenko")\r\n .set("balance", 100.00d);\r\n\r\nkvView.put(null, key, value);\r\n\r\nSystem.out.println("\\nRetrieving a value using KeyValueView API...");\r\n\r\nvalue = kvView.get(null, key);\r\n\r\nSystem.out.println(\r\n "\\nRetrieved value:\\n"\r\n + " Account Number: " + key.intValue("accountNumber") + \'\\n\'\r\n + " Owner: " + value.stringValue("firstName") + " " + value.stringValue("lastName") + \'\\n\'\r\n + " Balance: $" + value.doubleValue("balance"));\n'})})}),(0,t.jsx)(s.A,{value:"net",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'IKeyValueView kvView = table.KeyValueBinaryView;\r\n\r\nIIgniteTuple key = new IgniteTuple { ["id"] = 42 };\r\nIIgniteTuple val = new IgniteTuple { ["name"] = "John Doe" };\r\n\r\nawait kvView.PutAsync(transaction: null, key, val);\r\n(IIgniteTuple? value, bool hasValue) = await kvView.GetAsync(transaction: null, key);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.FieldCount == 1);\r\nDebug.Assert(value["name"] as string == "John Doe");\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'key_value_view kv_view = table.get_key_value_binary_view();\r\n\r\nignite_tuple key_tuple{{"id", 42}};\r\nignite_tuple val_tuple{{"name", "John Doe"}};\r\n\r\nkv_view.put(nullptr, key_tuple, val_tuple);\r\nstd::optional res_tuple = kv_view.get(nullptr, key_tuple);\r\n\r\nassert(res_tuple.has_value());\r\nassert(res_tuple->column_count() == 2);\r\nassert(res_tuple->get("id") == 42);\r\nassert(res_tuple->get("name") == "John Doe");\n'})})})]}),"\n",(0,t.jsx)(n.h3,{id:"key-value-view",children:"Key-Value View"}),"\n",(0,t.jsx)(n.p,{children:"A key-value view with user objects. It can be used to operate table using key and value user objects mapped to table tuples."}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'KeyValueView kvView = client.tables()\r\n .table("accounts")\r\n .keyValueView(AccountKey.class, Account.class);\r\nSystem.out.println("\\nInserting a key-value pair into the \'accounts\' table...");\r\n\r\nAccountKey key = new AccountKey(123456);\r\n\r\nAccount value = new Account(\r\n "Val",\r\n "Kulichenko",\r\n 100.00d\r\n);\r\n\r\nkvView.put(null, key, value);\r\n\r\nSystem.out.println("\\nRetrieving a value using KeyValueView API...");\r\n\r\nvalue = kvView.get(null, key);\r\n\r\n\r\nSystem.out.println(\r\n "\\nRetrieved value:\\n"\r\n + " Account Number: " + key.accountNumber + \'\\n\'\r\n + " Owner: " + value.firstName + " " + value.lastName + \'\\n\'\r\n + " Balance: $" + value.balance);\n'})})}),(0,t.jsx)(s.A,{value:"net",label:".NET",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'IKeyValueView kvView = table.GetKeyValueView();\r\n\r\nawait kvView.PutAsync(transaction: null, 42, new Poco(Id: 0, Name: "John Doe"));\r\n(Poco? value, bool hasValue) = await kvView.GetAsync(transaction: null, 42);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.Name == "John Doe");\r\n\r\npublic record Poco(long Id, string? Name = null);\n'})})}),(0,t.jsx)(s.A,{value:"cpp",label:"C++",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'key_value_view kv_view = table.get_key_value_view();\r\n\r\nkv_view.put(nullptr, {42}, {"John Doe"});\r\nstd::optional res = kv_view.get(nullptr, {42});\r\n\r\nassert(res.has_value());\r\nassert(res->id == 42);\r\nassert(res->name == "John Doe");\n'})})})]}),"\n",(0,t.jsx)(n.h2,{id:"criterion-queries",children:"Criterion Queries"}),"\n",(0,t.jsx)(n.p,{children:"Apache Ignite provides the criterion queries that can be used to retrieve data from tables. Criterion queries work with any type of view, returning the appropriate data to the query specified."}),"\n",(0,t.jsx)(n.p,{children:"The example below shows how you can execute a query within an implicit transaction:"}),"\n",(0,t.jsx)(i.A,{children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'try (Cursor> cursor = table.keyValueView().query(\r\n null, // Implicit transaction\r\n // Query criteria\r\n and(\r\n columnValue("name", equalTo("John Doe")),\r\n columnValue("age", greaterThan(20))\r\n )\r\n)) {\r\n // Process query results (keeping original cursor iteration pattern)\r\n // As an example, println all matched values.\r\n while (cursor.hasNext()) {\r\n printRecord(cursor.next());\r\n }\r\n}\n'})})})}),"\n",(0,t.jsxs)(n.p,{children:["The comparison query are specified by using the ",(0,t.jsx)(n.code,{children:"query()"})," method, and providing the comparison criteria in the ",(0,t.jsx)(n.code,{children:"columnValue"})," method."]}),"\n",(0,t.jsx)(n.p,{children:"You can also specify the specific transaction to execute the query in to perform the query in that specific transaction."}),"\n",(0,t.jsx)(i.A,{children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'try (Cursor> cursor = table.keyValueView().query(\r\n transaction,\r\n // Query criteria\r\n and(\r\n columnValue("name", equalTo("John Doe")),\r\n columnValue("age", greaterThan(20))\r\n )\r\n)) {\r\n // Process query results\r\n // As an example, println all matched values.\r\n while (cursor.hasNext()) {\r\n printRecord(cursor.next());\r\n }\r\n\r\n // Commit transaction if all operations succeed\r\n transaction.commit();\r\n} catch (Exception e) {\r\n // Rollback transaction on error\r\n transaction.rollback();\r\n throw new RuntimeException("Transaction failed", e);\r\n}\n'})})})}),"\n",(0,t.jsx)(n.h3,{id:"asynchronous-queries",children:"Asynchronous Queries"}),"\n",(0,t.jsxs)(n.p,{children:["You can also perform the query asynchronously by using the ",(0,t.jsx)(n.code,{children:"queryAsync"})," method. This way the query is executed without blocking the thread. For example, you can execute the above query asynchronously:"]}),"\n",(0,t.jsx)(i.A,{children:(0,t.jsx)(s.A,{value:"java",label:"Java",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'public static void performQueryAsync(Table table) {\r\n System.out.println("[ Example 3 ] Performing asynchronous query");\r\n\r\n AsyncCursor> result = table.keyValueView().queryAsync(\r\n null, // Implicit transaction\r\n and(\r\n columnValue("name", equalTo("John Doe")),\r\n columnValue("age", greaterThan(20))\r\n )\r\n )\r\n .join();\r\n\r\n for (Entry tupleTupleEntry : result.currentPage()) {\r\n printRecord(tupleTupleEntry);\r\n }\r\n}\n'})})})}),"\n",(0,t.jsxs)(n.p,{children:["This operation uses the ",(0,t.jsx)(n.code,{children:"thenCompose()"})," method to handle the query results asynchronously in the user-defined ",(0,t.jsx)(n.code,{children:"fetchAllRowsInto()"})," method. Here is how this method may look like:"]}),"\n",(0,t.jsx)(n.h3,{id:"comparison-expressions",children:"Comparison Expressions"}),"\n",(0,t.jsx)(n.p,{children:"The following expressions are supported in criterion queries:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Expression"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Example"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"equalTo"})}),(0,t.jsx)(n.td,{children:"Checks if the object is equal to the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", equalTo("New York"))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"notEqualTo"})}),(0,t.jsx)(n.td,{children:"Checks if the object is not equal to the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", notEqualTo("New York"))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"greaterThan"})}),(0,t.jsx)(n.td,{children:"Checks if the object is greater than the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("Salary", greaterThan(10000))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"greaterThanOrEqualTo"})}),(0,t.jsx)(n.td,{children:"Checks if the object is greater than or equal to the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("Salary", greaterThanOrEqualTo(10000))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"lessThan"})}),(0,t.jsx)(n.td,{children:"Checks if the object is less than the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("Salary", lessThan(10000))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"lessThanOrEqualTo"})}),(0,t.jsx)(n.td,{children:"Checks if the object is less than or equal to the value."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("Salary", lessThanOrEqualTo(10000))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"nullValue"})}),(0,t.jsx)(n.td,{children:"Checks if the object is null."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", nullValue()'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"notNullValue"})}),(0,t.jsx)(n.td,{children:"Checks if the object is not null."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", notNullValue())'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"in"})}),(0,t.jsx)(n.td,{children:"Checks if the object is in the collection."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", in("New York", "Washington"))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"notIn"})}),(0,t.jsx)(n.td,{children:"Checks if the object is not in the collection."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'columnValue("City", notIn("New York", "Washington"))'})})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"comparison-operators",children:"Comparison Operators"}),"\n",(0,t.jsx)(n.p,{children:"The following operators are supported in criterion queries:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Operator"}),(0,t.jsx)(n.th,{children:"Description"}),(0,t.jsx)(n.th,{children:"Example"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"not"})}),(0,t.jsx)(n.td,{children:"Negates the condition."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'not(columnValue("City", equalTo("New York")))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"and"})}),(0,t.jsx)(n.td,{children:"Used to evaluate multiple conditions at the same time."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'and(columnValue("City", equalTo("New York")), columnValue("Salary", greaterThan(10000)))'})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"or"})}),(0,t.jsx)(n.td,{children:"Used to evaluate for at least one matching condition."}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:'or(columnValue("City", equalTo("New York")), columnValue("Salary", greaterThan(10000)))'})})]})]})]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/375301b3.07a6ee8b.js b/docs/ignite3/assets/js/375301b3.07a6ee8b.js deleted file mode 100644 index 965afd27cb..0000000000 --- a/docs/ignite3/assets/js/375301b3.07a6ee8b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8865],{28453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>a});var c=s(96540);const i={},r=c.createContext(i);function t(e){const n=c.useContext(r);return c.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),c.createElement(r.Provider,{value:n},e.children)}},64548:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>o});const c=JSON.parse('{"id":"understand/core-concepts/index","title":"Core Concepts","description":"Fundamental concepts in Apache Ignite 3.","source":"@site/docs/understand/core-concepts/index.mdx","sourceDirName":"understand/core-concepts","slug":"/understand/core-concepts/","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Core Concepts"},"sidebar":"tutorialSidebar","previous":{"title":"Understand","permalink":"/docs/ignite3/3.1.0/understand/"},"next":{"title":"What is Apache Ignite 3?","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite"}}');var i=s(74848),r=s(28453);const t={title:"Core Concepts"},a="Core Concepts",d={},o=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components},{IIcon:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"core-concepts",children:"Core Concepts"})}),"\n",(0,i.jsx)(n.p,{children:"Fundamental concepts in Apache Ignite 3."}),"\n",(0,i.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,i.jsxs)("div",{className:"card-container",children:[(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(s,{icon:"mdi:information-outline",height:"24"})," What is Ignite"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Introduction to Apache Ignite 3 capabilities, architecture, and use cases."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./core-concepts/what-is-ignite",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(s,{icon:"mdi:table-large",height:"24"})," Tables and Schemas"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Understanding tables, schemas, and data organization in Ignite."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./core-concepts/tables-and-schemas",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(s,{icon:"mdi:swap-horizontal-circle",height:"24"})," Transactions and MVCC"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"ACID transactions with multi-version concurrency control."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./core-concepts/transactions-and-mvcc",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(s,{icon:"mdi:sitemap",height:"24"})," Distribution and Colocation"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Data distribution and colocation strategies for performance."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./core-concepts/distribution-and-colocation",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(s,{icon:"mdi:view-grid-outline",height:"24"})," Data Partitioning"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Partition distribution, replicas, leases, and replication groups."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./core-concepts/data-partitioning",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(s,{icon:"mdi:calculator-variant-outline",height:"24"})," Compute and Events"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Distributed computing and event handling in the cluster."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./core-concepts/compute-and-events",children:"Learn more \u2192"})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"architecture",children:"Architecture"})," - Deep dive into architecture"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"performance",children:"Performance"})," - Performance concepts"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"../getting-started",children:"Getting Started"})," - Quick start guide"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/38c4fee5.cb640014.js b/docs/ignite3/assets/js/38c4fee5.cb640014.js deleted file mode 100644 index bd66d0c915..0000000000 --- a/docs/ignite3/assets/js/38c4fee5.cb640014.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4738],{28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>s});var i=t(96540);const o={},r=i.createContext(o);function a(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(r.Provider,{value:n},e.children)}},88844:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"configure-and-operate/configuration/config-storage-volatile","title":"Volatile Storage","description":"Overview","source":"@site/docs/configure-and-operate/configuration/storage-volatile.md","sourceDirName":"configure-and-operate/configuration","slug":"/configure-and-operate/configuration/config-storage-volatile","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-volatile","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"config-storage-volatile","title":"Volatile Storage","sidebar_label":"Volatile Storage"},"sidebar":"tutorialSidebar","previous":{"title":"Storage Profiles","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage"},"next":{"title":"Persistent Storage","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent"}}');var o=t(74848),r=t(28453);const a={id:"config-storage-volatile",title:"Volatile Storage",sidebar_label:"Volatile Storage"},s=void 0,l={},c=[{value:"Overview",id:"overview",level:2},{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Configuration Example",id:"configuration-example",level:2}];function d(e){const n={code:"code",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,o.jsx)(n.p,{children:"Apache Ignite Volatile storage is designed to provide a quick and responsive storage without guarantees of data persistence."}),"\n",(0,o.jsx)(n.p,{children:"When it is enabled for the data region, Apache Ignite stores all data in the data region in RAM. Data will be lost on cluster shutdown, so make sure to have a separate data region for persistent storage."}),"\n",(0,o.jsx)(n.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,o.jsx)(n.p,{children:"Each Apache Ignite storage engine can have several storage profiles. Each profile has the following properties:"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Default"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"engine"}),(0,o.jsx)(n.td,{}),(0,o.jsx)(n.td,{children:"The name of the storage engine."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"name"}),(0,o.jsx)(n.td,{}),(0,o.jsx)(n.td,{children:"The name of the storage profile."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"initSizeBytes"}),(0,o.jsx)(n.td,{children:"268435456"}),(0,o.jsx)(n.td,{children:"Initial memory region size in bytes, when the used memory size exceeds this value, new chunks of memory will be allocated."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"maxSizeBytes"}),(0,o.jsx)(n.td,{children:"268435456"}),(0,o.jsx)(n.td,{children:"Maximum memory region size in bytes."})]})]})]}),"\n",(0,o.jsx)(n.h2,{id:"configuration-example",children:"Configuration Example"}),"\n",(0,o.jsxs)(n.p,{children:['In Apache Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,o.jsx)(n.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node. The example below shows how to configure one data region that uses volatile storage."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "storage" : {\r\n "profiles" : [\r\n {\r\n "engine": "aimem",\r\n "name": "default_aimem",\r\n "initSizeBytes": 268435456,\r\n "maxSizeBytes": 268435456\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["You can then use the profile (in this case, ",(0,o.jsx)(n.code,{children:"default_aimem"}),") in your distribution zone configuration."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/390e6ec8.159cb972.js b/docs/ignite3/assets/js/390e6ec8.159cb972.js deleted file mode 100644 index 76f1fe8519..0000000000 --- a/docs/ignite3/assets/js/390e6ec8.159cb972.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9568],{28146:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>o,contentTitle:()=>d,default:()=>w,frontMatter:()=>r,metadata:()=>h,toc:()=>l});const h=JSON.parse('{"id":"sql/reference/language-definition/dml","title":"Data Manipulation Language (DML)","description":"{/*","source":"@site/docs/sql/reference/language-definition/dml.mdx","sourceDirName":"sql/reference/language-definition","slug":"/sql/reference/language-definition/dml","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/dml","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"dml","title":"Data Manipulation Language (DML)"},"sidebar":"tutorialSidebar","previous":{"title":"Data Definition Language (DDL)","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/ddl"},"next":{"title":"Distribution Zones","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones"}}');var s=i(74848),n=i(28453),a=i(63367);const r={id:"dml",title:"Data Manipulation Language (DML)"},d=void 0,o={},l=[{value:"DELETE",id:"delete",level:2},{value:"Parameters",id:"parameters",level:3},{value:"INSERT",id:"insert",level:2},{value:"MERGE",id:"merge",level:2},{value:"Parameters",id:"parameters-1",level:3},{value:"UPDATE",id:"update",level:2},{value:"Parameters",id:"parameters-2",level:3}];function c(t){const e={admonition:"admonition",code:"code",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",ul:"ul",...(0,n.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:["\n","\n",(0,s.jsx)(e.p,{children:"This section walks you through all data manipulation language (DML) commands supported by Apache Ignite 3."}),"\n",(0,s.jsx)(e.h2,{id:"delete",children:"DELETE"}),"\n",(0,s.jsx)(e.p,{children:"Deletes data from a table."}),"\n",(0,s.jsx)(a.A,{children:"\nDiagram(\nTerminal('DELETE FROM'),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nOptional(\nSequence(\nOptional('AS'),\nNonTerminal('alias'),\n)\n),\nOptional(\nSequence(\nNonTerminal('WHERE'),\nTerminal('booleanExpression')\n)\n)\n)\n"}),"\n",(0,s.jsx)(e.h3,{id:"parameters",children:"Parameters"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"alias"})," - an SQL alias for an expression or value."]}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"booleanExpression"})," - an SQL expression that returns a boolean value. Only the records for which ",(0,s.jsx)(e.code,{children:"TRUE"})," was returned will be deleted. If not specified, all records are deleted."]}),"\n"]}),"\n",(0,s.jsx)(e.hr,{}),"\n",(0,s.jsx)(e.h2,{id:"insert",children:"INSERT"}),"\n",(0,s.jsx)(e.p,{children:"Inserts data into a table."}),"\n",(0,s.jsx)(a.A,{children:"\nDiagram(\nTerminal('INSERT INTO'),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nOptional(\nNonTerminal('column_list', {href:'./grammar-reference#column_list'}),\n),\nNonTerminal('query', {href:'./grammar-reference#query'})\n)\n"}),"\n",(0,s.jsx)(e.hr,{}),"\n",(0,s.jsx)(e.h2,{id:"merge",children:"MERGE"}),"\n",(0,s.jsx)(e.p,{children:"Merges data into a table."}),"\n",(0,s.jsx)(a.A,{children:"\nDiagram(\nTerminal('MERGE INTO'),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nOptional(\nSequence(\nOptional('AS'),\nNonTerminal('alias'),\n)\n),\nTerminal('USING'),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('ON'),\nNonTerminal('booleanExpression'),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(a.A,{children:"\nDiagram(\nStart({type:'complex'}),\nOptional(\nSequence(\nNonTerminal('WHEN MATCHED THEN UPDATE SET'),\nOneOrMore(Sequence(Terminal('assign', {href:'./grammar-reference#assign'})\n),\nTerminal(',')\n))),\nOptional(\nSequence(\nNonTerminal('WHEN NOT MATCHED THEN INSERT VALUES'),\nNonTerminal('('),\nOneOrMore(Sequence(Terminal('value')\n),\nTerminal(',')\n),\nNonTerminal(')'),\n)))\n"}),"\n",(0,s.jsx)(e.admonition,{type:"note",children:(0,s.jsxs)(e.p,{children:["At least one of the ",(0,s.jsx)(e.code,{children:"WHEN MATCHED"})," and ",(0,s.jsx)(e.code,{children:"WHEN NOT MATCHED"})," clauses must be present."]})}),"\n",(0,s.jsx)(e.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"alias"})," - an SQL alias for an expression or value."]}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"booleanExpression"})," - an SQL expression that returns a boolean value. If ",(0,s.jsx)(e.code,{children:"TRUE"})," is returned, the ",(0,s.jsx)(e.code,{children:"WHEN MATCHED"})," clause is executed, otherwise the ",(0,s.jsx)(e.code,{children:"WHEN NOT MATCHED"})," is executed."]}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"value"})," - arbitrary value that will be inserted into the table during the operation."]}),"\n"]}),"\n",(0,s.jsx)(e.hr,{}),"\n",(0,s.jsx)(e.h2,{id:"update",children:"UPDATE"}),"\n",(0,s.jsx)(e.p,{children:"Updates data in a table."}),"\n",(0,s.jsx)(a.A,{children:"\nDiagram(\nTerminal('UPDATE'),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('SET'),\nOneOrMore(Sequence(Terminal('assign', {href:'./grammar-reference#assign'})\n),\nTerminal(',')\n),\nOptional(\nSequence(\nTerminal('WHERE'),\nNonTerminal('booleanExpression')\n)\n)\n)\n"}),"\n",(0,s.jsx)(e.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"booleanExpression"})," - an SQL expression that returns a boolean value. Only the records for which ",(0,s.jsx)(e.code,{children:"TRUE"})," was returned will be updated. If not specified, all records will be updated."]}),"\n"]})]})}function w(t={}){const{wrapper:e}={...(0,n.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(c,{...t})}):c(t)}},28453:(t,e,i)=>{i.d(e,{R:()=>a,x:()=>r});var h=i(96540);const s={},n=h.createContext(s);function a(t){const e=h.useContext(n);return h.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),h.createElement(n.Provider,{value:e},t.children)}},63367:(t,e,i)=>{i.d(e,{A:()=>I});var h=i(96540);const s={},n=!1,a=8,r=10,d="railroad-diagram",o=!0,l="center",c=8.5,w=7;class m{constructor(t,e,i){this.children=i||[],this.tagName=t,this.attrs=L(e,{})}format(t,e,i){}addTo(t){if(t instanceof m)return t.children.push(this),this;var e=this.toSVG();return t.appendChild(e),e}toSVG(){var t=function(t,e,i){e=e||{},i=i||"";var h=document.createElementNS("http://www.w3.org/2000/svg",t);for(var s in e)"xlink:href"===s?h.setAttributeNS("http://www.w3.org/1999/xlink","href",e[s]):h.setAttribute(s,e[s]);return h.textContent=i,h}(this.tagName,this.attrs);return"string"==typeof this.children?t.textContent=this.children:this.children.forEach(function(e){t.appendChild(e.toSVG())}),t}toString(){var t="<"+this.tagName,e="g"==this.tagName||"svg"==this.tagName;for(var i in this.attrs)t+=" "+i+'="'+(this.attrs[i]+"").replace(/&/g,"&").replace(/"/g,""")+'"';return t+=">",e&&(t+="\n"),"string"==typeof this.children?t+=this.children.replace(/[*_\`\[\]<&]/g,function(t){return"&#"+t.charCodeAt(0)+";"}):this.children.forEach(function(e){t+=e}),t+="\n"}walk(t){t(this)}}class u extends m{constructor(t,e){super("path"),this.attrs.d="M"+t+" "+e}m(t,e){return this.attrs.d+="m"+t+" "+e,this}h(t){return this.attrs.d+="h"+t,this}right(t){return this.h(Math.max(0,t))}left(t){return this.h(-Math.max(0,t))}v(t){return this.attrs.d+="v"+t,this}down(t){return this.v(Math.max(0,t))}up(t){return this.v(-Math.max(0,t))}arc(t){var e,i=r,h=r;return"e"!=t[0]&&"w"!=t[1]||(i*=-1),"s"!=t[0]&&"n"!=t[1]||(h*=-1),e="ne"==t||"es"==t||"sw"==t||"wn"==t?1:0,this.attrs.d+="a"+r+" "+r+" 0 0 "+e+" "+i+" "+h,this}arc_8(t,e){const i=r,h=1/Math.sqrt(2)*i,s=i-h;let n="a "+i+" "+i+" 0 0 "+("cw"==e?"1":"0")+" ";const a=t+e;return n+=("ncw"==a?[h,s]:"necw"==a?[s,h]:"ecw"==a?[-s,h]:"secw"==a?[-h,s]:"scw"==a?[-h,-s]:"swcw"==a?[-s,-h]:"wcw"==a?[s,-h]:"nwcw"==a?[h,-s]:"nccw"==a?[-h,s]:"nwccw"==a?[-s,h]:"wccw"==a?[s,h]:"swccw"==a?[h,s]:"sccw"==a?[h,-s]:"seccw"==a?[s,-h]:"eccw"==a?[-s,-h]:"neccw"==a?[-h,-s]:null).join(" "),this.attrs.d+=n,this}l(t,e){return this.attrs.d+="l"+t+" "+e,this}format(){return this.attrs.d+="h.5",this}}class p extends m{constructor(t,e,i,h){super(t,i,h),this.items=e.map(W)}walk(t){t(this),this.items.forEach(e=>e.walk(t))}}class g extends p{constructor(...t){super("svg",t,{class:d}),this.items[0]instanceof _||this.items.unshift(new _),this.items[this.items.length-1]instanceof q||this.items.push(new q),this.up=this.down=this.height=this.width=0;for(const e of this.items)this.width+=e.width+(e.needsSpace?20:0),this.up=Math.max(this.up,e.up-this.height),this.height+=e.height,this.down=Math.max(this.down-e.height,e.down);this.formatted=!1}format(t,e,i,h){t=L(t,20),e=L(e,t,20),i=L(i,t,20);var s=h=L(h,e,20),n=t;n+=this.up;for(var a=new m("g",o?{transform:"translate(.5 .5)"}:{}),r=0;rnew g(...t);class f extends m{constructor(...t){var e=new g(...t);return e.items[0]=new _({type:"complex"}),e.items[e.items.length-1]=new q({type:"complex"}),e}}s.ComplexDiagram=(...t)=>new f(...t);class x extends p{constructor(...t){super("g",t);this.items.length;this.needsSpace=!0,this.up=this.down=this.height=this.width=0;for(var e=0;e0&&(new u(t,e).h(10).addTo(this),t+=10),n.format(t,e,n.width).addTo(this),t+=n.width,e+=n.height,n.needsSpace&&snew x(...t);class T extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("Stack() must have at least one child.");this.width=Math.max.apply(null,this.items.map(function(t){return t.width+(t.needsSpace?20:0)})),this.items.length>1&&(this.width+=2*r),this.needsSpace=!0,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=0;for(var e=this.items.length-1,i=0;i0&&(this.height+=Math.max(2*r,h.up+a)),i1&&(new u(t,e).h(r).addTo(this),t+=r);for(var n=0;n1?2*r:0);d.format(t,e,o).addTo(this),t+=o,e+=d.height,n!==this.items.length-1&&(new u(t,e).arc("ne").down(Math.max(0,d.down+a-2*r)).arc("es").left(o).arc("nw").down(Math.max(0,this.items[n+1].up+a-2*r)).arc("ws").addTo(this),e+=Math.max(d.down+a,2*r)+Math.max(this.items[n+1].up+a,2*r),t=s+r)}return this.items.length>1&&(new u(t,e).h(r).addTo(this),t+=r),new u(t,e).h(h[1]).addTo(this),this}}s.Stack=(...t)=>new T(...t);class v extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("OptionalSequence() must have at least one child.");if(1===t.length)return new x(t);var e=r;this.needsSpace=!1,this.width=0,this.up=0,this.height=U(this.items,function(t){return t.height}),this.down=this.items[0].down;for(var i=0,h=0;h0&&(this.down=Math.max(this.height+this.down,i+Math.max(2*e,s.down+a))-this.height);var d=(s.needsSpace?10:0)+s.width;this.width+=0===h?e+Math.max(d,e):2*e+Math.max(d,e)+e}n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="optseq")}format(t,e,i){var h=r,s=H(i,this.width);new u(t,e).right(s[0]).addTo(this),new u(t+s[0]+this.width,e+this.height).right(s[1]).addTo(this),t+=s[0];for(var n=e-this.up,d=this.items.length-1,o=0;onew v(...t);class M extends p{constructor(...t){if(super("g",t),1===t.length)return new x(t);if(2!==t.length)throw new RangeError("AlternatingSequence() must have one or two children.");this.needsSpace=!1;const e=r,i=a,h=Math.max,s=this.items[0],d=this.items[1],o=1/Math.sqrt(2)*e*2,l=(1-1/Math.sqrt(2))*e*2,c=Math.max(e,a),w=c-l+o,m=h(e+e,c/2+e+e,c/2+i+s.down);this.up=m+s.height+s.up;const u=h(e+e,c/2+e+e,c/2+i+d.up);this.down=u+d.height+d.down,this.height=0;const p=2*(s.needsSpace?10:0)+s.width,g=2*(d.needsSpace?10:0)+d.width;this.width=2*e+h(p,w,g)+2*e,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="altseq")}format(t,e,i){const h=r,s=H(i,this.width);new u(t,e).right(s[0]).addTo(this),t+=s[0],new u(t+this.width,e).right(s[1]).addTo(this);const n=this.items[0],d=this.items[1],o=this.up-n.up,l=this.up-n.up-n.height;new u(t,e).arc("se").up(o-2*h).arc("wn").addTo(this),n.format(t+2*h,e-o,this.width-4*h).addTo(this),new u(t+this.width-2*h,e-l).arc("ne").down(l-2*h).arc("ws").addTo(this);const c=this.down-d.down-d.height,w=this.down-d.down;new u(t,e).arc("ne").down(c-2*h).arc("ws").addTo(this),d.format(t+2*h,e+c,this.width-4*h).addTo(this),new u(t+this.width-2*h,e+w).arc("se").up(w-2*h).arc("wn").addTo(this);const m=1/Math.sqrt(2)*h*2,p=(1-1/Math.sqrt(2))*h*2,g=Math.max(h,a),f=g-p+m,x=(this.width-4*h-f)/2;return new u(t+h,e-g/2-h).arc("ws").right(x).arc_8("n","cw").l(f-m,g-p).arc_8("sw","ccw").right(x).arc("ne").addTo(this),new u(t+h,e+g/2+h).arc("wn").right(x).arc_8("s","ccw").l(f-m,-(g-p)).arc_8("nw","cw").right(x).arc("se").addTo(this),this}}s.AlternatingSequence=(...t)=>new M(...t);class b extends p{constructor(t,...e){if(super("g",e),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of Choice() must be an integer.");if(t<0||t>=e.length)throw new RangeError("The first argument of Choice() must be an index for one of the items.");this.normal=t;var i,h=e.length-1;this.width=Math.max.apply(null,this.items.map(function(t){return t.width}))+4*r,this.height=this.items[t].height,this.up=this.items[0].up;for(var s=0;s=0;o--){let i=this.items[o];o==this.normal-1&&(s=Math.max(2*r,this.items[this.normal].up+a+i.down+i.height)),new u(t,e).arc("se").up(s-2*r).arc("wn").addTo(this),i.format(t+2*r,e-s,d).addTo(this),new u(t+2*r+d,e-s+i.height).arc("ne").down(s-i.height+this.height-2*r).arc("ws").addTo(this),s+=Math.max(r,i.up+a+(0===o?0:this.items[o-1].down+this.items[o-1].height))}for(new u(t,e).right(2*r).addTo(this),this.items[this.normal].format(t+2*r,e,d).addTo(this),new u(t+2*r+d,e+this.height).right(2*r).addTo(this),o=this.normal+1;o<=n;o++){let i=this.items[o];o==this.normal+1&&(s=Math.max(2*r,this.height+this.items[this.normal].down+a+i.up)),new u(t,e).arc("ne").down(s-2*r).arc("ws").addTo(this),i.format(t+2*r,e+s,d).addTo(this),new u(t+2*r+d,e+s+i.height).arc("se").up(s-2*r+i.height-this.height).arc("wn").addTo(this),s+=Math.max(r,i.height+i.down+a+(o==n?0:this.items[o+1].up))}return this}}s.Choice=(...t)=>new b(...t);class S extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("HorizontalChoice() must have at least one child.");if(1===t.length)return new x(t);const e=this.items.slice(0,-1),i=this.items.slice(1,-1),h=this.items[0],s=this.items[this.items.length-1];this.needsSpace=!1,this.width=r,this.width+=2*r*(this.items.length-1),this.width+=U(this.items,t=>t.width+(t.needsSpace?20:0)),this.width+=s.height>0?r:0,this.width+=r,this.height=0,this._upperTrack=Math.max(2*r,a,z(e,t=>t.up)+a),this.up=Math.max(this._upperTrack,s.up),this._lowerTrack=Math.max(a,z(i,t=>t.height+Math.max(t.down+a,2*r)),s.height+s.down+a),h.heightt.width+(t.needsSpace?20:0))+(this.items.length-2)*r*2-r;new u(t,e).arc("se").v(-(this._upperTrack-2*r)).arc("wn").h(d).addTo(this);var o=U(a,t=>t.width+(t.needsSpace?20:0))+(this.items.length-2)*r*2+(n.height>0?r:0)-r,l=t+r+s.width+(s.needsSpace?20:0)+2*r;new u(l,e+this._lowerTrack).h(o).arc("se").v(-(this._lowerTrack-2*r)).arc("wn").addTo(this);for(const[w,m]of function*(t){var e=0;for(const i of t)yield[e,i],e++}(this.items)){0===w?(new u(t,e).h(r).addTo(this),t+=r):(new u(t,e-this._upperTrack).arc("ne").v(this._upperTrack-2*r).arc("ws").addTo(this),t+=2*r);var c=m.width+(m.needsSpace?20:0);m.format(t,e,c).addTo(this),t+=c,w===this.items.length-1?0===m.height?new u(t,e).h(r).addTo(this):new u(t,e+m.height).arc("se").addTo(this):0===w&&m.height>this._lowerTrack?m.height-this._lowerTrack>=2*r?new u(t,e+m.height).arc("se").v(this._lowerTrack-m.height+2*r).arc("wn").addTo(this):new u(t,e+m.height).l(2*r,this._lowerTrack-m.height).addTo(this):new u(t,e+m.height).arc("ne").v(this._lowerTrack-m.height-2*r).arc("ws").addTo(this)}return this}}s.HorizontalChoice=(...t)=>new S(...t);class y extends p{constructor(t,e,...i){if(super("g",i),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of MultipleChoice() must be an integer.");if(t<0||t>=i.length)throw new RangeError("The first argument of MultipleChoice() must be an index for one of the items.");if(this.normal=t,"any"!=e&&"all"!=e)throw new SyntaxError("The second argument of MultipleChoice must be 'any' or 'all'.");this.type=e,this.needsSpace=!0,this.innerWidth=z(this.items,function(t){return t.width}),this.width=30+r+this.innerWidth+r+20,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=this.items[t].height;for(var h=0;ht&&(this.down+=Math.max(e,i.up+a+this.items[h-1].down+this.items[h-1].height))}this.down-=this.items[t].height,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="multiplechoice")}format(t,e,i){var h=H(i,this.width);new u(t,e).right(h[0]).addTo(this),new u(t+h[0]+this.width,e+this.height).right(h[1]).addTo(this),t+=h[0];for(var s,n=this.items[this.normal],d=this.normal-1;d>=0;d--){var o=this.items[d];d==this.normal-1&&(s=Math.max(10+r,n.up+a+o.down+o.height)),new u(t+30,e).up(s-r).arc("wn").addTo(this),o.format(t+30+r,e-s,this.innerWidth).addTo(this),new u(t+30+r+this.innerWidth,e-s+o.height).arc("ne").down(s-o.height+this.height-r-10).addTo(this),0!==d&&(s+=Math.max(r,o.up+a+this.items[d-1].down+this.items[d-1].height))}for(new u(t+30,e).right(r).addTo(this),n.format(t+30+r,e,this.innerWidth).addTo(this),new u(t+30+r+this.innerWidth,e+this.height).right(r).addTo(this),d=this.normal+1;dnew y(...t);class E extends m{constructor(t,e){if(void 0===e)return new b(1,new A,t);if("skip"===e)return new b(0,new A,t);throw"Unknown value for Optional()'s 'skip' argument."}}s.Optional=(...t)=>new E(...t);class k extends m{constructor(t,e){super("g"),e=e||new A,this.item=W(t),this.rep=W(e),this.width=Math.max(this.item.width,this.rep.width)+2*r,this.height=this.item.height,this.up=this.item.up,this.down=Math.max(2*r,this.item.down+a+this.rep.up+this.rep.height+this.rep.down),this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="oneormore")}format(t,e,i){var h=H(i,this.width);new u(t,e).h(h[0]).addTo(this),new u(t+h[0]+this.width,e+this.height).h(h[1]).addTo(this),t+=h[0],new u(t,e).right(r).addTo(this),this.item.format(t+r,e,this.width-2*r).addTo(this),new u(t+this.width-r,e+this.height).right(r).addTo(this);var s=Math.max(2*r,this.item.height+this.item.down+a+this.rep.up);return new u(t+r,e).arc("nw").down(s-2*r).arc("ws").addTo(this),this.rep.format(t+r,e+s,this.width-2*r).addTo(this),new u(t+this.width-r,e+s+this.rep.height).arc("se").up(s-2*r+this.rep.height-this.item.height).arc("en").addTo(this),this}walk(t){t(this),this.item.walk(t),this.rep.walk(t)}}s.OneOrMore=(...t)=>new k(...t);class j extends m{constructor(t,e,i){return new E(new k(t,e),i)}}s.ZeroOrMore=(...t)=>new j(...t);class N extends m{constructor(t,e){super("g"),this.item=W(t),this.label=e instanceof m?e:e?new O(e):void 0,this.width=Math.max(this.item.width+(this.item.needsSpace?20:0),this.label?this.label.width:0,2*r),this.height=this.item.height,this.boxUp=this.up=Math.max(this.item.up+a,r),this.label&&(this.up+=this.label.up+this.label.height+this.label.down),this.down=Math.max(this.item.down+a,r),this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="group")}format(t,e,i){var h=H(i,this.width);return new u(t,e).h(h[0]).addTo(this),new u(t+h[0]+this.width,e+this.height).h(h[1]).addTo(this),t+=h[0],new m("rect",{x:t,y:e-this.boxUp,width:this.width,height:this.boxUp+this.height+this.down,rx:r,ry:r,class:"group-box"}).addTo(this),this.item.format(t,e,this.width).addTo(this),this.label&&this.label.format(t,e-(this.boxUp+this.label.down+this.label.height),this.label.width).addTo(this),this}walk(t){t(this),this.item.walk(t),this.label.walk(t)}}s.Group=(...t)=>new N(...t);class _ extends m{constructor({type:t="simple",label:e}={}){super("g"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,e&&(this.label=""+e,this.width=Math.max(20,this.label.length*c+10)),n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="start")}format(t,e){let i=new u(t,e-10);return"complex"===this.type?i.down(20).m(0,-10).right(this.width).addTo(this):i.down(20).m(10,-20).down(20).m(-10,-10).right(this.width).addTo(this),this.label&&new m("text",{x:t,y:e-15,style:"text-anchor:start"},this.label).addTo(this),this}}s.Start=(...t)=>new _(...t);class q extends m{constructor({type:t="simple"}={}){super("path"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="end")}format(t,e){return"complex"===this.type?this.attrs.d="M "+t+" "+e+" h 20 m 0 -10 v 20":this.attrs.d="M "+t+" "+e+" h 20 m -10 -10 v 20 m 10 -20 v 20",this}}s.End=(...t)=>new q(...t);class C extends m{constructor(t,{href:e,title:i,cls:h}={}){super("g",{class:["terminal",h].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=h,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="terminal")}format(t,e,i){var h=H(i,this.width);new u(t,e).h(h[0]).addTo(this),new u(t+h[0]+this.width,e).h(h[1]).addTo(this),t+=h[0],new m("rect",{x:t,y:e-11,width:this.width,height:this.up+this.down,rx:10,ry:10}).addTo(this);var s=new m("text",{x:t+this.width/2,y:e+4},this.text);return this.href?new m("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new m("title",{},[this.title]).addTo(this),this}}s.Terminal=(...t)=>new C(...t);class D extends m{constructor(t,{href:e,title:i,cls:h=""}={}){super("g",{class:["non-terminal",h].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=h,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="nonterminal")}format(t,e,i){var h=H(i,this.width);new u(t,e).h(h[0]).addTo(this),new u(t+h[0]+this.width,e).h(h[1]).addTo(this),t+=h[0],new m("rect",{x:t,y:e-11,width:this.width,height:this.up+this.down}).addTo(this);var s=new m("text",{x:t+this.width/2,y:e+4},this.text);return this.href?new m("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new m("title",{},[this.title]).addTo(this),this}}s.NonTerminal=(...t)=>new D(...t);class O extends m{constructor(t,{href:e,title:i,cls:h=""}={}){super("g",{class:["comment",h].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=h,this.width=this.text.length*w+10,this.height=0,this.up=8,this.down=8,this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="comment")}format(t,e,i){var h=H(i,this.width);new u(t,e).h(h[0]).addTo(this),new u(t+h[0]+this.width,e+this.height).h(h[1]).addTo(this),t+=h[0];var s=new m("text",{x:t+this.width/2,y:e+5,class:"comment"},this.text);return this.href?new m("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new m("title",{},this.title).addTo(this),this}}s.Comment=(...t)=>new O(...t);class A extends m{constructor(){super("g"),this.width=0,this.height=0,this.up=0,this.down=0,this.needsSpace=!1,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="skip")}format(t,e,i){return new u(t,e).right(i).addTo(this),this}}s.Skip=(...t)=>new A(...t);class R extends m{constructor({width:t=50,up:e=15,height:i=25,down:h=15,needsSpace:s=!0}={}){super("g"),this.width=t,this.height=i,this.up=e,this.down=h,this.needsSpace=!0,n&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="block")}format(t,e,i){var h=H(i,this.width);return new u(t,e).h(h[0]).addTo(this),new u(t+h[0]+this.width,e).h(h[1]).addTo(this),t+=h[0],new m("rect",{x:t,y:e-this.up,width:this.width,height:this.up+this.height+this.down}).addTo(this),this}}function L(...t){return t.reduce(function(t,e){return void 0!==t?t:e})}function H(t,e){var i=t-e;switch(l){case"left":return[0,i];case"right":return[i,0];default:return[i/2,i/2]}}function W(t){return t instanceof m?t:new C(""+t)}function U(t,e){return e||(e=function(t){return t}),t.map(e).reduce(function(t,e){return t+e},0)}function z(t,e){return e||(e=function(t){return t}),Math.max.apply(null,t.map(e))}s.Block=(...t)=>new R(...t);var G=i(74848);function I({children:t}){const e=(0,h.useRef)(null),i=(0,h.useRef)(null),[s,n]=(0,h.useState)(!1),a=e=>{if(e.current)try{const h=(...t)=>new g(...t),s=(...t)=>new C(...t),n=(...t)=>new D(...t),a=(...t)=>new E(...t),r=(...t)=>new x(...t),d=(...t)=>new b(...t),o=(...t)=>new A(...t),l=(...t)=>new O(...t),c=(...t)=>new k(...t),w=(...t)=>new j(...t),m=t.replace(/ComplexDiagram\(/g,"Diagram(").replace(/Start\([^)]*\),?\s*/g,"").replace(/,?\s*End\([^)]*\)/g,"").trim();try{const t=new Function("Diagram","Terminal","NonTerminal","Optional","Sequence","Choice","Skip","Comment","OneOrMore","ZeroOrMore",`'use strict'; return ${m};`)(h,s,n,a,r,d,o,l,c,w);if(!t||"function"!=typeof t.toSVG)throw new Error("Diagram function did not return a valid diagram object");e.current.innerHTML="";const i=t.toSVG();i.querySelectorAll("a[*|href]").forEach(t=>{const e=t.getAttributeNS("http://www.w3.org/1999/xlink","href");e&&t.setAttribute("href",e)}),e.current.appendChild(i)}catch(i){throw console.error("Error in diagram generation:",i),i}}catch(h){console.error("Error rendering railroad diagram:",h),e.current.innerHTML='

                                                              Error rendering diagram. Check console for details.

                                                              '}};(0,h.useEffect)(()=>{a(e)},[t]),(0,h.useEffect)(()=>{if(s){a(i);const t=t=>{"Escape"===t.key&&n(!1)};return document.addEventListener("keydown",t),document.body.style.overflow="hidden",()=>{document.removeEventListener("keydown",t),document.body.style.overflow=""}}},[s,t]);return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)("div",{className:"railroad-diagram-wrapper",children:[(0,G.jsx)("button",{className:"railroad-expand-button",onClick:()=>n(!0),"aria-label":"Expand diagram",title:"View full size",children:(0,G.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:(0,G.jsx)("path",{d:"M1.5 1a.5.5 0 0 0-.5.5v4a.5.5 0 0 1-1 0v-4A1.5 1.5 0 0 1 1.5 0h4a.5.5 0 0 1 0 1h-4zM10 .5a.5.5 0 0 1 .5-.5h4A1.5 1.5 0 0 1 16 1.5v4a.5.5 0 0 1-1 0v-4a.5.5 0 0 0-.5-.5h-4a.5.5 0 0 1-.5-.5zM.5 10a.5.5 0 0 1 .5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 1 0 1h-4A1.5 1.5 0 0 1 0 14.5v-4a.5.5 0 0 1 .5-.5zm15 0a.5.5 0 0 1 .5.5v4a1.5 1.5 0 0 1-1.5 1.5h-4a.5.5 0 0 1 0-1h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 1 .5-.5z"})})}),(0,G.jsx)("div",{ref:e,className:"railroad-diagram-container"})]}),s&&(0,G.jsx)("div",{className:"railroad-modal-overlay",onClick:t=>{t.target===t.currentTarget&&n(!1)},children:(0,G.jsxs)("div",{className:"railroad-modal-content",children:[(0,G.jsx)("button",{className:"railroad-modal-close",onClick:()=>n(!1),"aria-label":"Close",title:"Close (ESC)",children:"\xd7"}),(0,G.jsx)("div",{ref:i,className:"railroad-diagram-container railroad-diagram-modal"})]})})]})}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/3cf17eef.ea2e6002.js b/docs/ignite3/assets/js/3cf17eef.ea2e6002.js deleted file mode 100644 index fd1d970c00..0000000000 --- a/docs/ignite3/assets/js/3cf17eef.ea2e6002.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6567],{28453:(e,n,a)=>{a.d(n,{R:()=>r,x:()=>c});var s=a(96540);const t={},i=s.createContext(t);function r(e){const n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(i.Provider,{value:n},e.children)}},62598:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"sql/reference/data-types-and-functions/index","title":"Data Types and Functions","description":"SQL data types, operators, functions, and operational commands.","source":"@site/docs/sql/reference/data-types-and-functions/index.mdx","sourceDirName":"sql/reference/data-types-and-functions","slug":"/sql/reference/data-types-and-functions/","permalink":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Data Types and Functions"},"sidebar":"tutorialSidebar","previous":{"title":"Grammar Reference","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference"},"next":{"title":"Data Types","permalink":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types"}}');var t=a(74848),i=a(28453);const r={title:"Data Types and Functions"},c="Data Types and Functions",d={},o=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components},{IIcon:a}=n;return a||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"data-types-and-functions",children:"Data Types and Functions"})}),"\n",(0,t.jsx)(n.p,{children:"SQL data types, operators, functions, and operational commands."}),"\n",(0,t.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,t.jsxs)("div",{className:"card-container",children:[(0,t.jsxs)("div",{className:"card",children:[(0,t.jsx)("div",{className:"card__header",children:(0,t.jsxs)("h3",{children:[(0,t.jsx)(a,{icon:"mdi:variable",height:"24"})," Data Types"]})}),(0,t.jsx)("div",{className:"card__body",children:(0,t.jsx)("p",{children:"Supported SQL data types including numeric, string, temporal, and binary types."})}),(0,t.jsx)("div",{className:"card__footer",children:(0,t.jsx)("a",{href:"./data-types-and-functions/data-types",children:"Learn more \u2192"})})]}),(0,t.jsxs)("div",{className:"card",children:[(0,t.jsx)("div",{className:"card__header",children:(0,t.jsxs)("h3",{children:[(0,t.jsx)(a,{icon:"mdi:function-variant",height:"24"})," Operators and Functions"]})}),(0,t.jsx)("div",{className:"card__body",children:(0,t.jsx)("p",{children:"Built-in SQL functions and operators for arithmetic, string manipulation, date operations, and aggregations."})}),(0,t.jsx)("div",{className:"card__footer",children:(0,t.jsx)("a",{href:"./data-types-and-functions/operators-and-functions",children:"Learn more \u2192"})})]}),(0,t.jsxs)("div",{className:"card",children:[(0,t.jsx)("div",{className:"card__header",children:(0,t.jsxs)("h3",{children:[(0,t.jsx)(a,{icon:"mdi:console-line",height:"24"})," Operational Commands"]})}),(0,t.jsx)("div",{className:"card__body",children:(0,t.jsx)("p",{children:"Operational SQL commands including SELECT, COPY INTO, KILL, and system management."})}),(0,t.jsx)("div",{className:"card__footer",children:(0,t.jsx)("a",{href:"./data-types-and-functions/operational-commands",children:"Learn more \u2192"})})]})]}),"\n",(0,t.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"language-definition",children:"Language Definition"})," - DDL, DML, and grammar"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"sql-conformance",children:"SQL Conformance"})," - Standards compliance"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"../working-with-sql",children:"SQL Operations"})," - Execute queries"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/3f98ac4d.c4abe492.js b/docs/ignite3/assets/js/3f98ac4d.c4abe492.js deleted file mode 100644 index e98c68c40f..0000000000 --- a/docs/ignite3/assets/js/3f98ac4d.c4abe492.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6647],{7705:(n,e,a)=>{a.r(e),a.d(e,{assets:()=>o,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"api-reference/native-clients/dotnet/transactions-api","title":"Transactions API","description":"The Transactions API provides ACID transaction support for coordinating multiple operations across tables. Transactions ensure atomicity, consistency, isolation, and durability for distributed data modifications.","source":"@site/docs/api-reference/native-clients/dotnet/transactions-api.md","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/transactions-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"Transactions API","id":"transactions-api","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"ADO.NET API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api"},"next":{"title":"Compute API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api"}}');var r=a(74848),i=a(28453);const s={title:"Transactions API",id:"transactions-api",sidebar_position:5},c="Transactions API",o={},l=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Transaction Lifecycle",id:"transaction-lifecycle",level:3},{value:"Auto-Commit Mode",id:"auto-commit-mode",level:3},{value:"Transaction Scope",id:"transaction-scope",level:3},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Basic Transaction",id:"basic-transaction",level:3},{value:"Using Statement Pattern",id:"using-statement-pattern",level:3},{value:"Transaction with Exception Handling",id:"transaction-with-exception-handling",level:3},{value:"RunInTransactionAsync Pattern",id:"runintransactionasync-pattern",level:3},{value:"Mixing Key-Value and SQL Operations",id:"mixing-key-value-and-sql-operations",level:3},{value:"Cross-Table Transaction",id:"cross-table-transaction",level:3},{value:"Read-Only Transaction",id:"read-only-transaction",level:3},{value:"Transaction Timeout",id:"transaction-timeout",level:3},{value:"Reference",id:"reference",level:2},{value:"ITransactions Interface",id:"itransactions-interface",level:3},{value:"ITransaction Interface",id:"itransaction-interface",level:3},{value:"TransactionOptions Record Struct",id:"transactionoptions-record-struct",level:3},{value:"Best Practices",id:"best-practices",level:3}];function d(n){const e={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"transactions-api",children:"Transactions API"})}),"\n",(0,r.jsx)(e.p,{children:"The Transactions API provides ACID transaction support for coordinating multiple operations across tables. Transactions ensure atomicity, consistency, isolation, and durability for distributed data modifications."}),"\n",(0,r.jsx)(e.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,r.jsx)(e.p,{children:"Transactions group multiple operations into a single atomic unit. Either all operations succeed and commit together, or all operations fail and roll back together."}),"\n",(0,r.jsx)(e.h3,{id:"transaction-lifecycle",children:"Transaction Lifecycle"}),"\n",(0,r.jsx)(e.p,{children:"Begin a transaction using the Transactions API, pass the transaction object to data operations, and explicitly commit or roll back when done. The transaction must be disposed after use."}),"\n",(0,r.jsx)(e.h3,{id:"auto-commit-mode",children:"Auto-Commit Mode"}),"\n",(0,r.jsx)(e.p,{children:"Operations that receive null for the transaction parameter execute in auto-commit mode. Each operation commits immediately after completion. Use this for single operations that do not require coordination."}),"\n",(0,r.jsx)(e.h3,{id:"transaction-scope",children:"Transaction Scope"}),"\n",(0,r.jsx)(e.p,{children:"Pass the same transaction object to multiple operations to include them in the transaction scope. Operations can span different tables and mix key-value and SQL operations."}),"\n",(0,r.jsx)(e.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,r.jsx)(e.h3,{id:"basic-transaction",children:"Basic Transaction"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var transactions = client.Transactions;\r\nvar tx = await transactions.BeginAsync();\r\n\r\ntry\r\n{\r\n var table = await client.Tables.GetTableAsync("accounts");\r\n var view = table.GetRecordView();\r\n\r\n // Multiple operations in transaction\r\n var account1 = new Account { Id = 1 };\r\n var account1Data = await view.GetAsync(tx, account1);\r\n\r\n var account2 = new Account { Id = 2 };\r\n var account2Data = await view.GetAsync(tx, account2);\r\n\r\n // Update balances\r\n account1Data.Value.Balance -= 100;\r\n account2Data.Value.Balance += 100;\r\n\r\n await view.UpsertAsync(tx, account1Data.Value);\r\n await view.UpsertAsync(tx, account2Data.Value);\r\n\r\n // Commit transaction\r\n await tx.CommitAsync();\r\n}\r\ncatch\r\n{\r\n await tx.RollbackAsync();\r\n throw;\r\n}\r\nfinally\r\n{\r\n await tx.DisposeAsync();\r\n}\n'})}),"\n",(0,r.jsx)(e.h3,{id:"using-statement-pattern",children:"Using Statement Pattern"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var transactions = client.Transactions;\r\n\r\nawait using (var tx = await transactions.BeginAsync())\r\n{\r\n var table = await client.Tables.GetTableAsync("orders");\r\n var view = table.GetRecordView();\r\n\r\n var order = new Order\r\n {\r\n OrderId = 1000,\r\n CustomerId = 5,\r\n Amount = 99.99m,\r\n Status = "pending"\r\n };\r\n\r\n await view.UpsertAsync(tx, order);\r\n await tx.CommitAsync();\r\n}\n'})}),"\n",(0,r.jsx)(e.h3,{id:"transaction-with-exception-handling",children:"Transaction with Exception Handling"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'try\r\n{\r\n await using var tx = await client.Transactions.BeginAsync();\r\n\r\n var table = await client.Tables.GetTableAsync("inventory");\r\n var view = table.GetRecordView();\r\n\r\n var product = new Product { Id = 100 };\r\n var productData = await view.GetAsync(tx, product);\r\n\r\n if (!productData.HasValue)\r\n {\r\n throw new Exception("Product not found");\r\n }\r\n\r\n if (productData.Value.Stock < 10)\r\n {\r\n throw new Exception("Insufficient stock");\r\n }\r\n\r\n productData.Value.Stock -= 10;\r\n await view.UpsertAsync(tx, productData.Value);\r\n\r\n await tx.CommitAsync();\r\n}\r\ncatch (Exception ex)\r\n{\r\n Console.WriteLine($"Transaction failed: {ex.Message}");\r\n // Transaction automatically rolls back on exception\r\n}\n'})}),"\n",(0,r.jsx)(e.h3,{id:"runintransactionasync-pattern",children:"RunInTransactionAsync Pattern"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var transactions = client.Transactions;\r\n\r\n// With return value\r\nvar newBalance = await transactions.RunInTransactionAsync(async tx =>\r\n{\r\n var table = await client.Tables.GetTableAsync("accounts");\r\n var view = table.GetRecordView();\r\n\r\n var account = new Account { Id = 1 };\r\n var accountData = await view.GetAsync(tx, account);\r\n\r\n accountData.Value.Balance += 50;\r\n await view.UpsertAsync(tx, accountData.Value);\r\n\r\n return accountData.Value.Balance;\r\n});\r\n\r\nConsole.WriteLine($"New balance: {newBalance}");\r\n\r\n// Without return value\r\nawait transactions.RunInTransactionAsync(async tx =>\r\n{\r\n var table = await client.Tables.GetTableAsync("logs");\r\n var view = table.GetRecordView();\r\n\r\n var entry = new LogEntry\r\n {\r\n Id = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),\r\n Message = "Transaction completed",\r\n Timestamp = DateTime.UtcNow\r\n };\r\n\r\n await view.UpsertAsync(tx, entry);\r\n});\n'})}),"\n",(0,r.jsx)(e.p,{children:"The RunInTransactionAsync method automatically commits on success and rolls back on exception. It also handles disposal automatically."}),"\n",(0,r.jsx)(e.h3,{id:"mixing-key-value-and-sql-operations",children:"Mixing Key-Value and SQL Operations"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'await using var tx = await client.Transactions.BeginAsync();\r\n\r\n// Key-value operation\r\nvar accountsTable = await client.Tables.GetTableAsync("accounts");\r\nvar accountsView = accountsTable.GetRecordView();\r\n\r\nvar account = new Account { Id = 1 };\r\nvar accountData = await accountsView.GetAsync(tx, account);\r\naccountData.Value.Balance -= 100;\r\nawait accountsView.UpsertAsync(tx, accountData.Value);\r\n\r\n// SQL operation in same transaction\r\nvar sql = client.Sql;\r\nvar insertStmt = new SqlStatement(\r\n "INSERT INTO transactions (account_id, amount, timestamp) VALUES (?, ?, ?)");\r\nawait sql.ExecuteAsync(tx, insertStmt, 1L, -100.0m, DateTime.UtcNow);\r\n\r\nawait tx.CommitAsync();\n'})}),"\n",(0,r.jsx)(e.h3,{id:"cross-table-transaction",children:"Cross-Table Transaction"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'await using var tx = await client.Transactions.BeginAsync();\r\n\r\n// Update orders table\r\nvar ordersTable = await client.Tables.GetTableAsync("orders");\r\nvar ordersView = ordersTable.GetRecordView();\r\n\r\nvar order = new Order\r\n{\r\n OrderId = 2000,\r\n CustomerId = 10,\r\n Amount = 199.99m,\r\n Status = "confirmed"\r\n};\r\nawait ordersView.UpsertAsync(tx, order);\r\n\r\n// Update inventory table\r\nvar inventoryTable = await client.Tables.GetTableAsync("inventory");\r\nvar inventoryView = inventoryTable.GetRecordView();\r\n\r\nvar product = new Product { Id = 500 };\r\nvar productData = await inventoryView.GetAsync(tx, product);\r\nproductData.Value.Stock -= 1;\r\nawait inventoryView.UpsertAsync(tx, productData.Value);\r\n\r\nawait tx.CommitAsync();\n'})}),"\n",(0,r.jsx)(e.h3,{id:"read-only-transaction",children:"Read-Only Transaction"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var options = new TransactionOptions(ReadOnly: true);\r\nawait using var tx = await client.Transactions.BeginAsync(options);\r\n\r\nvar table = await client.Tables.GetTableAsync("products");\r\nvar view = table.GetRecordView();\r\n\r\n// Read operations only\r\nvar product1 = await view.GetAsync(tx, new Product { Id = 1 });\r\nvar product2 = await view.GetAsync(tx, new Product { Id = 2 });\r\n\r\n// No commit needed for read-only transactions\r\n// Transaction automatically closes on dispose\n'})}),"\n",(0,r.jsx)(e.p,{children:"Read-only transactions can provide performance benefits and prevent accidental modifications."}),"\n",(0,r.jsx)(e.h3,{id:"transaction-timeout",children:"Transaction Timeout"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var options = new TransactionOptions(ReadOnly: false, TimeoutMillis: 30000);\r\n\r\nawait using var tx = await client.Transactions.BeginAsync(options);\r\n\r\ntry\r\n{\r\n // Perform operations\r\n var table = await client.Tables.GetTableAsync("data");\r\n var view = table.GetRecordView();\r\n\r\n // ... operations ...\r\n\r\n await tx.CommitAsync();\r\n}\r\ncatch (IgniteException ex)\r\n{\r\n Console.WriteLine($"Transaction timeout or conflict: {ex.Message}");\r\n throw;\r\n}\n'})}),"\n",(0,r.jsx)(e.h2,{id:"reference",children:"Reference"}),"\n",(0,r.jsx)(e.h3,{id:"itransactions-interface",children:"ITransactions Interface"}),"\n",(0,r.jsx)(e.p,{children:"Methods:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"ValueTask BeginAsync()"})," - Begin new transaction with default options"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"ValueTask BeginAsync(TransactionOptions options)"})," - Begin new transaction with specified options"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Task RunInTransactionAsync(Func> func, TransactionOptions options = default)"})," - Execute function within transaction and return result"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Task RunInTransactionAsync(Func func, TransactionOptions options = default)"})," - Execute function within transaction (no return value)"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"The RunInTransactionAsync methods handle transaction lifecycle automatically. They commit on successful completion and roll back on exceptions. The transaction is disposed after the function completes."}),"\n",(0,r.jsx)(e.h3,{id:"itransaction-interface",children:"ITransaction Interface"}),"\n",(0,r.jsx)(e.p,{children:"Properties:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"bool IsReadOnly"})," - Whether transaction is read-only"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Methods:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Task CommitAsync()"})," - Commit the transaction, making all changes permanent"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Task RollbackAsync()"})," - Roll back the transaction, discarding all changes"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Resource management:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Implements ",(0,r.jsx)(e.strong,{children:"IAsyncDisposable"})," and ",(0,r.jsx)(e.strong,{children:"IDisposable"})]}),"\n",(0,r.jsx)(e.li,{children:"Must be disposed after use"}),"\n",(0,r.jsx)(e.li,{children:"Automatic rollback occurs if disposed without explicit commit"}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"transactionoptions-record-struct",children:"TransactionOptions Record Struct"}),"\n",(0,r.jsx)(e.p,{children:"A readonly record struct that configures transaction behavior. Construct using named parameters:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:"new TransactionOptions(ReadOnly: true)\r\nnew TransactionOptions(ReadOnly: false, TimeoutMillis: 30000)\n"})}),"\n",(0,r.jsx)(e.p,{children:"Parameters:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"ReadOnly"})," (bool) - Mark transaction as read-only (default: false). Read-only transactions provide a snapshot view of data at a certain point in time. They are lock-free and perform better than normal transactions, but do not permit data modifications."]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"TimeoutMillis"})," (long) - Transaction timeout in milliseconds (default: 0). A value of 0 means use the default timeout configured via ignite.transaction.timeout configuration property."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"The timeout controls how long the transaction can remain active before automatic rollback."}),"\n",(0,r.jsx)(e.h3,{id:"best-practices",children:"Best Practices"}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Always dispose transactions"})," using using statements or explicit disposal. Undisposed transactions hold cluster resources."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Commit explicitly"})," before disposal. Implicit rollback on disposal can hide logic errors."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Keep transactions short"})," to reduce lock contention and improve throughput. Long-running transactions impact cluster performance."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Handle exceptions properly"})," to ensure rollback occurs when operations fail. Use try-catch blocks around transaction logic."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Use RunInTransactionAsync"})," for simple cases where automatic lifecycle management is sufficient. This reduces boilerplate code and ensures proper cleanup."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Pass transaction to all operations"})," that should be coordinated. Mixing null and transaction parameters within related operations breaks atomicity."]})]})}function u(n={}){const{wrapper:e}={...(0,i.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(d,{...n})}):d(n)}},28453:(n,e,a)=>{a.d(e,{R:()=>s,x:()=>c});var t=a(96540);const r={},i=t.createContext(r);function s(n){const e=t.useContext(i);return t.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function c(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:s(n.components),t.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/407a0507.aa2fdacf.js b/docs/ignite3/assets/js/407a0507.aa2fdacf.js deleted file mode 100644 index 271f4ed89f..0000000000 --- a/docs/ignite3/assets/js/407a0507.aa2fdacf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1785],{11470:(e,t,n)=>{n.d(t,{A:()=>E});var r=n(96540),i=n(34164),s=n(17559),a=n(23104),o=n(56347),c=n(205),l=n(57485),d=n(31682),u=n(70679);function h(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return h(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,d.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[t,n])}function x({value:e,tabValues:t}){return t.some(t=>t.value===e)}function m({queryString:e=!1,groupId:t}){const n=(0,o.W6)(),i=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(i),(0,r.useCallback)(e=>{if(!i)return;const t=new URLSearchParams(n.location.search);t.set(i,e),n.replace({...n.location,search:t.toString()})},[i,n])]}function f(e){const{defaultValue:t,queryString:n=!1,groupId:i}=e,s=p(e),[a,o]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s})),[l,d]=m({queryString:n,groupId:i}),[h,f]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,i]=(0,u.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&i.set(e)},[t,i])]}({groupId:i}),g=(()=>{const e=l??h;return x({value:e,tabValues:s})?e:null})();(0,c.A)(()=>{g&&o(g)},[g]);return{selectedValue:a,selectValue:(0,r.useCallback)(e=>{if(!x({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),f(e)},[d,f,s]),tabValues:s}}var g=n(92303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(74848);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),l=e=>{const t=e.currentTarget,i=o.indexOf(t),a=s[i].value;a!==n&&(c(t),r(a))},d=e=>{let t=null;switch(e.key){case"Enter":l(e);break;case"ArrowRight":{const n=o.indexOf(e.currentTarget)+1;t=o[n]??o[0];break}case"ArrowLeft":{const n=o.indexOf(e.currentTarget)-1;t=o[n]??o[o.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},e),children:s.map(({value:e,label:t,attributes:r})=>(0,b.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{o.push(e)},onKeyDown:d,onClick:l,...r,className:(0,i.A)("tabs__item",j.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function S({lazy:e,children:t,selectedValue:n}){const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:s.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function y(e){const t=f(e);return(0,b.jsxs)("div",{className:(0,i.A)(s.G.tabs.container,"tabs-container",j.tabList),children:[(0,b.jsx)(v,{...t,...e}),(0,b.jsx)(S,{...t,...e})]})}function E(e){const t=(0,g.A)();return(0,b.jsx)(y,{...e,children:h(e.children)},String(t))}},16493:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>c,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"developers-guide/sql/odbc/connection-string","title":"Connection String","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/sql/odbc/connection-string.md","sourceDirName":"developers-guide/sql/odbc","slug":"/developers-guide/sql/odbc/connection-string","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Connection String","sidebar_label":"Connection String"},"sidebar":"tutorialSidebar","previous":{"title":"ODBC Driver","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver"},"next":{"title":"Querying and Modifying Data","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data"}}');var i=n(74848),s=n(28453),a=n(11470),o=n(19365);const c={title:"Connection String",sidebar_label:"Connection String"},l=void 0,d={},u=[{value:"Connection String Format",id:"connection-string-format",level:2},{value:"Supported Arguments",id:"supported-arguments",level:2},{value:"Connection String Samples",id:"connection-string-samples",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n","\n",(0,i.jsx)(t.h2,{id:"connection-string-format",children:"Connection String Format"}),"\n",(0,i.jsx)(t.p,{children:"The ODBC Driver supports standard connection string format. Here is the formal syntax:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"connection-string ::= empty-string[;] | attribute[;] | attribute; connection-string\r\nempty-string ::=\r\nattribute ::= attribute-keyword=attribute-value | DRIVER=[{]attribute-value[}]\r\nattribute-keyword ::= identifier\r\nattribute-value ::= character-string\n"})}),"\n",(0,i.jsx)(t.p,{children:"In simple terms, an ODBC connection URL is a string with parameters of your choice separated by semicolons."}),"\n",(0,i.jsx)(t.h2,{id:"supported-arguments",children:"Supported Arguments"}),"\n",(0,i.jsxs)(t.p,{children:["The ODBC driver supports and uses several connection string/DSN arguments. All parameter names are case-insensitive - ",(0,i.jsx)(t.code,{children:"ADDRESS"}),", ",(0,i.jsx)(t.code,{children:"Address"}),", and ",(0,i.jsx)(t.code,{children:"address"})," all are valid parameter names and refer to the same parameter. If an argument is not specified, the default value is used. The exception to this rule is the ",(0,i.jsx)(t.code,{children:"ADDRESS"})," attribute. If it is not specified, ",(0,i.jsx)(t.code,{children:"SERVER"})," and ",(0,i.jsx)(t.code,{children:"PORT"})," attributes are used instead."]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Attribute keyword"}),(0,i.jsx)(t.th,{children:"Description"}),(0,i.jsx)(t.th,{children:"Default Value"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"ADDRESS"})}),(0,i.jsxs)(t.td,{children:["Address of the remote node to connect to. The format is: ",(0,i.jsx)(t.code,{children:"[:]"}),". For example: ",(0,i.jsx)(t.code,{children:"localhost"}),", ",(0,i.jsx)(t.code,{children:"example.com:12345"}),", ",(0,i.jsx)(t.code,{children:"127.0.0.1"}),", ",(0,i.jsx)(t.code,{children:"192.168.3.80:5893"}),".",(0,i.jsx)("br",{}),"If this attribute is specified, then ",(0,i.jsx)(t.code,{children:"SERVER"})," and ",(0,i.jsx)(t.code,{children:"PORT"})," arguments are ignored."]}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SERVER"})}),(0,i.jsxs)(t.td,{children:["Address of the node to connect to.",(0,i.jsx)("br",{}),"This argument value is ignored if ADDRESS argument is specified."]}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"PORT"})}),(0,i.jsxs)(t.td,{children:["Port on which ",(0,i.jsx)(t.code,{children:"OdbcProcessor"})," of the node is listening.",(0,i.jsx)("br",{}),"This argument value is ignored if ",(0,i.jsx)(t.code,{children:"ADDRESS"})," argument is specified."]}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"10800"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"IDENTITY"}),(0,i.jsxs)(t.td,{children:["Identity to use for authentication. Depending on the authenticator used on the server side, it can be a user name or another unique identifier. See the ",(0,i.jsx)(t.a,{href:"/docs/ignite3/3.0.0/administrators-guide/security/authentication",children:"Authentication"})," topic for details."]}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"SECRET"}),(0,i.jsxs)(t.td,{children:["Secret to use for authentication. Depending on the authenticator used on the server side, it can be a user password or another type of user-specific secret. See the ",(0,i.jsx)(t.a,{href:"/docs/ignite3/3.0.0/administrators-guide/security/authentication",children:"Authentication"})," topic for details."]}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SCHEMA"})}),(0,i.jsx)(t.td,{children:"Schema name."}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"PUBLIC"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"PAGE_SIZE"})}),(0,i.jsx)(t.td,{children:"Number of rows returned in response to a fetching request to the data source. Default value should be fine in most cases. Setting a low value can result in slow data fetching while setting a high value can result in additional memory usage by the driver, and additional delay when the next page is being retrieved."}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"1024"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SSL_MODE"})}),(0,i.jsxs)(t.td,{children:["Determines whether the SSL connection should be negotiated with the server. Use ",(0,i.jsx)(t.code,{children:"require"})," or ",(0,i.jsx)(t.code,{children:"disable"})," mode as needed."]}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"disable"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SSL_KEY_FILE"})}),(0,i.jsx)(t.td,{children:"Specifies the path to the file containing the SSL server private key."}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SSL_CERT_FILE"})}),(0,i.jsx)(t.td,{children:"Specifies the path to the file containing the SSL server certificate."}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SSL_CA_FILE"})}),(0,i.jsx)(t.td,{children:"Specifies the path to the file containing the SSL server certificate authority (CA)."}),(0,i.jsx)(t.td,{children:"None."})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"connection-string-samples",children:"Connection String Samples"}),"\n",(0,i.jsxs)(t.p,{children:["You can find samples of the connection string below. These strings can be used with ",(0,i.jsx)(t.code,{children:"SQLDriverConnect"})," ODBC call to establish connection with a node."]}),"\n",(0,i.jsxs)(a.A,{children:[(0,i.jsx)(o.A,{value:"specific",label:"Specific schema",children:(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"DRIVER={Apache Ignite 3};ADDRESS=localhost:10800;SCHEMA=yourSchemaName\n"})})}),(0,i.jsx)(o.A,{value:"default",label:"Default schema",children:(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"DRIVER={Apache Ignite 3};ADDRESS=localhost:10800\n"})})}),(0,i.jsx)(o.A,{value:"auth",label:"Authentication",children:(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"DRIVER={Apache Ignite 3};ADDRESS=localhost:10800;IDENTITY=yourid;SECRET=yoursecret\n"})})}),(0,i.jsx)(o.A,{value:"custom",label:"Custom page size",children:(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"DRIVER={Apache Ignite 3};ADDRESS=localhost:10800;SCHEMA=yourSchemaName;PAGE_SIZE=4096\n"})})})]})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},19365:(e,t,n)=>{n.d(t,{A:()=>a});n(96540);var r=n(34164);const i={tabItem:"tabItem_Ymn6"};var s=n(74848);function a({children:e,hidden:t,className:n}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,n),hidden:t,children:e})}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var r=n(96540);const i={},s=r.createContext(i);function a(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/42f764c6.c5b390c3.js b/docs/ignite3/assets/js/42f764c6.c5b390c3.js deleted file mode 100644 index 643b1f9133..0000000000 --- a/docs/ignite3/assets/js/42f764c6.c5b390c3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3346],{21441:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"understand/performance/index","title":"Performance","description":"Understanding query performance and optimization.","source":"@site/docs/understand/performance/index.mdx","sourceDirName":"understand/performance","slug":"/understand/performance/","permalink":"/docs/ignite3/3.1.0/understand/performance/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Performance"},"sidebar":"tutorialSidebar","previous":{"title":"Security Architecture","permalink":"/docs/ignite3/3.1.0/understand/architecture/security"},"next":{"title":"Using EXPLAIN Command","permalink":"/docs/ignite3/3.1.0/understand/performance/using-explain"}}');var i=r(74848),s=r(28453);const c={title:"Performance"},a="Performance",o={},d=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components},{IIcon:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"performance",children:"Performance"})}),"\n",(0,i.jsx)(n.p,{children:"Understanding query performance and optimization."}),"\n",(0,i.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,i.jsxs)("div",{className:"card-container",children:[(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(r,{icon:"mdi:chart-timeline-variant",height:"24"})," Using EXPLAIN"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Analyze query execution plans with the EXPLAIN statement."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./performance/using-explain",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(r,{icon:"mdi:cog-transfer-outline",height:"24"})," EXPLAIN Operators"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Reference guide for relational operators in execution plans."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./performance/explain-operators",children:"Learn more \u2192"})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"../sql/advanced",children:"SQL Advanced"})," - Performance tuning guide"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"core-concepts",children:"Core Concepts"})," - Fundamental concepts"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"architecture",children:"Architecture"})," - Architecture deep dive"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>c,x:()=>a});var t=r(96540);const i={},s=t.createContext(i);function c(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/430edd65.cecc5225.js b/docs/ignite3/assets/js/430edd65.cecc5225.js deleted file mode 100644 index 2da0ca1e2d..0000000000 --- a/docs/ignite3/assets/js/430edd65.cecc5225.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1326],{9054:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"quick-start/start-cluster","title":"How to Start an Ignite 3 Cluster in Docker","description":"{/*","source":"@site/versioned_docs/version-3.0.0/quick-start/start-cluster.md","sourceDirName":"quick-start","slug":"/quick-start/start-cluster","permalink":"/docs/ignite3/3.0.0/quick-start/start-cluster","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"How to Start an Ignite 3 Cluster in Docker","sidebar_label":"Start Cluster in Docker"},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/docs/ignite3/3.0.0/quick-start/getting-started-guide"},"next":{"title":"Explore SQL","permalink":"/docs/ignite3/3.0.0/quick-start/explore-sql"}}');var i=t(74848),o=t(28453);const s={title:"How to Start an Ignite 3 Cluster in Docker",sidebar_label:"Start Cluster in Docker"},l=void 0,c={},a=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Create a Docker Compose Configuration",id:"step-1-create-a-docker-compose-configuration",level:2},{value:"Step 2: Start the Ignite Cluster",id:"step-2-start-the-ignite-cluster",level:2},{value:"Step 3: Initialize the Cluster",id:"step-3-initialize-the-cluster",level:2},{value:"Step 4: Verify Your Cluster",id:"step-4-verify-your-cluster",level:2},{value:"Understanding Port Configuration",id:"understanding-port-configuration",level:2},{value:"Stopping the Cluster",id:"stopping-the-cluster",level:2},{value:"Removing the Cluster",id:"removing-the-cluster",level:2}];function d(e){const n={code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(n.p,{children:"This guide walks you through the process of setting up and running an Apache Ignite 3 cluster using Docker containers. Follow these steps to get a three-node cluster up and running quickly."}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Up-to-date Docker and Docker Compose installed on your system"}),"\n",(0,i.jsx)(n.li,{children:"Basic familiarity with command-line operations"}),"\n",(0,i.jsx)(n.li,{children:"The code editor of your choice (VS Code, IntelliJ IDEA, etc.)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"step-1-create-a-docker-compose-configuration",children:"Step 1: Create a Docker Compose Configuration"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Create a file named ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})," in your project directory:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'name: ignite3\r\n\r\nx-ignite-def: &ignite-def\r\n image: apacheignite/ignite:3.0.0\r\n environment:\r\n JVM_MAX_MEM: "4g"\r\n JVM_MIN_MEM: "4g"\r\n configs:\r\n - source: node_config\r\n target: /opt/ignite/etc/ignite-config.conf\r\n mode: 0644\r\n\r\nservices:\r\n node1:\r\n <<: *ignite-def\r\n command: --node-name node1\r\n ports:\r\n - "10300:10300"\r\n - "10800:10800"\r\n node2:\r\n <<: *ignite-def\r\n command: --node-name node2\r\n ports:\r\n - "10301:10300"\r\n - "10801:10800"\r\n node3:\r\n <<: *ignite-def\r\n command: --node-name node3\r\n ports:\r\n - "10302:10300"\r\n - "10802:10800"\r\n\r\nconfigs:\r\n node_config:\r\n content: |\r\n ignite {\r\n network {\r\n port: 3344\r\n nodeFinder.netClusterNodes = ["node1:3344", "node2:3344", "node3:3344"]\r\n }\r\n }\n'})}),"\n",(0,i.jsx)(n.h2,{id:"step-2-start-the-ignite-cluster",children:"Step 2: Start the Ignite Cluster"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Open a terminal in the directory containing your ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,i.jsx)(n.li,{children:"Run the following command to start the cluster:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Verify that all containers are running:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose ps\n"})}),"\n",(0,i.jsx)(n.p,{children:"Here is how the command output may look:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:'NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS\r\nignite3-node1-1 apacheignite/ignite:3.0.0 "docker-entrypoint.s\u2026" node1 13 seconds ago Up 10 seconds 0.0.0.0:10300->10300/tcp, 3344/tcp, 0.0.0.0:10800->10800/tcp\r\nignite3-node2-1 apacheignite/ignite:3.0.0 "docker-entrypoint.s\u2026" node2 13 seconds ago Up 10 seconds 3344/tcp, 0.0.0.0:10301->10300/tcp, 0.0.0.0:10801->10800/tcp\r\nignite3-node3-1 apacheignite/ignite:3.0.0 "docker-entrypoint.s\u2026" node3 13 seconds ago Up 10 seconds 3344/tcp, 0.0.0.0:10302->10300/tcp, 0.0.0.0:10802->10800/tcp\n'})}),"\n",(0,i.jsx)(n.p,{children:"Your nodes are now running, but the cluster is not initialized."}),"\n",(0,i.jsx)(n.h2,{id:"step-3-initialize-the-cluster",children:"Step 3: Initialize the Cluster"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Start the Ignite CLI in Docker:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"docker run --rm -it --network=host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 apacheignite/ignite:3.0.0 cli\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Inside the CLI, connect to one of the nodes:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"connect http://localhost:10300\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Confirm the connection to the default node in the CLI tool."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Initialize the cluster with a name and the metastorage group of all nodes:"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster init --name=ignite3 --metastorage-group=node1,node2,node3\n"})}),"\n",(0,i.jsx)(n.p,{children:"The output from this step should be similar to this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:" # ___ __\r\n ### / | ____ ____ _ _____ / /_ ___\r\n # ##### / /| | / __ \\ / __ `// ___// __ \\ / _ \\\r\n ### ###### / ___ | / /_/ // /_/ // /__ / / / // ___/\r\n ##### ####### /_/ |_|/ .___/ \\__,_/ \\___//_/ /_/ \\___/\r\n ####### ###### /_/\r\n ######## #### ____ _ __ _____\r\n # ######## ## / _/____ _ ____ (_)/ /_ ___ |__ /\r\n #### ####### # / / / __ `// __ \\ / // __// _ \\ /_ <\r\n ##### ##### _/ / / /_/ // / / // // /_ / ___/ ___/ /\r\n #### ## /___/ \\__, //_/ /_//_/ \\__/ \\___/ /____/\r\n ## /____/\r\n\r\n Apache Ignite CLI version 3.0.0\r\n\r\n\r\nYou appear to have not connected to any node yet. Do you want to connect to the default node http://localhost:10300? [Y/n] y\r\nConnected to http://localhost:10300\r\nThe cluster is not initialized. Run cluster init command to initialize it.\r\n[node1]> cluster init --name=ignite3 --metastorage-group=node1,node2,node3\r\nCluster was initialized successfully\n"})}),"\n",(0,i.jsx)(n.h2,{id:"step-4-verify-your-cluster",children:"Step 4: Verify Your Cluster"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Use the ",(0,i.jsx)(n.code,{children:"cluster status"})," CLI command to verify your cluster is running correctly."]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster status\n"})}),"\n",(0,i.jsx)(n.p,{children:"The output should look similar to this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"[name: ignite3, nodes: 3, status: active, cmgNodes: [node1, node2, node3], msNodes: [node1, node2, node3]]\n"})}),"\n",(0,i.jsx)(n.p,{children:"This means that all 3 nodes found each other and formed an active cluster."}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Exit the CLI by typing ",(0,i.jsx)(n.code,{children:"exit"})," or pressing Ctrl+D. This will also stop the CLI container."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Congratulations! You have a local Apache Ignite 3 cluster running that you can use for development."}),"\n",(0,i.jsx)(n.h2,{id:"understanding-port-configuration",children:"Understanding Port Configuration"}),"\n",(0,i.jsx)(n.p,{children:"The Docker Compose file exposes two types of ports for each node:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"10300-10302"}),": REST API ports for administrative operations;"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"10800-10802"}),": Client connection ports for your applications."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"stopping-the-cluster",children:"Stopping the Cluster"}),"\n",(0,i.jsx)(n.p,{children:"If you want to pause your cluster:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose stop\r\n\r\n[+] Stopping 3/3\r\n \u2714 Container ignite3-node1-1 Stopped\r\n \u2714 Container ignite3-node2-1 Stopped\r\n \u2714 Container ignite3-node3-1 Stopped\n"})}),"\n",(0,i.jsx)(n.p,{children:"This will stop the containers and retain your data."}),"\n",(0,i.jsx)(n.h2,{id:"removing-the-cluster",children:"Removing the Cluster"}),"\n",(0,i.jsx)(n.p,{children:"When you are done working with the cluster, you can remove it using:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose down\r\n\r\n[+] Running 4/4\r\n \u2714 Container ignite3-node3-1 Removed\r\n \u2714 Container ignite3-node2-1 Removed\r\n \u2714 Container ignite3-node1-1 Removed\r\n \u2714 Network ignite3_default Removed\n"})}),"\n",(0,i.jsx)(n.p,{children:"This will stop and remove all the containers. Your data will be lost unless you have configured persistent storage."})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/4436c0ec.715d7aa2.js b/docs/ignite3/assets/js/4436c0ec.715d7aa2.js deleted file mode 100644 index 53e69e0baa..0000000000 --- a/docs/ignite3/assets/js/4436c0ec.715d7aa2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9901],{22312:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"configure-and-operate/reference/cluster-configuration","title":"Cluster Configuration Parameters","description":"Ignite 3 cluster configuration is shared across the whole cluster. Regardless of which node you apply the configuration on, it will be propagated to all nodes in the cluster.","source":"@site/docs/configure-and-operate/reference/cluster-configuration.md","sourceDirName":"configure-and-operate/reference","slug":"/configure-and-operate/reference/cluster-configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"cluster-configuration","title":"Cluster Configuration Parameters","sidebar_label":"Cluster Configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Node Configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration"},"next":{"title":"CLI Configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration"}}');var r=i(74848),s=i(28453);const l={id:"cluster-configuration",title:"Cluster Configuration Parameters",sidebar_label:"Cluster Configuration"},d=void 0,c={},a=[{value:"Checking Cluster Configuration",id:"checking-cluster-configuration",level:2},{value:"Changing Cluster Configuration",id:"changing-cluster-configuration",level:2},{value:"Update via REPL",id:"update-via-repl",level:3},{value:"Update via Non-Interactive Mode",id:"update-via-non-interactive-mode",level:3},{value:"Exporting Cluster Configuration",id:"exporting-cluster-configuration",level:2},{value:"Configuration Parameters",id:"configuration-parameters",level:2},{value:"Event Log Configuration",id:"event-log-configuration",level:3},{value:"Garbage Collection Configuration",id:"garbage-collection-configuration",level:3},{value:"System Configuration",id:"system-configuration",level:3},{value:"Metrics Configuration",id:"metrics-configuration",level:3},{value:"Replication Configuration",id:"replication-configuration",level:3},{value:"Schema Sync Configuration",id:"schema-sync-configuration",level:3},{value:"Security Configuration",id:"security-configuration",level:3},{value:"SQL Configuration",id:"sql-configuration",level:3},{value:"Transactions Configuration",id:"transactions-configuration",level:3},{value:"System Configuration (Internal)",id:"system-configuration-internal",level:3}];function o(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"Ignite 3 cluster configuration is shared across the whole cluster. Regardless of which node you apply the configuration on, it will be propagated to all nodes in the cluster."}),"\n",(0,r.jsxs)(n.p,{children:['In Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,r.jsx)(n.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node."]}),"\n",(0,r.jsx)(n.h2,{id:"checking-cluster-configuration",children:"Checking Cluster Configuration"}),"\n",(0,r.jsx)(n.p,{children:"To get cluster configuration, use the CLI tool."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Start the CLI tool and connect to any node in the cluster."}),"\n",(0,r.jsxs)(n.li,{children:["Run the ",(0,r.jsx)(n.code,{children:"cluster config show"})," command."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"The CLI tool will print the full cluster configuration. If you only need a part of the configuration, you can narrow down the search by providing the properties you need as the command argument, for example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster config show ignite.transaction\n"})}),"\n",(0,r.jsx)(n.h2,{id:"changing-cluster-configuration",children:"Changing Cluster Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["Cluster configuration is changed from the CLI tool. You can update it both in the interactive (REPL) and non-interactive mode by passing a configuration file with the ",(0,r.jsx)(n.code,{children:"--file"})," parameter."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"Values set directly via the CLI take precedence over values set in the configuration file."})}),"\n",(0,r.jsx)(n.h3,{id:"update-via-repl",children:"Update via REPL"}),"\n",(0,r.jsx)(n.p,{children:"Start the CLI tool and connect to any node in the cluster."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Run the ",(0,r.jsx)(n.code,{children:"cluster config update"})," command and provide the updated configuration as the command argument, for example:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster config update ignite.system.idleSafeTimeSyncIntervalMillis=600\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To update one or more parameters, pass the configuration file to the ",(0,r.jsx)(n.code,{children:"cluster config update"})," command:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster config update --file ../ignite-config.conf\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"You also can update the configuration combining both approaches:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster config update --file ../ignite-config.conf ignite.system.idleSafeTimeSyncIntervalMillis=600\n"})}),"\n",(0,r.jsx)(n.p,{children:"The updated configuration will automatically be applied across the cluster."}),"\n",(0,r.jsx)(n.h3,{id:"update-via-non-interactive-mode",children:"Update via Non-Interactive Mode"}),"\n",(0,r.jsxs)(n.p,{children:["You can also modify cluster configuration via ",(0,r.jsx)(n.a,{href:"/3.1.0/tools/cli-commands#non-interactive-cli-mode",children:"non-interactive"})," CLI mode without starting the CLI tool first."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Pass the configuration file with the ",(0,r.jsx)(n.code,{children:"--file"})," parameter:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"bin/ignite3 cluster config update --file ../ignite-config.conf\n"})}),"\n",(0,r.jsx)(n.p,{children:"The updated configuration will automatically be applied across the cluster."}),"\n",(0,r.jsx)(n.h2,{id:"exporting-cluster-configuration",children:"Exporting Cluster Configuration"}),"\n",(0,r.jsx)(n.p,{children:"If you need to export cluster configuration to file, use the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"bin/ignite3 cluster config show > cluster-config.txt\n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuration-parameters",children:"Configuration Parameters"}),"\n",(0,r.jsx)(n.h3,{id:"event-log-configuration",children:"Event Log Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "eventlog" : {\r\n "channels" : [ ],\r\n "sinks" : [ ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"channels"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"A named list of event log channels."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Valid channels"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"sinks"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"A named list of event log sinks."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Valid sinks"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"garbage-collection-configuration",children:"Garbage Collection Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "gc" : {\r\n "batchSize" : 5,\r\n "lowWatermark" : {\r\n "dataAvailabilityTimeMillis" : 600000,\r\n "updateIntervalMillis" : 300000\r\n },\r\n "threads" : 16\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"batchSize"}),(0,r.jsx)(n.td,{children:"5"}),(0,r.jsx)(n.td,{children:"The number of entries to be removed by the garbage collection batch for each partition"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"lowWatermark.dataAvailabilityTimeMillis"}),(0,r.jsx)(n.td,{children:"600000"}),(0,r.jsx)(n.td,{children:"The duration the outdated versions are available for, in milliseconds."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"1000 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"lowWatermark.updateIntervalMillis"}),(0,r.jsx)(n.td,{children:"300000"}),(0,r.jsx)(n.td,{children:"The interval of the low watermark updates."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"threads"}),(0,r.jsx)(n.td,{children:"Runtime.getRuntime().availableProcessors()"}),(0,r.jsx)(n.td,{children:"The number of threads used by the garbage collector."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"system-configuration",children:"System Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "system" : {\r\n "idleSafeTimeSyncIntervalMillis" : 500\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"idleSafeTimeSyncIntervalMillis"}),(0,r.jsx)(n.td,{children:"500"}),(0,r.jsx)(n.td,{children:"Period (in milliseconds) used to determine how often to issue time sync commands when Metastorage is idle (no Writes are issued). Should not exceed schemaSync.delayDurationMillis. The optimal value is schemaSync.delayDurationMillis / 2."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No (becomes effective on Metastorage leader reelection)"}),(0,r.jsx)(n.td,{children:"1 - inf"})]})})]}),"\n",(0,r.jsx)(n.h3,{id:"metrics-configuration",children:"Metrics Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "metrics" : {\r\n "exporters" : [ ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"exporters"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The list of ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/monitoring/config-metrics",children:"metric"})," exporters currently used."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Valid exporters"})]})})]}),"\n",(0,r.jsx)(n.h3,{id:"replication-configuration",children:"Replication Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "replication" : {\r\n "idleSafeTimePropagationDurationMillis" : 1000,\r\n "leaseAgreementAcceptanceTimeLimitMillis" : 120000,\r\n "leaseExpirationIntervalMillis" : 5000,\r\n "rpcTimeoutMillis" : 60000,\r\n "batchSizeBytes" : 8192\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"idleSafeTimePropagationDurationMillis"}),(0,r.jsx)(n.td,{children:"1000"}),(0,r.jsx)(n.td,{children:"Interval between Partition Safe Time updates."}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"N/A"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"leaseAgreementAcceptanceTimeLimitMillis"}),(0,r.jsx)(n.td,{children:"120000"}),(0,r.jsx)(n.td,{children:"The maximum duration of an election for a new partition leaseholder, in milliseconds."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"N/A"}),(0,r.jsx)(n.td,{children:"5000 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"leaseExpirationIntervalMillis"}),(0,r.jsx)(n.td,{children:"5000"}),(0,r.jsx)(n.td,{children:"The duration of a single lease."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"N/A"}),(0,r.jsx)(n.td,{children:"2000 - 120000"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"rpcTimeoutMillis"}),(0,r.jsx)(n.td,{children:"60000"}),(0,r.jsx)(n.td,{children:"Replication request processing timeout."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"batchSizeBytes"}),(0,r.jsx)(n.td,{children:"8192"}),(0,r.jsx)(n.td,{children:"Batch length (in bytes) to be written into physical storage. Used to limit the size of an atomical Write."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"1 - Integer.MAX_VALUE"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"schema-sync-configuration",children:"Schema Sync Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "schemaSync" : {\r\n "delayDurationMillis" : 100,\r\n "maxClockSkewMillis" : 500\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"delayDurationMillis"}),(0,r.jsx)(n.td,{children:"100"}),(0,r.jsx)(n.td,{children:"The delay after which a schema update becomes active. Should exceed the typical time to deliver a schema update to all cluster nodes, otherwise delays in handling operations are possible. Should not be less than system.idleSafeTimeSyncIntervalMillis. The optimal value is system.idleSafeTimeSyncIntervalMillis * 2."}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"N/A"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"maxClockSkewMillis"}),(0,r.jsx)(n.td,{children:"500"}),(0,r.jsx)(n.td,{children:"Maximum physical clock skew (ms) tolerated by the cluster. If the difference between physical clocks of two nodes in the cluster exceeds this value, the cluster might demonstrate abnormal behavior."}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"N/A"}),(0,r.jsx)(n.td,{children:"0 - inf"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"security-configuration",children:"Security Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "security" : {\r\n "authentication" : {\r\n "providers" : [ {\r\n "name" : "default",\r\n "type" : "basic",\r\n "users" : [ {\r\n "password" : "********",\r\n "username" : "ignite",\r\n "displayName" : "ignite"\r\n }]\r\n } ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Authentication parameters"})}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"providers.name"}),(0,r.jsx)(n.td,{children:"default"}),(0,r.jsx)(n.td,{children:"The name of the authentication provider."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"A valid string"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"providers.type"}),(0,r.jsx)(n.td,{children:"basic"}),(0,r.jsx)(n.td,{children:"The authentication provider type."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"basic, ldap"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"providers.users"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"The list of users registered with the specific provider."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"providers.users.displayName"}),(0,r.jsx)(n.td,{children:"ignite"}),(0,r.jsx)(n.td,{children:"Case sensitive user name."}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"N/A"}),(0,r.jsx)(n.td,{children:"A valid username"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"providers.users.password"}),(0,r.jsx)(n.td,{children:"********"}),(0,r.jsx)(n.td,{children:"User password."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"A valid password"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"providers.users.username"}),(0,r.jsx)(n.td,{children:"ignite"}),(0,r.jsx)(n.td,{children:"Case-insensitive user name."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"A valid user name"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.strong,{children:"Authorization parameters"})}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"sql-configuration",children:"SQL Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "sql" : {\r\n "createTable" : {\r\n "minStaleRowsCount" : 500,\r\n "staleRowsFraction" : 0.2\r\n },\r\n "planner" : {\r\n "estimatedNumberOfQueries" : 1024,\r\n "maxPlanningTimeMillis" : 15000\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"createTable.minStaleRowsCount"}),(0,r.jsx)(n.td,{children:"500"}),(0,r.jsxs)(n.td,{children:["Number of updates since the last query plan update required to automatically recreate query execution plan. Is overridden by ",(0,r.jsx)(n.code,{children:"WITH min stale rows"})," ",(0,r.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/ddl#create-table",children:"parameter"}),"."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - Long.MAX_VALUE"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"createTable.staleRowsFraction"}),(0,r.jsx)(n.td,{children:"0.2"}),(0,r.jsxs)(n.td,{children:["Fraction of the table that must change for query execution plan to be recreated automatically. Is overridden by ",(0,r.jsx)(n.code,{children:"WITH stale rows fraction"})," ",(0,r.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/ddl#create-table",children:"parameter"}),"."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - 1"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"planner.estimatedNumberOfQueries"}),(0,r.jsx)(n.td,{children:"1024"}),(0,r.jsx)(n.td,{children:"The estimated number of unique queries that are planned to be executed in the cluster in a certain period of time. Used to optimize internal caches and processes. Optional."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"planner.maxPlanningTimeMillis"}),(0,r.jsx)(n.td,{children:"15000"}),(0,r.jsx)(n.td,{children:'Query planning timeout in milliseconds. Plan optimization process stops when the timeout is reached. "0" means no timeout.'}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - Long.MAX_VALUE"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"transactions-configuration",children:"Transactions Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "transaction" : {\r\n "readOnlyTimeoutMillis" : 600000,\r\n "readWriteTimeoutMillis" : 30000\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"readOnlyTimeoutMillis"}),(0,r.jsx)(n.td,{children:"600000"}),(0,r.jsxs)(n.td,{children:["Timeout for read-only transactions. It defines how long the transaction holds acquired resources on participating nodes. If no timeout is specified, or it is set to ",(0,r.jsx)(n.code,{children:"0"}),", a default value of 10 minutes is applied. The transaction is guaranteed to remain active until the timeout expires. Once the timeout is reached, the transaction is aborted but may persist briefly beyond the timeout while corresponding resources are cleaned up."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"readWriteTimeoutMillis"}),(0,r.jsx)(n.td,{children:"30000"}),(0,r.jsxs)(n.td,{children:["Timeout for read-write transactions. It defines how long the transaction holds acquired resources on participating nodes. If no timeout is specified, or it is set to ",(0,r.jsx)(n.code,{children:"0"}),", a default value of 30 seconds is applied. The transaction is guaranteed to remain active until the timeout expires. Once the timeout is reached, the transaction is aborted but may persist briefly beyond the timeout while corresponding resources are cleaned up."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"1 - inf"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"system-configuration-internal",children:"System Configuration (Internal)"}),"\n",(0,r.jsxs)(n.p,{children:["This section describes internal properties used by Ignite components. Although you can edit these properties using the ",(0,r.jsx)(n.code,{children:"cluster config update"})," CLI command, we suggest discussing proposed changes with the Ignite support team. These properties apply to the cluster as a whole. For node-specific properties, see ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/reference/node-configuration#system-configuration",children:"Node Configuration"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Note that the property names are in ",(0,r.jsx)(n.code,{children:"camelCase"}),"."]})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "system" : {\r\n "cmgPath" : "",\r\n "metastoragePath" : "",\r\n "partitionsBasePath" : "",\r\n "partitionsLogPath" : "",\r\n "properties":[]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.cmgPath"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The path the cluster management group information is stored to. By default, data is stored in ",(0,r.jsx)(n.code,{children:"{IGNITE_HOME}/work/cmg"}),"."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.metastoragePath"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The path the cluster meta information is stored to. By default, data is stored in ",(0,r.jsx)(n.code,{children:"{IGNITE_HOME}/work/metastorage"}),"."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.partitionsBasePath"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The path data partitions are saved to. By default, partitions are stored in ",(0,r.jsx)(n.code,{children:"{IGNITE_HOME}/work/partitions"}),"."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.partitionsLogPath"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The path RAFT log the partitions are stored at. By default, this log is stored in ",(0,r.jsx)(n.code,{children:"{system.partitionsBasePath}/log"}),"."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.properties"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"System properties used by the Ignite components."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"An array of properties."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>d});var t=i(96540);const r={},s=t.createContext(r);function l(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/4643c4f2.92888adf.js b/docs/ignite3/assets/js/4643c4f2.92888adf.js deleted file mode 100644 index fe26ab0282..0000000000 --- a/docs/ignite3/assets/js/4643c4f2.92888adf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8767],{11470:(e,n,r)=>{r.d(n,{A:()=>y});var t=r(96540),a=r(34164),s=r(17559),i=r(23104),o=r(56347),l=r(205),c=r(57485),d=r(31682),u=r(70679);function L(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function S(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return L(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function h({queryString:e=!1,groupId:n}){const r=(0,o.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function g(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,s=S(e),[i,o]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:s})),[c,d]=h({queryString:r,groupId:a}),[L,g]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,u.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),Q=(()=>{const e=c??L;return m({value:e,tabValues:s})?e:null})();(0,l.A)(()=>{Q&&o(Q)},[Q]);return{selectedValue:i,selectValue:(0,t.useCallback)(e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),g(e)},[d,g,s]),tabValues:s}}var Q=r(92303);const p={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=r(74848);function b({className:e,block:n,selectedValue:r,selectValue:t,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,i.a_)(),c=e=>{const n=e.currentTarget,a=o.indexOf(n),i=s[a].value;i!==r&&(l(n),t(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:t})=>(0,f.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:d,onClick:c,...t,className:(0,a.A)("tabs__item",p.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:r}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function _(e){const n=g(e);return(0,f.jsxs)("div",{className:(0,a.A)(s.G.tabs.container,"tabs-container",p.tabList),children:[(0,f.jsx)(b,{...n,...e}),(0,f.jsx)(A,{...n,...e})]})}function y(e){const n=(0,Q.A)();return(0,f.jsx)(_,{...e,children:L(e.children)},String(n))}},18386:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>S,frontMatter:()=>l,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"develop/connect-to-ignite/odbc-querying-data","title":"Querying and Modifying Data with ODBC","description":"Overview","source":"@site/docs/develop/connect-to-ignite/odbc-querying-data.md","sourceDirName":"develop/connect-to-ignite","slug":"/develop/connect-to-ignite/odbc-querying-data","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"id":"odbc-querying-data","title":"Querying and Modifying Data with ODBC","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"ODBC Connection String","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string"},"next":{"title":"Python Database API Driver","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/python"}}');var a=r(74848),s=r(28453),i=r(11470),o=r(19365);const l={id:"odbc-querying-data",title:"Querying and Modifying Data with ODBC",sidebar_position:4},c=void 0,d={},u=[{value:"Overview",id:"overview",level:2},{value:"Creating Tables",id:"creating-tables",level:2},{value:"Handling Errors",id:"handling-errors",level:2},{value:"Querying Data",id:"querying-data",level:2},{value:"Inserting Data",id:"inserting-data",level:2},{value:"Updating Data",id:"updating-data",level:2},{value:"Deleting Data",id:"deleting-data",level:2}];function L(e){const n={admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(n.p,{children:"This page describes how to connect to a cluster and execute a variety of SQL queries by using the ODBC driver."}),"\n",(0,a.jsx)(n.p,{children:"The ODBC driver supports DML (Data Modification Layer), which means that you can modify your data using an ODBC connection."}),"\n",(0,a.jsx)(n.h2,{id:"creating-tables",children:"Creating Tables"}),"\n",(0,a.jsx)(n.p,{children:"The simplest way to create tables by using ODBC Driver is to use DDL statements:"}),"\n",(0,a.jsx)(i.A,{groupId:"languages",children:(0,a.jsx)(o.A,{value:"ddl",label:"DDL",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-cpp",children:'SQLHENV env;\r\n\r\n// Allocate an environment handle\r\nSQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);\r\n\r\n// Use ODBC ver 3.8\r\nSQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, reinterpret_cast(SQL_OV_ODBC3_80), 0);\r\n\r\nSQLHDBC dbc;\r\n\r\n// Allocate a connection handle\r\nSQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);\r\n\r\n// Prepare the connection string\r\nSQLCHAR connectStr[] = "Driver={Apache Ignite 3};ADDRESS=localhost:10800;SCHEMA=PUBLIC;";\r\n\r\n// Connecting to the Cluster.\r\nSQLDriverConnect(dbc, NULL, connectStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);\r\n\r\nSQLHSTMT stmt;\r\n\r\n// Allocate a statement handle\r\nSQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\nSQLCHAR query1[] = "CREATE TABLE Person ( "\r\n "id LONG PRIMARY KEY, "\r\n "firstName VARCHAR, "\r\n "lastName VARCHAR, "\r\n "salary FLOAT) "";\r\n\r\nSQLExecDirect(stmt, query1, SQL_NTS);\r\n\r\nSQLCHAR query2[] = "CREATE TABLE Organization ( "\r\n "id LONG PRIMARY KEY, "\r\n "name VARCHAR) "";\r\n\r\nSQLExecDirect(stmt, query2, SQL_NTS);\r\n\r\nSQLCHAR query3[] = "CREATE INDEX idx_organization_name ON Organization (name)";\r\n\r\nSQLExecDirect(stmt, query3, SQL_NTS);\n'})})})}),"\n",(0,a.jsxs)(n.p,{children:["As you can see, we defined two tables that will contain the data of ",(0,a.jsx)(n.code,{children:"Person"})," and ",(0,a.jsx)(n.code,{children:"Organization"})," types. For both types, we listed specific fields and indexes that will be read or updated using SQL."]}),"\n",(0,a.jsx)(n.h2,{id:"handling-errors",children:"Handling Errors"}),"\n",(0,a.jsx)(n.p,{children:"The section below covers how you can handle possible errors when working with ODBC. In this example we handle an issue with connecting to the cluster:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c++",children:'// Connecting to Ignite Cluster.\r\nSQLRETURN ret = SQLDriverConnect(dbc, NULL, connectStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);\r\n\r\nif (!SQL_SUCCEEDED(ret))\r\n{\r\n SQLCHAR sqlstate[7] = { 0 };\r\n SQLINTEGER nativeCode;\r\n\r\n SQLCHAR errMsg[BUFFER_SIZE] = { 0 };\r\n SQLSMALLINT errMsgLen = static_cast(sizeof(errMsg));\r\n\r\n SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, sqlstate, &nativeCode, errMsg, errMsgLen, &errMsgLen);\r\n\r\n std::cerr << "Failed to connect to Ignite: "\r\n << reinterpret_cast(sqlstate) << ": "\r\n << reinterpret_cast(errMsg) << ", "\r\n << "Native error code: " << nativeCode\r\n << std::endl;\r\n\r\n // Releasing allocated handles.\r\n SQLFreeHandle(SQL_HANDLE_DBC, dbc);\r\n SQLFreeHandle(SQL_HANDLE_ENV, env);\r\n\r\n return;\r\n}\n'})}),"\n",(0,a.jsx)(n.h2,{id:"querying-data",children:"Querying Data"}),"\n",(0,a.jsxs)(n.p,{children:["After everything is up and running, we're ready to execute ",(0,a.jsx)(n.code,{children:"SQL SELECT"})," queries using the ",(0,a.jsx)(n.code,{children:"ODBC API"}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c++",children:'SQLHSTMT stmt;\r\n\r\n// Allocate a statement handle\r\nSQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\nSQLCHAR query[] = "SELECT firstName, lastName, salary, Organization.name FROM Person "\r\n "INNER JOIN Organization ON Person.orgId = Organization.id"\r\nSQLSMALLINT queryLen = static_cast(sizeof(queryLen));\r\n\r\nSQLRETURN ret = SQLExecDirect(stmt, query, queryLen);\r\n\r\nif (!SQL_SUCCEEDED(ret))\r\n{\r\n SQLCHAR sqlstate[7] = { 0 };\r\n SQLINTEGER nativeCode;\r\n\r\n SQLCHAR errMsg[BUFFER_SIZE] = { 0 };\r\n SQLSMALLINT errMsgLen = static_cast(sizeof(errMsg));\r\n\r\n SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, sqlstate, &nativeCode, errMsg, errMsgLen, &errMsgLen);\r\n\r\n std::cerr << "Failed to perform SQL query: "\r\n << reinterpret_cast(sqlstate) << ": "\r\n << reinterpret_cast(errMsg) << ", "\r\n << "Native error code: " << nativeCode\r\n << std::endl;\r\n}\r\nelse\r\n{\r\n // Printing the result set.\r\n struct OdbcStringBuffer\r\n {\r\n SQLCHAR buffer[BUFFER_SIZE];\r\n SQLLEN resLen;\r\n };\r\n\r\n // Getting a number of columns in the result set.\r\n SQLSMALLINT columnsCnt = 0;\r\n SQLNumResultCols(stmt, &columnsCnt);\r\n\r\n // Allocating buffers for columns.\r\n std::vector columns(columnsCnt);\r\n\r\n // Binding columns. For simplicity we are going to use only\r\n // string buffers here.\r\n for (SQLSMALLINT i = 0; i < columnsCnt; ++i)\r\n SQLBindCol(stmt, i + 1, SQL_C_CHAR, columns[i].buffer, BUFFER_SIZE, &columns[i].resLen);\r\n\r\n // Fetching and printing data in a loop.\r\n ret = SQLFetch(stmt);\r\n while (SQL_SUCCEEDED(ret))\r\n {\r\n for (size_t i = 0; i < columns.size(); ++i)\r\n std::cout << std::setw(16) << std::left << columns[i].buffer << " ";\r\n\r\n std::cout << std::endl;\r\n\r\n ret = SQLFetch(stmt);\r\n }\r\n}\r\n\r\n// Releasing statement handle.\r\nSQLFreeHandle(SQL_HANDLE_STMT, stmt);\n'})}),"\n",(0,a.jsx)(n.admonition,{title:"Columns binding",type:"note",children:(0,a.jsx)(n.p,{children:"In the example above, we bind all columns to the SQL_C_CHAR columns. This means that all values are going to be converted to strings upon fetching. This is done for the sake of simplicity. Value conversion upon fetching can be pretty slow, so your default decision should be to fetch the value the same way as it is stored."})}),"\n",(0,a.jsx)(n.h2,{id:"inserting-data",children:"Inserting Data"}),"\n",(0,a.jsxs)(n.p,{children:["To insert new data into the cluster, ",(0,a.jsx)(n.code,{children:"SQL INSERT"})," statements can be used from the ODBC side."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c++",children:'SQLHSTMT stmt;\r\n\r\n// Allocate a statement handle\r\nSQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\nSQLCHAR query[] =\r\n\t"INSERT INTO Person (id, orgId, firstName, lastName, resume, salary) "\r\n\t"VALUES (?, ?, ?, ?, ?, ?)";\r\n\r\nSQLPrepare(stmt, query, static_cast(sizeof(query)));\r\n\r\n// Binding columns.\r\nint64_t key = 0;\r\nint64_t orgId = 0;\r\nchar name[1024] = { 0 };\r\nSQLLEN nameLen = SQL_NTS;\r\ndouble salary = 0.0;\r\n\r\nSQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_BIGINT, 0, 0, &key, 0, 0);\r\nSQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_BIGINT, 0, 0, &orgId, 0, 0);\r\nSQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR,\tsizeof(name), sizeof(name), name, 0, &nameLen);\r\nSQLBindParameter(stmt, 4, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &salary, 0, 0);\r\n\r\n// Filling cache.\r\nkey = 1;\r\norgId = 1;\r\nstrncpy(name, "John", sizeof(name));\r\nsalary = 2200.0;\r\n\r\nSQLExecute(stmt);\r\nSQLMoreResults(stmt);\r\n\r\n++key;\r\norgId = 1;\r\nstrncpy(name, "Jane", sizeof(name));\r\nsalary = 1300.0;\r\n\r\nSQLExecute(stmt);\r\nSQLMoreResults(stmt);\r\n\r\n++key;\r\norgId = 2;\r\nstrncpy(name, "Richard", sizeof(name));\r\nsalary = 900.0;\r\n\r\nSQLExecute(stmt);\r\nSQLMoreResults(stmt);\r\n\r\n++key;\r\norgId = 2;\r\nstrncpy(name, "Mary", sizeof(name));\r\nsalary = 2400.0;\r\n\r\nSQLExecute(stmt);\r\n\r\n// Releasing statement handle.\r\nSQLFreeHandle(SQL_HANDLE_STMT, stmt);\n'})}),"\n",(0,a.jsx)(n.p,{children:"Next, we are going to insert additional organizations without the usage of prepared statements."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c++",children:"SQLHSTMT stmt;\r\n\r\n// Allocate a statement handle\r\nSQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\nSQLCHAR query1[] = \"INSERT INTO Organization (id, name) VALUES (1L, 'Some company')\";\r\n\r\nSQLExecDirect(stmt, query1, static_cast(sizeof(query1)));\r\n\r\nSQLFreeStmt(stmt, SQL_CLOSE);\r\n\r\nSQLCHAR query2[] = \"INSERT INTO Organization (id, name) VALUES (2L, 'Some other company')\";\r\n\r\n SQLExecDirect(stmt, query2, static_cast(sizeof(query2)));\r\n\r\n// Releasing statement handle.\r\nSQLFreeHandle(SQL_HANDLE_STMT, stmt);\n"})}),"\n",(0,a.jsx)(n.admonition,{title:"Error Checking",type:"warning",children:(0,a.jsx)(n.p,{children:"For simplicity the example code above does not check for an error return code. You will want to do error checking in production."})}),"\n",(0,a.jsx)(n.h2,{id:"updating-data",children:"Updating Data"}),"\n",(0,a.jsxs)(n.p,{children:["Let's now update the salary for some of the persons stored in the cluster using SQL ",(0,a.jsx)(n.code,{children:"UPDATE"})," statement."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c++",children:'void AdjustSalary(SQLHDBC dbc, int64_t key, double salary)\r\n{\r\n SQLHSTMT stmt;\r\n\r\n // Allocate a statement handle\r\n SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\n SQLCHAR query[] = "UPDATE Person SET salary=? WHERE id=?";\r\n\r\n SQLBindParameter(stmt, 1, SQL_PARAM_INPUT,\r\n SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &salary, 0, 0);\r\n\r\n SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG,\r\n SQL_BIGINT, 0, 0, &key, 0, 0);\r\n\r\n SQLExecDirect(stmt, query, static_cast(sizeof(query)));\r\n\r\n // Releasing statement handle.\r\n SQLFreeHandle(SQL_HANDLE_STMT, stmt);\r\n}\r\n\r\n...\r\nAdjustSalary(dbc, 3, 1200.0);\r\nAdjustSalary(dbc, 1, 2500.0);\n'})}),"\n",(0,a.jsx)(n.h2,{id:"deleting-data",children:"Deleting Data"}),"\n",(0,a.jsxs)(n.p,{children:["Finally, let's remove a few records with the help of SQL ",(0,a.jsx)(n.code,{children:"DELETE"})," statement."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c++",children:'void DeletePerson(SQLHDBC dbc, int64_t key)\r\n{\r\n SQLHSTMT stmt;\r\n\r\n // Allocate a statement handle\r\n SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\n SQLCHAR query[] = "DELETE FROM Person WHERE id=?";\r\n\r\n SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_BIGINT,\r\n 0, 0, &key, 0, 0);\r\n\r\n SQLExecDirect(stmt, query, static_cast(sizeof(query)));\r\n\r\n // Releasing statement handle.\r\n SQLFreeHandle(SQL_HANDLE_STMT, stmt);\r\n}\r\n\r\n...\r\nDeletePerson(dbc, 1);\r\nDeletePerson(dbc, 4);\n'})})]})}function S(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(L,{...e})}):L(e)}},19365:(e,n,r)=>{r.d(n,{A:()=>i});r(96540);var t=r(34164);const a={tabItem:"tabItem_Ymn6"};var s=r(74848);function i({children:e,hidden:n,className:r}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},28453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>o});var t=r(96540);const a={},s=t.createContext(a);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/46d70a83.0aad90ab.js b/docs/ignite3/assets/js/46d70a83.0aad90ab.js deleted file mode 100644 index 5a866a27c5..0000000000 --- a/docs/ignite3/assets/js/46d70a83.0aad90ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3124],{21023:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"tools/index","title":"Tools","description":"Command-line tools, REST API, and utilities for Apache Ignite 3.","source":"@site/docs/tools/index.mdx","sourceDirName":"tools","slug":"/tools/","permalink":"/docs/ignite3/3.1.0/tools/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"C++ API Reference","permalink":"/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference"},"next":{"title":"CLI Commands Reference","permalink":"/docs/ignite3/3.1.0/tools/cli-commands"}}');var o=s(74848),t=s(28453);const r={},a="Tools",c={},d=[{value:"CLI Tools",id:"cli-tools",level:2},{value:"REST API",id:"rest-api",level:2},{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components},{IIcon:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"tools",children:"Tools"})}),"\n",(0,o.jsx)(n.p,{children:"Command-line tools, REST API, and utilities for Apache Ignite 3."}),"\n",(0,o.jsx)(n.h2,{id:"cli-tools",children:"CLI Tools"}),"\n",(0,o.jsxs)(n.p,{children:["The Ignite CLI provides commands for cluster management, configuration, and operations. See the ",(0,o.jsx)(n.a,{href:"tools/cli-commands",children:"CLI Commands"})," reference for complete documentation."]}),"\n",(0,o.jsx)(n.h2,{id:"rest-api",children:"REST API"}),"\n",(0,o.jsxs)(n.p,{children:["The REST API allows remote cluster management and monitoring through HTTP endpoints. See the ",(0,o.jsx)(n.a,{href:"tools/rest-api",children:"REST API"})," reference for endpoint documentation."]}),"\n",(0,o.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,o.jsxs)("div",{className:"card-container",children:[(0,o.jsxs)("div",{className:"card",children:[(0,o.jsx)("div",{className:"card__header",children:(0,o.jsxs)("h3",{children:[(0,o.jsx)(s,{icon:"mdi:console",height:"24"})," CLI Commands"]})}),(0,o.jsx)("div",{className:"card__body",children:(0,o.jsx)("p",{children:"Command-line interface reference for cluster initialization, node management, and configuration."})}),(0,o.jsx)("div",{className:"card__footer",children:(0,o.jsx)("a",{href:"./tools/cli-commands",children:"Learn more \u2192"})})]}),(0,o.jsxs)("div",{className:"card",children:[(0,o.jsx)("div",{className:"card__header",children:(0,o.jsxs)("h3",{children:[(0,o.jsx)(s,{icon:"mdi:api",height:"24"})," REST API"]})}),(0,o.jsx)("div",{className:"card__body",children:(0,o.jsx)("p",{children:"RESTful API endpoints for remote cluster management, monitoring, and operations."})}),(0,o.jsx)("div",{className:"card__footer",children:(0,o.jsx)("a",{href:"./tools/rest-api",children:"Learn more \u2192"})})]}),(0,o.jsxs)("div",{className:"card",children:[(0,o.jsx)("div",{className:"card__header",children:(0,o.jsxs)("h3",{children:[(0,o.jsx)(s,{icon:"mdi:book-alphabet",height:"24"})," Glossary"]})}),(0,o.jsx)("div",{className:"card__body",children:(0,o.jsx)("p",{children:"Common terms and definitions for Apache Ignite concepts and terminology."})}),(0,o.jsx)("div",{className:"card__footer",children:(0,o.jsx)("a",{href:"./tools/glossary",children:"Learn more \u2192"})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"configure-and-operate",children:"Configure and Operate"})," - Cluster management"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"getting-started",children:"Getting Started"})," - Quick start guides"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var i=s(96540);const o={},t=i.createContext(o);function r(e){const n=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/4809.c9ea89c3.js b/docs/ignite3/assets/js/4809.c9ea89c3.js deleted file mode 100644 index 746cd84fbc..0000000000 --- a/docs/ignite3/assets/js/4809.c9ea89c3.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,r,o={84809:(e,r,o)=>{o.d(r,{BH:()=>s,Ho:()=>a,IH:()=>n,sx:()=>t});o(58291);const t=[],s=["en"],n="search-index{dir}.json?_=7d9521e8",a=1}},t={};function s(e){var r=t[e];if(void 0!==r)return r.exports;var n=t[e]={exports:{}};return o[e](n,n.exports,s),n.exports}s.m=o,s.x=()=>{var e=s.O(void 0,[540],()=>s(90540));return e=s.O(e)},e=[],s.O=(r,o,t,n)=>{if(!o){var a=1/0;for(u=0;u=n)&&Object.keys(s.O).every(e=>s.O[e](o[p]))?o.splice(p--,1):(i=!1,n0&&e[u-1][2]>n;u--)e[u]=e[u-1];e[u]=[o,t,n]},s.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return s.d(r,{a:r}),r},s.d=(e,r)=>{for(var o in r)s.o(r,o)&&!s.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce((r,o)=>(s.f[o](e,r),r),[])),s.u=e=>"assets/js/"+e+".6d7be0f0.js",s.miniCssF=e=>{},s.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),s.p="/docs/ignite3/",s.gca=function(e){return e={}[e]||e,s.p+s.u(e)},(()=>{var e={4809:1};s.f.i=(r,o)=>{e[r]||importScripts(s.p+s.u(r))};var r=globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[],o=r.push.bind(r);r.push=r=>{var[t,n,a]=r;for(var i in n)s.o(n,i)&&(s.m[i]=n[i]);for(a&&a(s);t.length;)e[t.pop()]=1;o(r)}})(),r=s.x,s.x=()=>s.e(540).then(r);s.x()})(); \ No newline at end of file diff --git a/docs/ignite3/assets/js/4c300737.cd830652.js b/docs/ignite3/assets/js/4c300737.cd830652.js deleted file mode 100644 index 59d0138af9..0000000000 --- a/docs/ignite3/assets/js/4c300737.cd830652.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5460],{28453:(t,e,i)=>{i.d(e,{R:()=>d,x:()=>l});var n=i(96540);const s={},r=n.createContext(s);function d(t){const e=n.useContext(r);return n.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function l(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:d(t.components),n.createElement(r.Provider,{value:e},t.children)}},78213:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>d,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"administrators-guide/config/cli-config","title":"CLI Configuration Parameters","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/config/cli-config.md","sourceDirName":"administrators-guide/config","slug":"/administrators-guide/config/cli-config","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/cli-config","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"CLI Configuration Parameters","sidebar_label":"CLI Configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Cluster Configuration","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config"},"next":{"title":"Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/"}}');var s=i(74848),r=i(28453);const d={title:"CLI Configuration Parameters",sidebar_label:"CLI Configuration"},l=void 0,c={},o=[{value:"CLI Configuration Parameters",id:"cli-configuration-parameters",level:2},{value:"Configuration Profiles",id:"configuration-profiles",level:2}];function a(t){const e={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:["\n",(0,s.jsx)(e.h2,{id:"cli-configuration-parameters",children:"CLI Configuration Parameters"}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-bash",children:"ignite.jdbc.key-store.path=\r\nignite.cluster-endpoint-url=http://localhost:10300\r\nignite.jdbc.client-auth=\r\nignite.rest.key-store.password=\r\nignite.jdbc.key-store.password=\r\nignite.cli.sql.multiline=true\r\nignite.cli.syntax-highlighting=true\r\nignite.rest.trust-store.path=\r\nignite.jdbc.trust-store.password=\r\nignite.auth.basic.username=\r\nignite.jdbc-url=jdbc:ignite:thin://127.0.0.1:10800\r\nignite.rest.key-store.path=\r\nignite.rest.trust-store.password=\r\nignite.jdbc.trust-store.path=\r\nignite.auth.basic.password=\n"})}),"\n",(0,s.jsxs)(e.table,{children:[(0,s.jsx)(e.thead,{children:(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.th,{children:"Property"}),(0,s.jsx)(e.th,{children:"Default"}),(0,s.jsx)(e.th,{children:"Description"})]})}),(0,s.jsxs)(e.tbody,{children:[(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.jdbc.key-store.path"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{children:"Path to the JDBC keystore file."})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.cluster-endpoint-url"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"http://127.0.1.1:10300",children:"http://127.0.1.1:10300"})}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.jdbc.client-auth"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{children:"If JDBC client authorization is enabled in CLI."})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.rest.key-store.password"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.jdbc.key-store.password"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.cli.sql.multiline"}),(0,s.jsx)(e.td,{children:"true"}),(0,s.jsx)(e.td,{children:"Enables multiline input mode for SQL commands in the CLI."})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.cli.syntax-highlighting"}),(0,s.jsx)(e.td,{children:"true"}),(0,s.jsx)(e.td,{children:"Enables syntax highlighting in CLI output."})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.rest.trust-store.path"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.jdbc.trust-store.password"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.auth.basic.username"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.jdbc-url"}),(0,s.jsx)(e.td,{children:"jdbc:ignite:thin://127.0.0.1:10800"}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.rest.key-store.path"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.rest.trust-store.password"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.jdbc.trust-store.path"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ignite.auth.basic.password"}),(0,s.jsx)(e.td,{}),(0,s.jsx)(e.td,{})]})]})]}),"\n",(0,s.jsx)(e.h2,{id:"configuration-profiles",children:"Configuration Profiles"}),"\n",(0,s.jsxs)(e.p,{children:["Apache Ignite ",(0,s.jsx)(e.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool#interactive-cli-mode",children:"CLI"})," supports configuration profiles to manage different sets of settings."]}),"\n",(0,s.jsx)(e.p,{children:"Use the following commands to create and manage profiles:"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:"Create a new configuration profile:"}),"\n"]}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-bash",children:"cli config create \n"})}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:"Switch to an existing profile:"}),"\n"]}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-bash",children:"cli config activate \n"})}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:"Display all available profiles:"}),"\n"]}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-bash",children:"cli config list\n"})}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:"Display the currently used profile with all custom settings:"}),"\n"]}),"\n",(0,s.jsx)(e.pre,{children:(0,s.jsx)(e.code,{className:"language-bash",children:"cli config show\n"})}),"\n",(0,s.jsx)(e.p,{children:"Each profile stores its own CLI-specific settings, allowing isolated configurations for different use cases."})]})}function h(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(a,{...t})}):a(t)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/4edc808e.44fdcf04.js b/docs/ignite3/assets/js/4edc808e.44fdcf04.js deleted file mode 100644 index a0d40b066c..0000000000 --- a/docs/ignite3/assets/js/4edc808e.44fdcf04.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[308],{16215:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>t,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"index","title":"Apache Ignite 3 Documentation","description":"Apache Ignite 3 is a distributed database for high-performance computing with in-memory speed.","source":"@site/docs/index.mdx","sourceDirName":".","slug":"/","permalink":"/docs/ignite3/3.1.0/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","next":{"title":"Getting Started","permalink":"/docs/ignite3/3.1.0/getting-started/"}}');var s=n(74848),a=n(28453);const c={},t="Apache Ignite 3 Documentation",d={},l=[{value:"Where to Start",id:"where-to-start",level:2},{value:"Documentation Sections",id:"documentation-sections",level:2}];function o(e){const i={h1:"h1",h2:"h2",header:"header",p:"p",...(0,a.R)(),...e.components},{IIcon:n}=i;return n||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"apache-ignite-3-documentation",children:"Apache Ignite 3 Documentation"})}),"\n",(0,s.jsx)(i.p,{children:"Apache Ignite 3 is a distributed database for high-performance computing with in-memory speed."}),"\n",(0,s.jsx)(i.h2,{id:"where-to-start",children:"Where to Start"}),"\n",(0,s.jsxs)("div",{className:"row",children:[(0,s.jsxs)("div",{className:"col col--6",children:[(0,s.jsx)("h3",{children:"New to Ignite?"}),(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/getting-started/intro",children:"Introduction to Apache Ignite 3"})}),(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/getting-started/quick-start",children:"Quick Start Guide"})}),(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/getting-started/start-cluster",children:"Start Your First Cluster"})})]})]}),(0,s.jsxs)("div",{className:"col col--6",children:[(0,s.jsx)("h3",{children:"Developers"}),(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/develop/ignite-clients/java-client",children:"Java Client"})}),(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/develop/work-with-data/table-api",children:"Table API"})}),(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/sql/working-with-sql/execute-queries",children:"Execute SQL Queries"})})]})]})]}),"\n",(0,s.jsxs)("div",{className:"row",children:[(0,s.jsxs)("div",{className:"col col--6",children:[(0,s.jsx)("h3",{children:"Operations"}),(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/configure-and-operate/installation/install-zip",children:"Install Using ZIP Archive"})}),(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/configure-and-operate/configuration/config-cluster-and-nodes",children:"Configure Cluster and Nodes"})}),(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/configure-and-operate/operations/lifecycle",children:"Manage Cluster Lifecycle"})})]})]}),(0,s.jsxs)("div",{className:"col col--6",children:[(0,s.jsx)("h3",{children:"API Reference"}),(0,s.jsxs)("ul",{children:[(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/api-reference/native-clients/java/client-api",children:"Java API"})}),(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/api-reference/native-clients/dotnet/client-api",children:".NET API"})}),(0,s.jsx)("li",{children:(0,s.jsx)("a",{href:"./3.1.0/api-reference/sql-only-apis/jdbc",children:"JDBC Driver"})})]})]})]}),"\n",(0,s.jsx)(i.h2,{id:"documentation-sections",children:"Documentation Sections"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:rocket-launch",height:"24"})," Getting Started"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Tutorials and quick start guides to get up and running with Apache Ignite 3. Install, configure, and execute your first queries."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./3.1.0/getting-started/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:code-braces",height:"24"})," Develop"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Build applications with Ignite clients, work with data using Table and SQL APIs, and integrate with frameworks like Spring Boot."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./3.1.0/develop/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:database-search",height:"24"})," SQL"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Complete SQL reference including fundamentals, query execution, data definition language, and performance tuning."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./3.1.0/sql/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:cog-outline",height:"24"})," Configure and Operate"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Install Ignite on various platforms, configure cluster settings, manage node lifecycle, and set up monitoring."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./3.1.0/configure-and-operate/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"carbon:layers",height:"24"})," Understand"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Core concepts, architecture patterns, storage engines, and performance characteristics of distributed data processing."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./3.1.0/understand/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:book-open-variant",height:"24"})," API Reference"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"API documentation for Java, .NET, C++, and SQL-only drivers."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./3.1.0/api-reference/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:toolbox-outline",height:"24"})," Tools"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Command-line interface commands, REST API endpoints, and utilities for cluster management and operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./3.1.0/tools/",children:"Learn more \u2192"})})]})]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},28453:(e,i,n)=>{n.d(i,{R:()=>c,x:()=>t});var r=n(96540);const s={},a=r.createContext(s);function c(e){const i=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function t(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/4f4c954e.1c1bc021.js b/docs/ignite3/assets/js/4f4c954e.1c1bc021.js deleted file mode 100644 index 9cdb1f9a71..0000000000 --- a/docs/ignite3/assets/js/4f4c954e.1c1bc021.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2329],{28453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>a});var n=i(96540);const s={},r=n.createContext(s);function o(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:t},e.children)}},96840:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"administrators-guide/disaster-recovery","title":"Disaster Recovery for Data Partitions","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/disaster-recovery.md","sourceDirName":"administrators-guide","slug":"/administrators-guide/disaster-recovery","permalink":"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Disaster Recovery for Data Partitions","sidebar_label":"Disaster Recovery for Data Partitions"},"sidebar":"tutorialSidebar","previous":{"title":"Data Colocation","permalink":"/docs/ignite3/3.0.0/administrators-guide/colocation"},"next":{"title":"Disaster Recovery for System Groups","permalink":"/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery"}}');var s=i(74848),r=i(28453);const o={title:"Disaster Recovery for Data Partitions",sidebar_label:"Disaster Recovery for Data Partitions"},a="Disaster Recovery for Data Partitions",l={},d=[{value:"Disaster Scenarios and Recovery Instructions",id:"disaster-scenarios-and-recovery-instructions",level:2},{value:"Minority Offline",id:"minority-offline",level:3},{value:"Majority Offline",id:"majority-offline",level:3},{value:"Partition Loss",id:"partition-loss",level:3},{value:"Partition States",id:"partition-states",level:2},{value:"Local Partition States",id:"local-partition-states",level:3},{value:"Global Partition States",id:"global-partition-states",level:3}];function c(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n",(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"disaster-recovery-for-data-partitions",children:"Disaster Recovery for Data Partitions"})}),"\n",(0,s.jsxs)(t.p,{children:["You perform ",(0,s.jsx)(t.em,{children:"disaster recovery"})," operations to recover from situation when data operations on your Apache Ignite cluster nodes become unfeasible because Apache Ignite cannot guarantee data consistency. In such cases, you need to either return data to a consistent state or declare the current state consistent."]}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:["Disaster recovery for system groups - ",(0,s.jsx)(t.a,{href:"/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery#cluster-management-group",children:"Cluster Management Group"})," and ",(0,s.jsx)(t.a,{href:"/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery#metastorage-group",children:"Metastorage Group"})," - is described in a separate page."]})}),"\n",(0,s.jsx)(t.h2,{id:"disaster-scenarios-and-recovery-instructions",children:"Disaster Scenarios and Recovery Instructions"}),"\n",(0,s.jsx)(t.h3,{id:"minority-offline",children:"Minority Offline"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.em,{children:"Minority"})," refers to less than half of the number of ",(0,s.jsx)(t.em,{children:"replicas"})," configured for a distribution zone (DZ). For example, of DZ1 is configured with 2 replicas and DZ2 - with 3 replicas, losing a single Apache Ignite node is a majority loss for DZ1 and a minority loss for DZ2."]}),"\n",(0,s.jsxs)(t.p,{children:["You may discover that one or more of your cluster nodes are offline in a number of ways, including the ",(0,s.jsx)(t.code,{children:"recovery partition states"})," ",(0,s.jsx)(t.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool#disaster-recovery-commands",children:"CLI command"})," with the ",(0,s.jsx)(t.code,{children:"--global"})," option, which would show ",(0,s.jsx)(t.code,{children:"Read-only partition"}),", ",(0,s.jsx)(t.code,{children:"Degraded partition"}),", or ",(0,s.jsx)(t.code,{children:"Unavailable partition"})," for offline nodes."]}),"\n",(0,s.jsx)(t.p,{children:"Once a minority offline status has been discovered:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Command the system to bring the offline node(s) online."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The system attempts to bring the indicated nodes online. Possible outcomes are:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Nodes return online in time (before scale-down timeout) with valid data. The system replicates the missing data (if any) using either log replication or the full state transfer procedure."}),"\n",(0,s.jsx)(t.li,{children:"Nodes return online in time but without data. The system replicates the data using the full state transfer procedure."}),"\n",(0,s.jsx)(t.li,{children:"A node does not return online before scale-down timeout. The system distributes a replica to a new node and starts the rebalance procedure."}),"\n",(0,s.jsx)(t.li,{children:"Node return online with inconsistent data - see steps 4 and 5."}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"Full state transfer and rebalancing might take a long time (tens of minutes). We suggest that you recover nodes as soon as you discover they are offline."})}),"\n",(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsxs)(t.li,{children:["Run the ",(0,s.jsx)(t.code,{children:"recovery partition states"})," command on the relevant zones/nodes/partitions to verify ",(0,s.jsx)(t.a,{href:"#partition-states",children:"Partition States"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["If the state is ",(0,s.jsx)(t.code,{children:"Healthy"})," or ",(0,s.jsx)(t.code,{children:"Available partition"}),", consider the recovery completed."]}),"\n",(0,s.jsxs)(t.li,{children:["If the state is ",(0,s.jsx)(t.code,{children:"Broken"}),":","\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Restart your Apache Ignite node or the relevant partitions using the ",(0,s.jsx)(t.code,{children:"recovery partitions restart"})," command."]}),"\n",(0,s.jsxs)(t.li,{children:["Rerun the ",(0,s.jsx)(t.code,{children:"recovery partition states"})," command."]}),"\n",(0,s.jsxs)(t.li,{children:["If the partition state remains ",(0,s.jsx)(t.code,{children:"Broken"}),", reset the partitions with deletion by using the ",(0,s.jsx)(t.code,{children:"recovery partitions restart --with-cleanup"})," command. Local partition data will be deleted and restored from the cluster."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["If the partition state is ",(0,s.jsx)(t.code,{children:"Read-only partition"}),", ",(0,s.jsx)(t.code,{children:"Degraded partition"}),", or ",(0,s.jsx)(t.code,{children:"Unavailable partition"}),", reset the relevant partitions using the ",(0,s.jsx)(t.code,{children:"recovery reset partitions"})," command."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"majority-offline",children:"Majority Offline"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.em,{children:"Majority"})," refers to half (or more) of the number of ",(0,s.jsx)(t.em,{children:"replicas"})," configured for a distribution zone (DZ). For example, of DZ1 is configured with 2 replicas and DZ2 - with 3 replicas, losing a single Apache Ignite node is a majority loss for DZ1 and a minority loss for DZ2."]}),"\n",(0,s.jsxs)(t.p,{children:["You may discover that one or more of your cluster nodes are offline in a number of ways, including the ",(0,s.jsx)(t.code,{children:"recovery partition states"})," CLI command with the ",(0,s.jsx)(t.code,{children:"--global"})," option, which would show ",(0,s.jsx)(t.code,{children:"Read-only partition"}),", ",(0,s.jsx)(t.code,{children:"Degraded partition"}),", or ",(0,s.jsx)(t.code,{children:"Unavailable partition"})," for offline nodes."]}),"\n",(0,s.jsxs)(t.p,{children:["If the node(s) that remain(s) online include the primary replica, the partition becomes ",(0,s.jsx)(t.code,{children:"Read-only partition"})," (see ",(0,s.jsx)(t.a,{href:"#global-partition-states",children:"Global Partition States"}),"); all the data is available for reading until lease expires.\r\nIf the node(s) that remain(s) online do ",(0,s.jsx)(t.em,{children:"not"})," include the primary replica, the partition becomes ",(0,s.jsx)(t.code,{children:"Unavailable partition"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Once a majority offline status has been discovered:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Command the system to bring the offline nodes online."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The system attempts to bring the indicated nodes online. Possible outcomes are:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Nodes return online in time (before scale-down timeout) with valid data. A leader is elected, the system replicates the missing data (if any) using either log replication or the full state transfer procedure, and a leaseholder is elected"}),"\n",(0,s.jsx)(t.li,{children:"Nodes return online with inconsistent data - see steps 4 and 5."}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"Full state transfer and rebalancing might take a long time (tens of minutes). We suggest that you recover nodes as soon as you discover they are offline."})}),"\n",(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsxs)(t.li,{children:["Run the ",(0,s.jsx)(t.code,{children:"recovery partition states"})," command on the relevant zones/nodes/partitions to verify ",(0,s.jsx)(t.a,{href:"#partition-states",children:"Partition States"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["If the state is ",(0,s.jsx)(t.code,{children:"Healthy"})," or ",(0,s.jsx)(t.code,{children:"Available partition"}),", consider the recovery completed."]}),"\n",(0,s.jsxs)(t.li,{children:["If the state is ",(0,s.jsx)(t.code,{children:"Broken"}),":","\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Restart your Apache Ignite nodes or the relevant partitions using the ",(0,s.jsx)(t.code,{children:"recovery partitions restart"})," command."]}),"\n",(0,s.jsxs)(t.li,{children:["Rerun the ",(0,s.jsx)(t.code,{children:"recovery partition states"})," command."]}),"\n",(0,s.jsxs)(t.li,{children:["If the partition state remains ",(0,s.jsx)(t.code,{children:"Broken"}),", reset the partitions with deletion by using the ",(0,s.jsx)(t.code,{children:"recovery partitions restart --with-cleanup"})," command. Local partition data will be deleted and restored from the cluster."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["If the partition state is ",(0,s.jsx)(t.code,{children:"Read-only partition"}),", ",(0,s.jsx)(t.code,{children:"Degraded partition"}),", or ",(0,s.jsx)(t.code,{children:"Unavailable partition"}),", reset the relevant partitions using the ",(0,s.jsx)(t.code,{children:"recovery partitions reset"})," CLI command."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["In the Majority Offline scenario, you would typically lose part of the data. For example, if you reset partition A while partition B was in the ",(0,s.jsx)(t.code,{children:"Available partition"})," state, you would lose:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["The latest data from A that has been restored using ",(0,s.jsx)(t.code,{children:"recovery partitions reset"})]}),"\n",(0,s.jsx)(t.li,{children:"Some of the latest data from B, which had been inserted into it in a transaction that had also inserted data into A"}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"partition-loss",children:"Partition Loss"}),"\n",(0,s.jsxs)(t.p,{children:["In this scenario, in addition to having ",(0,s.jsx)(t.a,{href:"#majority-offline",children:"Majority Offline"}),", you lose all replicas of a partition, e.g., partition A. This causes a loss of ",(0,s.jsx)(t.em,{children:"all"})," the data from partition A once you run the ",(0,s.jsx)(t.code,{children:"recovery partitions reset"})," CLI command, as well possibly a loss of some of the recent updates in other partitions."]}),"\n",(0,s.jsxs)(t.p,{children:["Try bringing the nodes back online as described in the ",(0,s.jsx)(t.a,{href:"#majority-offline",children:"Majority Offline"})," scenario."]}),"\n",(0,s.jsx)(t.h2,{id:"partition-states",children:"Partition States"}),"\n",(0,s.jsx)(t.p,{children:"This section describes the data partition states that define the partition availability and readiness for utilization."}),"\n",(0,s.jsx)(t.h3,{id:"local-partition-states",children:"Local Partition States"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.em,{children:"Local partition state"})," is a local property of a replica, storage, state machine, etc., associated with the partition."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Healthy"})," - a state machine is running with no issues."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Initializing"})," - a node is online, but the corresponding RAFT group has not completed its initialization yet."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Snapshot installation"})," - a full state transfer is taking place. Once it has finished, the partition will become ",(0,s.jsx)(t.code,{children:"healthy"})," or ",(0,s.jsx)(t.code,{children:"catching-up"}),". Before that, data cannot be read, and log replication is on pause."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Catching-up"})," - a node is in the process of replicating data from the leader, and its data is slightly in the past. More specifically, node has not replicated the tail of the log that corresponds to 100 log entries."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Broken"})," - the state machine experiences issues (likely as a result of an exception). Some data might be unavailable for reading, and the log cannot be replicated. This state will not be changed automatically - it requires intervention."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Unavailable"})," - state of the partition is currently unknown. It may happen when partition is not yet started or is already stopping."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"global-partition-states",children:"Global Partition States"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.em,{children:"Global partition state"})," is a global property of a partition that specifies its apparent functionality from user's point of view."]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Available"})," - a healthy partition that can process read and write requests. Implies that all peers are healthy at the moment."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Read-only"})," - a partition that can process read requests but not the write requests. There is no healthy majority. However, there is at least one alive (healthy/catch-up) peer that can process historical read-only queries."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Unavailable"})," - a partition that cannot process any requests."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Degraded"})," - a partition that is available to the user, but is at a higher risk of having issues than other partitions. For example, one of the group's peers is offline. There is still a majority, but the backup factor is low."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/4fffa35c.e2bec440.js b/docs/ignite3/assets/js/4fffa35c.e2bec440.js deleted file mode 100644 index e3dad99b03..0000000000 --- a/docs/ignite3/assets/js/4fffa35c.e2bec440.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1929],{28453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>o});var t=i(96540);const r={},a=t.createContext(r);function s(e){const n=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(a.Provider,{value:n},e.children)}},79782:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quick-start/explore-sql","title":"Getting Started with SQL","description":"{/*","source":"@site/versioned_docs/version-3.0.0/quick-start/explore-sql.md","sourceDirName":"quick-start","slug":"/quick-start/explore-sql","permalink":"/docs/ignite3/3.0.0/quick-start/explore-sql","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Getting Started with SQL","sidebar_label":"Explore SQL"},"sidebar":"tutorialSidebar","previous":{"title":"Start Cluster in Docker","permalink":"/docs/ignite3/3.0.0/quick-start/start-cluster"},"next":{"title":"Persist Data","permalink":"/docs/ignite3/3.0.0/quick-start/persist-data"}}');var r=i(74848),a=i(28453);const s={title:"Getting Started with SQL",sidebar_label:"Explore SQL"},o=void 0,l={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Before Starting",id:"before-starting",level:2},{value:"Setting Up an Apache Ignite 3 Cluster",id:"setting-up-an-apache-ignite-3-cluster",level:2},{value:"Starting the Cluster",id:"starting-the-cluster",level:3},{value:"Connecting to the Cluster Using Ignite CLI",id:"connecting-to-the-cluster-using-ignite-cli",level:2},{value:"Starting the CLI",id:"starting-the-cli",level:3},{value:"Initializing the Cluster",id:"initializing-the-cluster",level:3},{value:"Creating the Chinook Database Schema",id:"creating-the-chinook-database-schema",level:2},{value:"Entering SQL Mode",id:"entering-sql-mode",level:3},{value:"Creating Distribution Zones",id:"creating-distribution-zones",level:3},{value:"Database Entity Relationship",id:"database-entity-relationship",level:3},{value:"Creating Core Tables",id:"creating-core-tables",level:3},{value:"Verifying Table Creation",id:"verifying-table-creation",level:3},{value:"Inserting Sample Data",id:"inserting-sample-data",level:2},{value:"Adding Artists and Albums",id:"adding-artists-and-albums",level:3},{value:"Adding Genres and Media Types",id:"adding-genres-and-media-types",level:3},{value:"Adding Tracks",id:"adding-tracks",level:3},{value:"Adding Employees and Customers",id:"adding-employees-and-customers",level:3},{value:"Adding Invoices and Invoice Lines",id:"adding-invoices-and-invoice-lines",level:3},{value:"Querying Data in Ignite SQL",id:"querying-data-in-ignite-sql",level:2},{value:"Basic Queries",id:"basic-queries",level:3},{value:"Joins",id:"joins",level:3},{value:"Data Manipulation in Ignite SQL",id:"data-manipulation-in-ignite-sql",level:2},{value:"Understanding Distributed Updates",id:"understanding-distributed-updates",level:3},{value:"Inserting New Data",id:"inserting-new-data",level:3},{value:"Updating Existing Data",id:"updating-existing-data",level:3},{value:"Deleting Data",id:"deleting-data",level:3},{value:"Advanced SQL Features",id:"advanced-sql-features",level:2},{value:"Querying System Views",id:"querying-system-views",level:3},{value:"Creating Indexes for Better Performance",id:"creating-indexes-for-better-performance",level:3},{value:"Creating a Dashboard Using SQL",id:"creating-a-dashboard-using-sql",level:2},{value:"Monthly Sales Summary",id:"monthly-sales-summary",level:3},{value:"Top Selling Genres",id:"top-selling-genres",level:3},{value:"Sales Performance by Employee",id:"sales-performance-by-employee",level:3},{value:"Top 20 Longest Tracks with Genres",id:"top-20-longest-tracks-with-genres",level:3},{value:"Customer Purchase Patterns by Month",id:"customer-purchase-patterns-by-month",level:3},{value:"Performance Tuning with Colocated Tables",id:"performance-tuning-with-colocated-tables",level:2},{value:"Colocated Queries",id:"colocated-queries",level:3},{value:"Key Observations in the Execution Plan",id:"key-observations-in-the-execution-plan",level:4},{value:"Improved Cololocation Strategy",id:"improved-cololocation-strategy",level:3},{value:"Key Observations in the Execution Plan",id:"key-observations-in-the-execution-plan-1",level:4},{value:"Colocation Impact",id:"colocation-impact",level:4},{value:"Cleaning Up",id:"cleaning-up",level:2},{value:"Best Practices for Ignite SQL",id:"best-practices-for-ignite-sql",level:2},{value:"Schema Design",id:"schema-design",level:3},{value:"Query Optimization",id:"query-optimization",level:3},{value:"Transaction Management",id:"transaction-management",level:3},{value:"Resource Management",id:"resource-management",level:3},{value:"What's Next",id:"whats-next",level:2}];function c(e){const n={admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.p,{children:"This guide walks you through using Apache Ignite 3 SQL capabilities via the command-line interface. You'll set up a distributed Apache Ignite cluster, create and manipulate the Chinook database (a sample database representing a digital media store), and learn to leverage Apache Ignite's powerful SQL features."}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Docker and Docker Compose installed on your system;"}),"\n",(0,r.jsx)(n.li,{children:"Basic familiarity with SQL;"}),"\n",(0,r.jsx)(n.li,{children:"Command-line terminal access;"}),"\n",(0,r.jsx)(n.li,{children:"8GB+ of available RAM for running the containers;"}),"\n",(0,r.jsx)(n.li,{children:"SQL directory with Chinook Database files downloaded."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"before-starting",children:"Before Starting"}),"\n",(0,r.jsx)(n.p,{children:"This tutorial uses prepared files to streamline deployment. Make sure you have the required files:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"docker-compose.yml"})," - Docker Compose configuration for the cluster"]}),"\n",(0,r.jsx)(n.li,{children:"SQL files for the Chinook Database"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["The SQL files should be placed in a ",(0,r.jsx)(n.code,{children:"sql/"})," directory and mounted to the container. The tutorial expects these SQL files to be available at ",(0,r.jsx)(n.code,{children:"/opt/ignite/downloads/"})," inside the container."]}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"Without these files, you will be unable to load the sample data needed for the exercises."})}),"\n",(0,r.jsx)(n.h2,{id:"setting-up-an-apache-ignite-3-cluster",children:"Setting Up an Apache Ignite 3 Cluster"}),"\n",(0,r.jsx)(n.p,{children:"Before we can start using SQL, we need to set up an Apache Ignite cluster. We will use Docker Compose to create a three-node cluster."}),"\n",(0,r.jsx)(n.h3,{id:"starting-the-cluster",children:"Starting the Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["Open a terminal in the directory containing the docker compose file ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file and start the cluster with Docker:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(n.p,{children:"This command starts the cluster in detached mode. You should see startup messages from all three nodes. When they are ready, you will see messages indicating that the servers have started successfully."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\r\n\r\n[+] Running 4\r\n \u2714 Network ignite3_default Created\r\n \u2714 Container ignite3-node2-1 Started\r\n \u2714 Container ignite3-node3-1 Started\r\n \u2714 Container ignite3-node1-1 Started\n"})}),"\n",(0,r.jsx)(n.p,{children:"You can check that all containers are running with the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose ps\n"})}),"\n",(0,r.jsx)(n.p,{children:'You should see all three nodes with a "running" status.'}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:'Verify that all three nodes are "running" before continuing.'})}),"\n",(0,r.jsx)(n.h2,{id:"connecting-to-the-cluster-using-ignite-cli",children:"Connecting to the Cluster Using Ignite CLI"}),"\n",(0,r.jsx)(n.p,{children:"Now we will connect to our running cluster using Ignite command-line interface (CLI)."}),"\n",(0,r.jsx)(n.h3,{id:"starting-the-cli",children:"Starting the CLI"}),"\n",(0,r.jsx)(n.p,{children:"In your terminal, run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker run --rm -it --network=host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -v ./sql/:/opt/ignite/downloads/ apacheignite/ignite:3.0.0 cli\n"})}),"\n",(0,r.jsx)(n.p,{children:"This starts an interactive CLI container connected to the same Docker network as our cluster and mounts a volume containing the sql files for the Chinook Database. When prompted, connect to the default node. If you refused the connection, you can do it manually with the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"connect http://localhost:10300\n"})}),"\n",(0,r.jsxs)(n.p,{children:["You should see a message that you're connected to ",(0,r.jsx)(n.code,{children:"http://localhost:10300"})," and a note that the cluster is not initialized."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"The CLI container runs separately from the cluster nodes, but connects to them over the Docker network."})}),"\n",(0,r.jsx)(n.h3,{id:"initializing-the-cluster",children:"Initializing the Cluster"}),"\n",(0,r.jsx)(n.p,{children:"Before we can use the cluster, we need to initialize it:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster init --name=ignite3 --metastorage-group=node1,node2,node3\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"If the license is not available, make sure the license file was mounted correctly."})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:" # ___ __\r\n ### / | ____ ____ _ _____ / /_ ___\r\n # ##### / /| | / __ \\ / __ `// ___// __ \\ / _ \\\r\n ### ###### / ___ | / /_/ // /_/ // /__ / / / // ___/\r\n ##### ####### /_/ |_|/ .___/ \\__,_/ \\___//_/ /_/ \\___/\r\n ####### ###### /_/\r\n ######## #### ____ _ __ _____\r\n # ######## ## / _/____ _ ____ (_)/ /_ ___ |__ /\r\n #### ####### # / / / __ `// __ \\ / // __// _ \\ /_ <\r\n ##### ##### _/ / / /_/ // / / // // /_ / ___/ ___/ /\r\n #### ## /___/ \\__, //_/ /_//_/ \\__/ \\___/ /____/\r\n ## /____/\r\n\r\n Apache Ignite CLI version 3.0.0\r\n\r\n\r\nYou appear to have not connected to any node yet. Do you want to connect to the default node http://localhost:10300? [Y/n] y\r\nConnected to http://localhost:10300\r\nThe cluster is not initialized. Run cluster init command to initialize it.\r\n[node1]> cluster init --name=ignite3 --metastorage-group=node1,node2,node3\r\nCluster was initialized successfully\r\n[node1]>\n"})}),"\n",(0,r.jsx)(n.h2,{id:"creating-the-chinook-database-schema",children:"Creating the Chinook Database Schema"}),"\n",(0,r.jsx)(n.p,{children:"Now that our cluster is running and initialized, we can start using SQL to create and work with data in Ignite. The Chinook database is a digital music store dataset, with tables for artists, albums, tracks, customers, and sales."}),"\n",(0,r.jsx)(n.h3,{id:"entering-sql-mode",children:"Entering SQL Mode"}),"\n",(0,r.jsx)(n.p,{children:"To start working with SQL, enter SQL mode in the CLI:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"sql\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Your prompt should change to ",(0,r.jsx)(n.code,{children:"sql-cli>"})," indicating you're now in SQL mode."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"[node1]> sql\r\nsql-cli>\n"})}),"\n",(0,r.jsx)(n.h3,{id:"creating-distribution-zones",children:"Creating Distribution Zones"}),"\n",(0,r.jsx)(n.p,{children:"Before we create tables, let's set up distribution zones to control how our data is distributed and replicated across the cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS Chinook WITH replicas=2, storage_profiles='default';\r\nCREATE ZONE IF NOT EXISTS ChinookReplicated WITH replicas=3, partitions=25, storage_profiles='default';\n"})}),"\n",(0,r.jsx)(n.p,{children:"These commands create two zones:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"Chinook"})," - Standard zone with 2 replicas for most tables;"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"ChinookReplicated"})," - Zone with 3 replicas for frequently accessed reference data."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"database-entity-relationship",children:"Database Entity Relationship"}),"\n",(0,r.jsx)(n.p,{children:"Here's the entity relationship diagram for our Chinook database:"}),"\n",(0,r.jsx)(n.mermaid,{value:"erDiagram\r\n ARTIST ||--o{ ALBUM : creates\r\n ALBUM ||--o{ TRACK : contains\r\n GENRE ||--o{ TRACK : categorizes\r\n MEDIATYPE ||--o{ TRACK : formats\r\n CUSTOMER ||--o{ INVOICE : places\r\n INVOICE ||--o{ INVOICELINE : contains\r\n TRACK ||--o{ INVOICELINE : purchased-in\r\n EMPLOYEE ||--o{ CUSTOMER : supports\r\n PLAYLIST ||--o{ PLAYLISTTRACK : contains\r\n TRACK ||--o{ PLAYLISTTRACK : appears-in"}),"\n",(0,r.jsx)(n.h3,{id:"creating-core-tables",children:"Creating Core Tables"}),"\n",(0,r.jsx)(n.p,{children:"Now let's create the main tables for the Chinook database. We will start with the Artist and Album tables."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Copy and paste the following SQL blocks at the ",(0,r.jsx)(n.code,{children:"sql-cli>"})," prompt then hit enter."]})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Artist (\r\n ArtistId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (ArtistId)\r\n) ZONE Chinook;\r\n\r\nCREATE TABLE Album (\r\n AlbumId INT NOT NULL,\r\n Title VARCHAR(160) NOT NULL,\r\n ArtistId INT NOT NULL,\r\n ReleaseYear INT,\r\n PRIMARY KEY (AlbumId, ArtistId)\r\n) COLOCATE BY (ArtistId) ZONE Chinook;\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"COLOCATE BY"})," clause in the ",(0,r.jsx)(n.strong,{children:"Album"})," table ensures that albums by the same artist are stored on the same nodes. This optimizes joins between Artist and Album tables by eliminating the need for network transfers during queries."]}),"\n",(0,r.jsx)(n.p,{children:"Next, let's create the Genre and MediaType reference tables:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Genre (\r\n GenreId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (GenreId)\r\n) ZONE ChinookReplicated;\r\n\r\nCREATE TABLE MediaType (\r\n MediaTypeId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (MediaTypeId)\r\n) ZONE ChinookReplicated;\n"})}),"\n",(0,r.jsxs)(n.p,{children:["These reference tables are placed in the ",(0,r.jsx)(n.code,{children:"ChinookReplicated"})," zone with 3 replicas because they contain static data that is frequently joined with other tables. Having a copy on each node improves read performance."]}),"\n",(0,r.jsx)(n.p,{children:"Now, let's create the Track table, which references the Album, Genre, and MediaType tables:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Track (\r\n TrackId INT NOT NULL,\r\n Name VARCHAR(200) NOT NULL,\r\n AlbumId INT,\r\n MediaTypeId INT NOT NULL,\r\n GenreId INT,\r\n Composer VARCHAR(220),\r\n Milliseconds INT NOT NULL,\r\n Bytes INT,\r\n UnitPrice NUMERIC(10,2) NOT NULL,\r\n PRIMARY KEY (TrackId, AlbumId)\r\n) COLOCATE BY (AlbumId) ZONE Chinook;\n"})}),"\n",(0,r.jsx)(n.p,{children:"Tracks are colocated by AlbumId, not by TrackId, because most queries join tracks with their albums. This colocation optimizes these common join patterns."}),"\n",(0,r.jsx)(n.p,{children:"Let's also create tables to manage customers, employees, and sales:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Employee (\r\n EmployeeId INT NOT NULL,\r\n LastName VARCHAR(20) NOT NULL,\r\n FirstName VARCHAR(20) NOT NULL,\r\n Title VARCHAR(30),\r\n ReportsTo INT,\r\n BirthDate DATE,\r\n HireDate DATE,\r\n Address VARCHAR(70),\r\n City VARCHAR(40),\r\n State VARCHAR(40),\r\n Country VARCHAR(40),\r\n PostalCode VARCHAR(10),\r\n Phone VARCHAR(24),\r\n Fax VARCHAR(24),\r\n Email VARCHAR(60),\r\n PRIMARY KEY (EmployeeId)\r\n) ZONE Chinook;\r\n\r\nCREATE TABLE Customer (\r\n CustomerId INT NOT NULL,\r\n FirstName VARCHAR(40) NOT NULL,\r\n LastName VARCHAR(20) NOT NULL,\r\n Company VARCHAR(80),\r\n Address VARCHAR(70),\r\n City VARCHAR(40),\r\n State VARCHAR(40),\r\n Country VARCHAR(40),\r\n PostalCode VARCHAR(10),\r\n Phone VARCHAR(24),\r\n Fax VARCHAR(24),\r\n Email VARCHAR(60) NOT NULL,\r\n SupportRepId INT,\r\n PRIMARY KEY (CustomerId)\r\n) ZONE Chinook;\r\n\r\nCREATE TABLE Invoice (\r\n InvoiceId INT NOT NULL,\r\n CustomerId INT NOT NULL,\r\n InvoiceDate DATE NOT NULL,\r\n BillingAddress VARCHAR(70),\r\n BillingCity VARCHAR(40),\r\n BillingState VARCHAR(40),\r\n BillingCountry VARCHAR(40),\r\n BillingPostalCode VARCHAR(10),\r\n Total NUMERIC(10,2) NOT NULL,\r\n PRIMARY KEY (InvoiceId, CustomerId)\r\n) COLOCATE BY (CustomerId) ZONE Chinook;\r\n\r\nCREATE TABLE InvoiceLine (\r\n InvoiceLineId INT NOT NULL,\r\n InvoiceId INT NOT NULL,\r\n TrackId INT NOT NULL,\r\n UnitPrice NUMERIC(10,2) NOT NULL,\r\n Quantity INT NOT NULL,\r\n PRIMARY KEY (InvoiceLineId, TrackId)\r\n) COLOCATE BY (TrackId) ZONE Chinook;\n"})}),"\n",(0,r.jsx)(n.p,{children:"Invoices are colocated by CustomerId and InvoiceLines are colocated by InvoiceId. This creates an efficient chain of locality: Customer \u2192 Invoice \u2192 InvoiceLine, optimizing queries that analyze customer purchase history."}),"\n",(0,r.jsx)(n.p,{children:"Finally, let's create the playlist-related tables:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Playlist (\r\n PlaylistId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (PlaylistId)\r\n) ZONE Chinook;\r\n\r\nCREATE TABLE PlaylistTrack (\r\n PlaylistId INT NOT NULL,\r\n TrackId INT NOT NULL,\r\n PRIMARY KEY (PlaylistId, TrackId)\r\n) ZONE Chinook;\n"})}),"\n",(0,r.jsx)(n.p,{children:"Note that PlaylistTrack is not colocated with Track. This is a design decision that prioritizes playlist operations over joining with track details. In a real-world scenario, you might make a different colocation choice depending on your most common query patterns."}),"\n",(0,r.jsx)(n.h3,{id:"verifying-table-creation",children:"Verifying Table Creation"}),"\n",(0,r.jsx)(n.p,{children:"Let's confirm that all our tables were created successfully:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"SELECT * FROM system.tables WHERE schema = 'PUBLIC';\n"})}),"\n",(0,r.jsx)(n.p,{children:"This query checks the system tables to verify that our tables exist. You should see a list of all the tables we've created."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql-cli> SELECT * FROM system.tables WHERE schema = 'PUBLIC';\r\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 SCHEMA \u2502 NAME \u2502 ID \u2502 PK_INDEX_ID \u2502 ZONE \u2502 STORAGE_PROFILE \u2502 COLOCATION_KEY_INDEX \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 PUBLIC \u2502 ALBUM \u2502 20 \u2502 21 \u2502 CHINOOK \u2502 default \u2502 ARTISTID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 GENRE \u2502 22 \u2502 23 \u2502 CHINOOKREPLICATED \u2502 default \u2502 GENREID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 ARTIST \u2502 18 \u2502 19 \u2502 CHINOOK \u2502 default \u2502 ARTISTID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 TRACK \u2502 26 \u2502 27 \u2502 CHINOOK \u2502 default \u2502 ALBUMID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 PLAYLIST \u2502 36 \u2502 37 \u2502 CHINOOK \u2502 default \u2502 PLAYLISTID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 PLAYLISTTRACK \u2502 38 \u2502 39 \u2502 CHINOOK \u2502 default \u2502 PLAYLISTID, TRACKID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 MEDIATYPE \u2502 24 \u2502 25 \u2502 CHINOOKREPLICATED \u2502 default \u2502 MEDIATYPEID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 INVOICELINE \u2502 34 \u2502 35 \u2502 CHINOOK \u2502 default \u2502 TRACKID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 EMPLOYEE \u2502 28 \u2502 29 \u2502 CHINOOK \u2502 default \u2502 EMPLOYEEID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 CUSTOMER \u2502 30 \u2502 31 \u2502 CHINOOK \u2502 default \u2502 CUSTOMERID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 INVOICE \u2502 32 \u2502 33 \u2502 CHINOOK \u2502 default \u2502 CUSTOMERID \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Checkpoint"}),": Verify that all tables appear in the ",(0,r.jsx)(n.code,{children:"system.tables"})," output with their proper zones and colocation settings before proceeding to the next section."]})}),"\n",(0,r.jsx)(n.h2,{id:"inserting-sample-data",children:"Inserting Sample Data"}),"\n",(0,r.jsx)(n.p,{children:"Now that we have our tables set up, let's populate them with sample data."}),"\n",(0,r.jsx)(n.h3,{id:"adding-artists-and-albums",children:"Adding Artists and Albums"}),"\n",(0,r.jsx)(n.p,{children:"Let's start by adding some artists."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Exit the interactive sql mode by typing ",(0,r.jsx)(n.code,{children:"exit;"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"Then, load the current store catalog from the sql data file."}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/current_catalog.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql-cli> exit;\r\n[node1]> sql --file=/opt/ignite/downloads/current_catalog.sql\r\nUpdated 275 rows.\r\nUpdated 347 rows.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"adding-genres-and-media-types",children:"Adding Genres and Media Types"}),"\n",(0,r.jsx)(n.p,{children:"Let's populate our reference tables the same way:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/media_and_genre.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"[node1]> sql --file=/opt/ignite/downloads/media_and_genre.sql\r\nUpdated 25 rows.\r\nUpdated 5 rows.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"adding-tracks",children:"Adding Tracks"}),"\n",(0,r.jsx)(n.p,{children:"Now let's add some tracks to our albums:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/tracks.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"[node1]> sql --file=/opt/ignite/downloads/tracks.sql\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 503 rows.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"adding-employees-and-customers",children:"Adding Employees and Customers"}),"\n",(0,r.jsx)(n.p,{children:"Let's add some employee and customer data:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/ee_and_cust.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"[node1]> sql --file=/opt/ignite/downloads/ee_and_cust.sql\r\nUpdated 8 rows.\r\nUpdated 59 rows.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"adding-invoices-and-invoice-lines",children:"Adding Invoices and Invoice Lines"}),"\n",(0,r.jsx)(n.p,{children:"Finally, let's add some sales data:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/invoices.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"[node1]> sql --file=/opt/ignite/downloads/invoices.sql\r\nUpdated 412 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 240 rows.\r\nUpdated 18 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 715 rows.\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Checkpoint"}),': Verify that all the data has been loaded successfully by checking that the "Updated X rows" messages match the expected row counts for each file.']})}),"\n",(0,r.jsx)(n.h2,{id:"querying-data-in-ignite-sql",children:"Querying Data in Ignite SQL"}),"\n",(0,r.jsx)(n.p,{children:"Now that we have data in our tables, let's run some SQL queries to explore the Chinook database."}),"\n",(0,r.jsx)(n.h3,{id:"basic-queries",children:"Basic Queries"}),"\n",(0,r.jsxs)(n.p,{children:["Let's return to the ",(0,r.jsx)(n.code,{children:"sql-cli>"})," and start with some simple SELECT queries:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Get all artists\r\nSELECT * FROM Artist;\r\n\r\n-- Get all albums for a specific artist\r\nSELECT * FROM Album WHERE ArtistId = 3;\r\n\r\n-- Get all tracks for a specific album\r\nSELECT * FROM Track WHERE AlbumId = 133;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"joins",children:"Joins"}),"\n",(0,r.jsx)(n.p,{children:"Now let's try some more complex queries with joins:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Get all tracks with artist and album information\r\nSELECT\r\n t.Name AS TrackName,\r\n a.Title AS AlbumTitle,\r\n ar.Name AS ArtistName\r\nFROM\r\n Track t\r\n JOIN Album a ON t.AlbumId = a.AlbumId\r\n JOIN Artist ar ON a.ArtistId = ar.ArtistId\r\nLIMIT 10;\n"})}),"\n",(0,r.jsx)(n.h2,{id:"data-manipulation-in-ignite-sql",children:"Data Manipulation in Ignite SQL"}),"\n",(0,r.jsx)(n.p,{children:"Let's explore how to modify data using SQL in Ignite."}),"\n",(0,r.jsx)(n.h3,{id:"understanding-distributed-updates",children:"Understanding Distributed Updates"}),"\n",(0,r.jsx)(n.p,{children:"When you update data in a distributed database, the changes need to be coordinated across multiple nodes:"}),"\n",(0,r.jsx)(n.mermaid,{value:"sequenceDiagram\r\n participant Client\r\n participant Node1\r\n participant Node2\r\n participant Node3\r\n\r\n Client->>Node1: UPDATE request\r\n Node1->>Node1: Update local primary copy\r\n Node1->>Node2: Propagate changes to backup copy\r\n Node1--\x3e>Client: Confirm update completed"}),"\n",(0,r.jsx)(n.h3,{id:"inserting-new-data",children:"Inserting New Data"}),"\n",(0,r.jsx)(n.p,{children:"Let's add a new artist and album:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Insert a new artist\r\nINSERT INTO Artist (ArtistId, Name)\r\nVALUES (276, 'New Discovery Band');\r\n\r\n-- Insert a new album for this artist\r\nINSERT INTO Album (AlbumId, Title, ArtistId, ReleaseYear)\r\nVALUES (348, 'First Light', 276, 2023);\r\n\r\n-- Verify the insertions\r\nSELECT * FROM Artist WHERE ArtistId = 276;\r\nSELECT * FROM Album WHERE AlbumId = 348;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"updating-existing-data",children:"Updating Existing Data"}),"\n",(0,r.jsx)(n.p,{children:"Now let's update some of our existing data:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Update the album release year\r\nUPDATE Album\r\nSET ReleaseYear = 2024\r\nWHERE AlbumId = 348;\r\n\r\n-- Update the artist name\r\nUPDATE Artist\r\nSET Name = 'New Discovery Ensemble'\r\nWHERE ArtistId = 276;\r\n\r\n-- Verify the updates\r\nSELECT * FROM Artist WHERE ArtistId = 276;\r\nSELECT * FROM Album WHERE AlbumId = 348;\n"})}),"\n",(0,r.jsx)(n.p,{children:"In a distributed database like Ignite, these updates are automatically propagated to all replicas. The primary copy is updated first, then the changes are sent to the backup copies on other nodes."}),"\n",(0,r.jsx)(n.h3,{id:"deleting-data",children:"Deleting Data"}),"\n",(0,r.jsx)(n.p,{children:"Finally, let's clean up by deleting the data we added:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Delete the album\r\nDELETE FROM Album WHERE AlbumId = 348;\r\n\r\n-- Delete the artist\r\nDELETE FROM Artist WHERE ArtistId = 276;\r\n\r\n-- Verify the deletions\r\nSELECT * FROM Artist WHERE ArtistId = 276;\r\nSELECT * FROM Album WHERE AlbumId = 348;\n"})}),"\n",(0,r.jsx)(n.h2,{id:"advanced-sql-features",children:"Advanced SQL Features"}),"\n",(0,r.jsx)(n.p,{children:"Let's explore some of Ignite's more advanced SQL features."}),"\n",(0,r.jsx)(n.h3,{id:"querying-system-views",children:"Querying System Views"}),"\n",(0,r.jsx)(n.p,{children:"Ignite provides system views that let you inspect cluster metadata:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- View all tables in the cluster\r\nSELECT * FROM system.tables;\r\n\r\n-- View all zones\r\nSELECT * FROM system.zones;\r\n\r\n-- View all columns for a specific table\r\nSELECT * FROM system.table_columns WHERE TABLE_NAME = 'TRACK';\n"})}),"\n",(0,r.jsx)(n.p,{children:"System views provide important metadata about your cluster configuration. They are essential for monitoring and troubleshooting in production environments."}),"\n",(0,r.jsx)(n.h3,{id:"creating-indexes-for-better-performance",children:"Creating Indexes for Better Performance"}),"\n",(0,r.jsx)(n.p,{children:"Let's add some indexes to improve query performance:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Create an index on the Name column of the Track table\r\nCREATE INDEX idx_track_name ON Track (Name);\r\n\r\n-- Create a composite index on Artist and Album\r\nCREATE INDEX idx_album_artist ON Album (ArtistId, Title);\r\n\r\n-- Create a composite index on Track's AlbumId and Name columns to optimize joins with Album table\r\n-- and to improve performance when filtering or sorting by track name within an album\r\nCREATE INDEX idx_track_albumid_name ON Track(AlbumId, Name);\r\n\r\n-- Create an index on Album Title to speed up searches and sorts by album title\r\nCREATE INDEX idx_album_title ON Album(Title);\r\n\r\n-- Create a composite index on InvoiceLine connecting TrackId and InvoiceId\r\n-- This supports efficient queries that join InvoiceLine with Track while filtering by InvoiceId\r\nCREATE INDEX idx_invoiceline_trackid_invoiceid ON InvoiceLine(TrackId, InvoiceId);\r\n\r\n-- Create a hash index for lookups by email\r\nCREATE INDEX idx_customer_email ON Customer USING HASH (Email);\r\n\r\n-- Check index information\r\nSELECT * FROM system.indexes;\n"})}),"\n",(0,r.jsx)(n.p,{children:"Indexes improve query performance, but come with maintenance costs. Each write operation must also update all indexes. Choose indexes that support your most common query patterns rather than indexing everything."}),"\n",(0,r.jsx)(n.h2,{id:"creating-a-dashboard-using-sql",children:"Creating a Dashboard Using SQL"}),"\n",(0,r.jsx)(n.p,{children:"Let's create SQL queries that could be used for a music store dashboard. These queries could be saved and run periodically to generate reports."}),"\n",(0,r.jsx)(n.h3,{id:"monthly-sales-summary",children:"Monthly Sales Summary"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Monthly sales summary for the last 12 months\r\nSELECT\r\n CAST(EXTRACT(YEAR FROM i.InvoiceDate) AS VARCHAR) || '-' ||\r\n CASE\r\n WHEN EXTRACT(MONTH FROM i.InvoiceDate) < 10\r\n THEN '0' || CAST(EXTRACT(MONTH FROM i.InvoiceDate) AS VARCHAR)\r\n ELSE CAST(EXTRACT(MONTH FROM i.InvoiceDate) AS VARCHAR)\r\n END AS YearMonth,\r\n COUNT(DISTINCT i.InvoiceId) AS InvoiceCount,\r\n COUNT(DISTINCT i.CustomerId) AS CustomerCount,\r\n SUM(i.Total) AS MonthlyRevenue,\r\n AVG(i.Total) AS AverageOrderValue\r\nFROM\r\n Invoice i\r\nGROUP BY\r\n EXTRACT(YEAR FROM i.InvoiceDate), EXTRACT(MONTH FROM i.InvoiceDate)\r\nORDER BY\r\n YearMonth DESC;\n"})}),"\n",(0,r.jsx)(n.p,{children:"This query formats the year and month into a sortable string (YYYY-MM) while calculating several key business metrics."}),"\n",(0,r.jsx)(n.h3,{id:"top-selling-genres",children:"Top Selling Genres"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Top selling genres by revenue\r\nSELECT\r\n g.Name AS Genre,\r\n SUM(il.UnitPrice * il.Quantity) AS Revenue\r\nFROM\r\n InvoiceLine il\r\n JOIN Track t ON il.TrackId = t.TrackId\r\n JOIN Genre g ON t.GenreId = g.GenreId\r\nGROUP BY\r\n g.Name\r\nORDER BY\r\n Revenue DESC;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"sales-performance-by-employee",children:"Sales Performance by Employee"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Sales performance by employee\r\nSELECT\r\n e.EmployeeId,\r\n e.FirstName || ' ' || e.LastName AS EmployeeName,\r\n COUNT(DISTINCT i.InvoiceId) AS TotalInvoices,\r\n COUNT(DISTINCT i.CustomerId) AS UniqueCustomers,\r\n SUM(i.Total) AS TotalSales\r\nFROM\r\n Employee e\r\n JOIN Customer c ON e.EmployeeId = c.SupportRepId\r\n JOIN Invoice i ON c.CustomerId = i.CustomerId\r\nGROUP BY\r\n e.EmployeeId, e.FirstName, e.LastName\r\nORDER BY\r\n TotalSales DESC;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"top-20-longest-tracks-with-genres",children:"Top 20 Longest Tracks with Genres"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Top 20 longest tracks with genre information\r\nSELECT\r\n t.trackid,\r\n t.name AS track_name,\r\n g.name AS genre_name,\r\n ROUND(t.milliseconds / (1000 * 60), 2) AS duration_minutes\r\nFROM\r\n track t\r\n JOIN genre g ON t.genreId = g.genreId\r\nWHERE\r\n t.genreId < 17\r\nORDER BY\r\n duration_minutes DESC\r\nLIMIT\r\n 20;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"customer-purchase-patterns-by-month",children:"Customer Purchase Patterns by Month"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Customer purchase patterns by month\r\nSELECT\r\n c.CustomerId,\r\n c.FirstName || ' ' || c.LastName AS CustomerName,\r\n CAST(EXTRACT(YEAR FROM i.InvoiceDate) AS VARCHAR) || '-' ||\r\n CASE\r\n WHEN EXTRACT(MONTH FROM i.InvoiceDate) < 10\r\n THEN '0' || CAST(EXTRACT(MONTH FROM i.InvoiceDate) AS VARCHAR)\r\n ELSE CAST(EXTRACT(MONTH FROM i.InvoiceDate) AS VARCHAR)\r\n END AS YearMonth,\r\n COUNT(DISTINCT i.InvoiceId) AS NumberOfPurchases,\r\n SUM(i.Total) AS TotalSpent,\r\n SUM(i.Total) / COUNT(DISTINCT i.InvoiceId) AS AveragePurchaseValue\r\nFROM\r\n Customer c\r\n JOIN Invoice i ON c.CustomerId = i.CustomerId\r\nGROUP BY\r\n c.CustomerId, c.FirstName, c.LastName,\r\n EXTRACT(YEAR FROM i.InvoiceDate), EXTRACT(MONTH FROM i.InvoiceDate)\r\nORDER BY\r\n c.CustomerId, YearMonth;\n"})}),"\n",(0,r.jsx)(n.h2,{id:"performance-tuning-with-colocated-tables",children:"Performance Tuning with Colocated Tables"}),"\n",(0,r.jsx)(n.p,{children:"One of the key advantages of Ignite is its ability to optimize joins through data colocation. Let's explore this with our existing colocated tables."}),"\n",(0,r.jsx)(n.h3,{id:"colocated-queries",children:"Colocated Queries"}),"\n",(0,r.jsx)(n.p,{children:"Let's start by looking at a query where there is a mismatch in the colocation strategy."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"--This is an example of a poorly created table.\r\nCREATE TABLE InvoiceLine (\r\n InvoiceLineId INT NOT NULL,\r\n InvoiceId INT NOT NULL,\r\n TrackId INT NOT NULL,\r\n UnitPrice NUMERIC(10,2) NOT NULL,\r\n Quantity INT NOT NULL,\r\n PRIMARY KEY (InvoiceLineId, InvoiceId)\r\n) COLOCATE BY (InvoiceId) ZONE Chinook;\n"})}),"\n",(0,r.jsxs)(n.p,{children:["If we create the ",(0,r.jsx)(n.code,{children:"InvoiceLine"})," table to be colocated by InvoiceId, we end up with a mismatch for our query."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Album is colocated by ArtistId"}),"\n",(0,r.jsx)(n.li,{children:"Track is colocated by AlbumId"}),"\n",(0,r.jsx)(n.li,{children:"InvoiceLine is colocated by InvoiceId"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"This means that when you run a query joining InvoiceLine, Track, and Album, the data might be spread across different nodes because they're colocated on different keys. Our query is looking for invoice ID 1, then joining with Track and Album, but these tables are colocated on different keys."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"EXPLAIN PLAN FOR\r\nSELECT\r\n il.InvoiceId,\r\n COUNT(il.InvoiceLineId) AS LineItemCount,\r\n SUM(il.UnitPrice * il.Quantity) AS InvoiceTotal,\r\n t.Name AS TrackName,\r\n a.Title AS AlbumTitle\r\nFROM\r\n InvoiceLine il\r\n JOIN Track t ON il.TrackId = t.TrackId\r\n JOIN Album a ON t.AlbumId = a.AlbumId\r\nWHERE\r\n il.InvoiceId = 1\r\nGROUP BY\r\n il.InvoiceId, t.Name, a.Title;\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 PLAN \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 Project(INVOICEID=[$0], LINEITEMCOUNT=[$3], INVOICETOTAL=[$4], TRACKNAME=[$1], ALBUMTITLE=[$2]): rowcount = 4484471.100479999, cumulative cost = IgniteCost [rowCount=2.3054813220479995E7, cpu=2.3643376967575923E7, memory=9.866772781055996E7, io=2.0, network=50190.0], id = 23843 \u2551\r\n\u2551 ColocatedHashAggregate(group=[{0, 1, 2}], LINEITEMCOUNT=[COUNT()], INVOICETOTAL=[SUM($3)]): rowcount = 4484471.100479999, cumulative cost = IgniteCost [rowCount=1.8570341119999997E7, cpu=1.9158904867095925E7, memory=9.866772681055996E7, io=1.0, network=50189.0], id = 23842 \u2551\r\n\u2551 Project(INVOICEID=[$3], TRACKNAME=[$1], ALBUMTITLE=[$8], $f4=[*($5, $6)]): rowcount = 9189489.959999999, cumulative cost = IgniteCost [rowCount=9380851.159999998, cpu=9969414.907095924, memory=9362.6, io=1.0, network=50189.0], id = 23841 \u2551\r\n\u2551 MergeJoin(condition=[=($2, $7)], joinType=[inner], leftCollation=[[2]], rightCollation=[[0]]): rowcount = 9189489.959999999, cumulative cost = IgniteCost [rowCount=191360.19999999998, cpu=779923.9470959246, memory=9361.6, io=0.0, network=50188.0], id = 23840 \u2551\r\n\u2551 HashJoin(condition=[=($4, $0)], joinType=[inner]): rowcount = 176551.19999999998, cumulative cost = IgniteCost [rowCount=13421.0, cpu=65201.0, memory=6585.6, io=0.0, network=47412.0], id = 23836 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 3503.0, cumulative cost = IgniteCost [rowCount=7006.0, cpu=17515.0, memory=0.0, io=0.0, network=42036.0], id = 23833 \u2551\r\n\u2551 IndexScan(table=[[PUBLIC, TRACK]], tableId=[26], index=[IDX_TRACK_ALBUMID_NAME], type=[SORTED], requiredColumns=[{0, 1, 2}], collation=[[2, 1]]): rowcount = 3503.0, cumulative cost = IgniteCost [rowCount=3503.0, cpu=14012.0, memory=0.0, io=0.0, network=0.0], id = 23832 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 336.0, cumulative cost = IgniteCost [rowCount=2576.0, cpu=9296.0, memory=0.0, io=0.0, network=5376.0], id = 23835 \u2551\r\n\u2551 TableScan(table=[[PUBLIC, INVOICELINE]], tableId=[34], filters=[=($t0, 1)], requiredColumns=[{1, 2, 3, 4}]): rowcount = 336.0, cumulative cost = IgniteCost [rowCount=2240.0, cpu=8960.0, memory=0.0, io=0.0, network=0.0], id = 23834 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=1041.0, cpu=7130.147095924681, memory=2776.0, io=0.0, network=2776.0], id = 23839 \u2551\r\n\u2551 Sort(sort0=[$0], dir0=[ASC]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=694.0, cpu=6783.147095924681, memory=2776.0, io=0.0, network=0.0], id = 23838 \u2551\r\n\u2551 TableScan(table=[[PUBLIC, ALBUM]], tableId=[20], requiredColumns=[{0, 1}]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=347.0, cpu=347.0, memory=0.0, io=0.0, network=0.0], id = 23837 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,r.jsx)(n.h4,{id:"key-observations-in-the-execution-plan",children:"Key Observations in the Execution Plan"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"ColocatedHashAggregate Operation"}),": The plan uses a ",(0,r.jsx)(n.code,{children:"ColocatedHashAggregate"})," operation, which indicates Ignite recognizes that portions of the aggregation can happen on colocated data before results are combined. This reduces network transfer during the ",(0,r.jsx)(n.code,{children:"GROUP BY"})," operation."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Exchange Operations"}),": Several ",(0,r.jsx)(n.code,{children:"Exchange(distribution=[single])"})," operations appear in the plan, indicating data movement between nodes is still necessary. These operations are applied to the Album table, Track table, and InvoiceLine filtered results."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Join Implementation"}),": The plan shows a combination of ",(0,r.jsx)(n.code,{children:"HashJoin"})," and ",(0,r.jsx)(n.code,{children:"MergeJoin"})," operations rather than nested loop joins. The optimizer has determined these join types are more efficient for the data volumes involved:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"HashJoin for joining Track with Album"}),"\n",(0,r.jsx)(n.li,{children:"MergeJoin for joining the above result with InvoiceLine"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Efficient Data Access"}),": The query uses an ",(0,r.jsx)(n.code,{children:"IndexScan"})," with the ",(0,r.jsx)(n.code,{children:"IDX_INVOICELINE_INVOICE_TRACK"})," index rather than a full table scan on InvoiceLine. This provides:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Efficient filtering with ",(0,r.jsx)(n.code,{children:"searchBounds: [ExactBounds [bound=1], null]"})," for InvoiceId = 1"]}),"\n",(0,r.jsxs)(n.li,{children:["Pre-sorted results with ",(0,r.jsx)(n.code,{children:"collation: [INVOICEID ASC, TRACKID ASC]"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Row Count Estimation"}),": There appears to be a significant increase in estimated row counts after joins:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Initial InvoiceLine filtered rows: 746"}),"\n",(0,r.jsx)(n.li,{children:"After HashJoin with Album: 182,331"}),"\n",(0,r.jsx)(n.li,{children:"After MergeJoin with Track: 20,400,668"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"improved-cololocation-strategy",children:"Improved Cololocation Strategy"}),"\n",(0,r.jsxs)(n.p,{children:["However, if we create the ",(0,r.jsx)(n.code,{children:"InvoiceLine"})," table to be colocated by ",(0,r.jsx)(n.code,{children:"TrackId"}),", we dramaticly optimize our query."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"--This table was already created on an earlier step.\r\nCREATE TABLE InvoiceLine (\r\n InvoiceLineId INT NOT NULL,\r\n InvoiceId INT NOT NULL,\r\n TrackId INT NOT NULL,\r\n UnitPrice NUMERIC(10,2) NOT NULL,\r\n Quantity INT NOT NULL,\r\n PRIMARY KEY (InvoiceLineId, TrackId)\r\n) COLOCATE BY (TrackId) ZONE Chinook;\n"})}),"\n",(0,r.jsxs)(n.p,{children:["And run ",(0,r.jsx)(n.code,{children:"EXPLAIN PLAN FOR"})," again..."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"EXPLAIN PLAN FOR\r\nSELECT\r\n il.InvoiceId,\r\n COUNT(il.InvoiceLineId) AS LineItemCount,\r\n SUM(il.UnitPrice * il.Quantity) AS InvoiceTotal,\r\n t.Name AS TrackName,\r\n a.Title AS AlbumTitle\r\nFROM\r\n Track t\r\n JOIN Album a ON t.AlbumId = a.AlbumId\r\n JOIN InvoiceLine il ON t.TrackId = il.TrackId\r\nWHERE\r\n il.InvoiceId = 1\r\nGROUP BY\r\n il.InvoiceId, t.Name, a.Title;\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 PLAN \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 Project(INVOICEID=[$0], LINEITEMCOUNT=[$3], INVOICETOTAL=[$4], TRACKNAME=[$1], ALBUMTITLE=[$2]): rowcount = 2.0019960269999995E9, cumulative cost = IgniteCost [rowCount=1.020839200715E10, cpu=1.0214411135647097E10, memory=4.404685537199999E10, io=2.0, network=2444814.0], id = 25112 \u2551\r\n\u2551 ColocatedHashAggregate(group=[{0, 1, 2}], LINEITEMCOUNT=[COUNT()], INVOICETOTAL=[SUM($3)]): rowcount = 2.0019960269999995E9, cumulative cost = IgniteCost [rowCount=8.20639597915E9, cpu=8.212415107647097E9, memory=4.404685537099999E10, io=1.0, network=2444813.0], id = 25111 \u2551\r\n\u2551 Project(INVOICEID=[$5], TRACKNAME=[$1], ALBUMTITLE=[$4], $f4=[*($7, $8)]): rowcount = 4.102450875E9, cumulative cost = IgniteCost [rowCount=4.10394510415E9, cpu=4.109964232647096E9, memory=2942777.0, io=1.0, network=2444813.0], id = 25110 \u2551\r\n\u2551 HashJoin(condition=[=($0, $6)], joinType=[inner]): rowcount = 4.102450875E9, cumulative cost = IgniteCost [rowCount=1494228.15, cpu=7513356.647095924, memory=2942776.0, io=0.0, network=2444812.0], id = 25109 \u2551\r\n\u2551 MergeJoin(condition=[=($2, $3)], joinType=[inner], leftCollation=[[2, 1]], rightCollation=[[0]]): rowcount = 182331.15, cumulative cost = IgniteCost [rowCount=11897.0, cpu=40045.14709592468, memory=2776.0, io=0.0, network=44812.0], id = 25106 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 3503.0, cumulative cost = IgniteCost [rowCount=7006.0, cpu=17515.0, memory=0.0, io=0.0, network=42036.0], id = 25102 \u2551\r\n\u2551 IndexScan(table=[[PUBLIC, TRACK]], tableId=[26], index=[IDX_TRACK_ALBUMID_NAME], type=[SORTED], requiredColumns=[{0, 1, 2}], collation=[[2, 1]]): rowcount = 3503.0, cumulative cost = IgniteCost [rowCount=3503.0, cpu=14012.0, memory=0.0, io=0.0, network=0.0], id = 25101 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=1041.0, cpu=7130.147095924681, memory=2776.0, io=0.0, network=2776.0], id = 25105 \u2551\r\n\u2551 Sort(sort0=[$0], dir0=[ASC]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=694.0, cpu=6783.147095924681, memory=2776.0, io=0.0, network=0.0], id = 25104 \u2551\r\n\u2551 TableScan(table=[[PUBLIC, ALBUM]], tableId=[20], requiredColumns=[{0, 1}]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=347.0, cpu=347.0, memory=0.0, io=0.0, network=0.0], id = 25103 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 150000.0, cumulative cost = IgniteCost [rowCount=1150000.0, cpu=4150000.0, memory=0.0, io=0.0, network=2400000.0], id = 25108 \u2551\r\n\u2551 TableScan(table=[[PUBLIC, INVOICELINE]], tableId=[46], filters=[=($t0, 1)], requiredColumns=[{1, 2, 3, 4}]): rowcount = 150000.0, cumulative cost = IgniteCost [rowCount=1000000.0, cpu=4000000.0, memory=0.0, io=0.0, network=0.0], id = 25107 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,r.jsx)(n.h4,{id:"key-observations-in-the-execution-plan-1",children:"Key Observations in the Execution Plan"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"ColocatedHashAggregate Operation"}),": The plan uses a ",(0,r.jsx)(n.code,{children:"ColocatedHashAggregate"})," operation, which indicates Ignite recognizes that portions of the aggregation can happen on colocated data before results are combined. This reduces network transfer during the ",(0,r.jsx)(n.code,{children:"GROUP BY"})," operation."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Improved Row Count Estimates"}),": Notice the dramatic improvement in row count estimates, which now show just 1 row at each step. This indicates the optimizer has much better statistics and understanding of the actual data distribution compared to the original plan that estimated millions of rows."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Join Implementation"}),": The plan shows a combination of ",(0,r.jsx)(n.code,{children:"HashJoin"})," and ",(0,r.jsx)(n.code,{children:"MergeJoin"})," operations:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"HashJoin for joining Track with InvoiceLine"}),"\n",(0,r.jsx)(n.li,{children:"MergeJoin for joining the above result with Album"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Efficient Index Usage"}),": The query now uses the composite index ",(0,r.jsx)(n.code,{children:"IDX_TRACK_ALBUMID_NAME"})," on the Track table, providing:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Efficient sorted access by AlbumId and Name"}),"\n",(0,r.jsx)(n.li,{children:"Direct access to the fields needed for the join and select operations"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Exchange Operations"}),": While Exchange operations still appear in the plan, the estimated row counts are now minimal (just 1 row per exchange). This suggests much less data movement between nodes compared to the original plan where millions of rows were estimated to be transferred."]}),"\n",(0,r.jsx)(n.h4,{id:"colocation-impact",children:"Colocation Impact"}),"\n",(0,r.jsx)(n.p,{children:"The substantial improvement in this execution plan demonstrates the power of proper data colocation in Ignite. By:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Structuring the query to join the tables in the optimal order (Track \u2192 Album \u2192 InvoiceLine)"}),"\n",(0,r.jsx)(n.li,{children:"Creating appropriate supporting indexes"}),"\n",(0,r.jsx)(n.li,{children:"Ensuring proper colocation between related tables"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"We've achieved a dramatic reduction in estimated row counts and data movement. The execution plan now shows streamlined operations with minimal row estimates at each step, indicating an efficient execution path that takes advantage of data locality."}),"\n",(0,r.jsx)(n.p,{children:"This optimization approach highlights three key principles for optimal performance in distributed SQL databases:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Proper colocation of related data"}),"\n",(0,r.jsx)(n.li,{children:"Supporting indexes aligned with join patterns"}),"\n",(0,r.jsx)(n.li,{children:"Query structure that follows the colocation model"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,r.jsx)(n.p,{children:"When you are finished with the Ignite SQL CLI, you can exit by typing:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"exit;\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will return you to the Ignite CLI. To exit the Ignite CLI, type:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"exit\n"})}),"\n",(0,r.jsx)(n.p,{children:"To stop the Ignite cluster, run the following command in your terminal:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose down\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will stop and remove the Docker containers for your Ignite cluster."}),"\n",(0,r.jsx)(n.h2,{id:"best-practices-for-ignite-sql",children:"Best Practices for Ignite SQL"}),"\n",(0,r.jsx)(n.p,{children:"To get the most out of Ignite SQL, follow these best practices:"}),"\n",(0,r.jsx)(n.h3,{id:"schema-design",children:"Schema Design"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use appropriate colocation for tables that are frequently joined;"}),"\n",(0,r.jsx)(n.li,{children:"Choose primary keys that distribute data evenly across the cluster;"}),"\n",(0,r.jsx)(n.li,{children:"Design with query patterns in mind, especially for large-scale deployments."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"query-optimization",children:"Query Optimization"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Create indexes for columns used in ",(0,r.jsx)(n.code,{children:"WHERE"}),", ",(0,r.jsx)(n.code,{children:"JOIN"}),", and ",(0,r.jsx)(n.code,{children:"ORDER BY"})," clauses;"]}),"\n",(0,r.jsxs)(n.li,{children:["Use the ",(0,r.jsx)(n.code,{children:"EXPLAIN"})," statement to analyze and optimize your queries;"]}),"\n",(0,r.jsx)(n.li,{children:"Avoid cartesian products and inefficient join conditions."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"transaction-management",children:"Transaction Management"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Keep transactions as short as possible;"}),"\n",(0,r.jsx)(n.li,{children:"Do not hold transactions open during user think time;"}),"\n",(0,r.jsx)(n.li,{children:"Group related operations into a single transaction for atomicity."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"resource-management",children:"Resource Management"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Monitor query performance in production;"}),"\n",(0,r.jsx)(n.li,{children:"Consider partitioning strategies for very large tables;"}),"\n",(0,r.jsx)(n.li,{children:"Use appropriate data types to minimize storage requirements."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"whats-next",children:"What's Next"}),"\n",(0,r.jsx)(n.p,{children:"Ignite's SQL capabilities make it a powerful platform for building distributed applications that require high throughput, low latency, and strong consistency. By following the patterns and practices in this guide, you can leverage Ignite SQL to build scalable, resilient systems."}),"\n",(0,r.jsx)(n.p,{children:"Remember that Ignite is not just a SQL database. It's a distributed computing platform with capabilities beyond what we've covered here. As you become more comfortable with Ignite SQL, you may want to explore other features such as compute grid, machine learning, and stream processing."}),"\n",(0,r.jsx)(n.p,{children:"Happy querying!"})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/5152a8e0.5e3193d6.js b/docs/ignite3/assets/js/5152a8e0.5e3193d6.js deleted file mode 100644 index 15e40607c3..0000000000 --- a/docs/ignite3/assets/js/5152a8e0.5e3193d6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2252],{4180:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"sql-reference/explain-operators-list","title":"List Of Operators","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-reference/explain-operators-list.md","sourceDirName":"sql-reference","slug":"/sql-reference/explain-operators-list","permalink":"/docs/ignite3/3.0.0/sql-reference/explain-operators-list","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"List Of Operators","sidebar_label":"Explain Operators"},"sidebar":"tutorialSidebar","previous":{"title":"EXPLAIN","permalink":"/docs/ignite3/3.0.0/sql-reference/explain-statement"},"next":{"title":"SQL Performance Tuning","permalink":"/docs/ignite3/3.0.0/sql-tuning/"}}');var r=i(74848),o=i(28453);const t={title:"List Of Operators",sidebar_label:"Explain Operators"},d=void 0,l={},c=[{value:"ColocatedHashAggregate",id:"colocatedhashaggregate",level:2},{value:"ColocatedSortAggregate",id:"colocatedsortaggregate",level:2},{value:"MapHashAggregate",id:"maphashaggregate",level:2},{value:"ReduceHashAggregate",id:"reducehashaggregate",level:2},{value:"MapSortAggregate",id:"mapsortaggregate",level:2},{value:"ReduceSortAggregate",id:"reducesortaggregate",level:2},{value:"ColocatedIntersect",id:"colocatedintersect",level:2},{value:"ColocatedMinus",id:"colocatedminus",level:2},{value:"MapIntersect",id:"mapintersect",level:2},{value:"ReduceIntersect",id:"reduceintersect",level:2},{value:"MapMinus",id:"mapminus",level:2},{value:"ReduceMinus",id:"reduceminus",level:2},{value:"UnionAll",id:"unionall",level:2},{value:"Exchange",id:"exchange",level:2},{value:"TrimExchange",id:"trimexchange",level:2},{value:"Filter",id:"filter",level:2},{value:"HashJoin",id:"hashjoin",level:2},{value:"MergeJoin",id:"mergejoin",level:2},{value:"NestedLoopJoin",id:"nestedloopjoin",level:2},{value:"CorrelatedNestedLoopJoin",id:"correlatednestedloopjoin",level:2},{value:"IndexScan",id:"indexscan",level:2},{value:"TableScan",id:"tablescan",level:2},{value:"KeyValueGet",id:"keyvalueget",level:2},{value:"KeyValueModify",id:"keyvaluemodify",level:2},{value:"Limit",id:"limit",level:2},{value:"Project",id:"project",level:2},{value:"Receiver",id:"receiver",level:2},{value:"Sender",id:"sender",level:2},{value:"SelectCount",id:"selectcount",level:2},{value:"Sort",id:"sort",level:2},{value:"SystemViewScan",id:"systemviewscan",level:2},{value:"TableFunctionScan",id:"tablefunctionscan",level:2},{value:"TableModify",id:"tablemodify",level:2},{value:"Values",id:"values",level:2}];function a(e){const n={code:"code",h2:"h2",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsxs)(n.p,{children:["This section enumerates all operators for the ",(0,r.jsx)(n.code,{children:"EXPLAIN"})," statement with their semantic and supported attributes."]}),"\n",(0,r.jsx)(n.h2,{id:"colocatedhashaggregate",children:"ColocatedHashAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key.\r\nColocated aggregate assumes that the data is already distributed according to grouping keys, therefore aggregation can be completed locally in a single pass.\r\nThe hash aggregate operation maintains a hash table for each grouping set to coalesce equivalent tuples.\r\nThe output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"colocatedsortaggregate",children:"ColocatedSortAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key.\r\nColocated aggregate assumes that the data is already distributed according to grouping keys, therefore aggregation can be completed locally in a single pass.\r\nThe sort aggregate operation leverages data ordered by the grouping expressions to calculate data each grouping set tuple-by-tuple in streaming fashion.\r\nThe output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"collation"}),": List of columns and expected order of sorting this operator is rely on."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"maphashaggregate",children:"MapHashAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key.\r\nMap aggregate is a first phase of 2-phase aggregation.\r\nDuring first phase, data is pre-aggregated, and result is sent to the where REDUCE is executed.\r\nThe hash aggregate operation maintains a hash table for each grouping set to coalesce equivalent tuples.\r\nThe output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"reducehashaggregate",children:"ReduceHashAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key.\r\nReduce aggregate is a second phase of 2-phase aggregation.\r\nDuring second phase, all pre-aggregated data is merged together, and final result is returned.\r\nThe hash aggregate operation maintains a hash table for each grouping set to coalesce equivalent tuples.\r\nThe output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"mapsortaggregate",children:"MapSortAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key.\r\nMap aggregate is a first phase of 2-phase aggregation.\r\nDuring first phase, data is pre-aggregated, and result is sent to the where REDUCE is executed.\r\nThe sort aggregate operation leverages data ordered by the grouping expressions to calculate data each grouping set tuple-by-tuple in streaming fashion.\r\nThe output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"collation"}),": List of columns and expected order of sorting this operator is rely on."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"reducesortaggregate",children:"ReduceSortAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key.\r\nReduce aggregate is a second phase of 2-phase aggregation.\r\nDuring second phase, all pre-aggregated data is merged together, and final result is returned.\r\nThe sort aggregate operation leverages data ordered by the grouping expressions to calculate data each grouping set tuple-by-tuple in streaming fashion.\r\nThe output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"collation"}),": List of columns and expected order of sorting this operator is rely on."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"colocatedintersect",children:"ColocatedIntersect"}),"\n",(0,r.jsxs)(n.p,{children:["Returns all records from the primary input that are present in every secondary input.\r\nIf ",(0,r.jsx)(n.code,{children:"all"})," is ",(0,r.jsx)(n.code,{children:"true"}),", then for each specific record returned, the output contains min(m, n1, n2, \u2026, n) copies.\r\nOtherwise duplicates are eliminated."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contains duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"colocatedminus",children:"ColocatedMinus"}),"\n",(0,r.jsxs)(n.p,{children:["Returns all records from the primary input excluding any matching records from secondary inputs.\r\nIf ",(0,r.jsx)(n.code,{children:"all"})," is ",(0,r.jsx)(n.code,{children:"true"}),", then for each specific record returned, the output contains max(0, m - sum(n1, n2, \u2026, n)) copies.\r\nOtherwise duplicates are eliminated."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"mapintersect",children:"MapIntersect"}),"\n",(0,r.jsx)(n.p,{children:"Returns all records from the primary input that are present in every secondary input.\r\nMap intersect is a first phase of 2-phase computation.\r\nDuring first phase, data is pre-aggregated, and result is sent to the where REDUCE is executed."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"reduceintersect",children:"ReduceIntersect"}),"\n",(0,r.jsxs)(n.p,{children:["Returns all records from the primary input that are present in every secondary input.\r\nReduce intersect is a second phase of 2-phase computation.\r\nDuring second phase, all pre-aggregated data is merged together, and final result is returned.\r\nIf ",(0,r.jsx)(n.code,{children:"all"})," is ",(0,r.jsx)(n.code,{children:"true"}),", then for each specific record returned, the output contains min(m, n1, n2, \u2026, n) copies.\r\nOtherwise duplicates are eliminated."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"mapminus",children:"MapMinus"}),"\n",(0,r.jsx)(n.p,{children:"Returns all records from the primary input excluding any matching records from secondary inputs.\r\nMap minus is a first phase of 2-phase computation.\r\nDuring first phase, data is pre-aggregated, and result is sent to the where REDUCE is executed."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"reduceminus",children:"ReduceMinus"}),"\n",(0,r.jsxs)(n.p,{children:["Returns all records from the primary input excluding any matching records from secondary inputs.\r\nReduce minus is a second phase of 2-phase computation.\r\nDuring second phase, all pre-aggregated data is merged together, and final result is returned.\r\nIf ",(0,r.jsx)(n.code,{children:"all"})," is ",(0,r.jsx)(n.code,{children:"true"}),", then for each specific record returned, the output contains max(0, m - sum(n1, n2, \u2026, n)) copies.\r\nOtherwise duplicates are eliminated."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"unionall",children:"UnionAll"}),"\n",(0,r.jsx)(n.p,{children:"Concatenates results from multiple inputs without removing duplicates."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"exchange",children:"Exchange"}),"\n",(0,r.jsx)(n.p,{children:"Redistribute rows according to specified distribution."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"distribution"}),": A distribution strategy that describes how the rows are distributed across nodes.\r\nPossible values are:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"single"}),": a single copy of data is available at single node."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"broadcast"}),": every participating node has the its own copy of all the data."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"random"}),": single copy of data is partitioned and spread randomly across all participating nodes."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"hash"}),": single copy of data is partitioned and spread across nodes based on system-defined hash function of specified columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": single copy of data is partitioned and spread across nodes with regard of distribution of specified table."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"identity"}),": data is distributed with regard to value of specified column."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"trimexchange",children:"TrimExchange"}),"\n",(0,r.jsx)(n.p,{children:"Filters rows according to specified distribution.\r\nThis operator accept input that is broadcasted, i.e. every participating node has the its own copy of all the data, and applies a predicate such that output rows satisfy specified distribution."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"distribution"}),": A distribution strategy that describes how the rows are distributed across nodes.\r\nPossible values are:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"random"}),": single copy of data is partitioned and spread randomly across all participating nodes."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"hash"}),": single copy of data is partitioned and spread across nodes based on system-defined hash function of specified columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": single copy of data is partitioned and spread across nodes with regard of distribution of specified table."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"filter",children:"Filter"}),"\n",(0,r.jsx)(n.p,{children:"Filters rows according to specified predicate conditions."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"hashjoin",children:"HashJoin"}),"\n",(0,r.jsx)(n.p,{children:"The join operation will combine two separate inputs into a single output, based on a join expression.\r\nThe hash join operator will build a hash table out of right input based on a set of join keys.\r\nIt will then probe that hash table for the left input, finding matches."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),': A boolean condition that describes whether each row from the left set "match" the row from the right set.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of the join (like INNER, LEFT, SEMI, etc)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"mergejoin",children:"MergeJoin"}),"\n",(0,r.jsx)(n.p,{children:"The join operation will combine two separate inputs into a single output, based on a join expression.\r\nThe merge join does a join by taking advantage of two sets that are sorted on the join keys.\r\nThis allows the join operation to be done in a streaming fashion."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),': A boolean condition that describes whether each row from the left set "match" the row from the right set.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of the join (like INNER, LEFT, SEMI, etc)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"nestedloopjoin",children:"NestedLoopJoin"}),"\n",(0,r.jsx)(n.p,{children:"The join operation will combine two separate inputs into a single output, based on a join expression.\r\nThe nested loop join operator does a join by holding the entire right input and then iterating over it using the left input, evaluating the join expression on the Cartesian product of all rows, only outputting rows where the expression is true."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),': A boolean condition that describes whether each row from the left set "match" the row from the right set.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of the join (like INNER, LEFT, SEMI, etc)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"correlatednestedloopjoin",children:"CorrelatedNestedLoopJoin"}),"\n",(0,r.jsx)(n.p,{children:"The join operation will combine two separate inputs into a single output, based on a join expression.\r\nThe correlated nested loop join operator does a join by setting correlated variables to a context based on a row from left input, and reevaluating the right input with updated context."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"correlates"}),": Set of correlated variables which are set by current relational operator."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),': A boolean condition that describes whether each row from the left set "match" the row from the right set.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of the join (like INNER, LEFT, SEMI, etc)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"indexscan",children:"IndexScan"}),"\n",(0,r.jsxs)(n.p,{children:["Scans rows using a specified index.\r\nA ",(0,r.jsx)(n.code,{children:"searchBounds"})," is used to specify boundaries of index scan or look up.\r\nHence, if it is not specified, all rows will be read.\r\nA ",(0,r.jsx)(n.code,{children:"predicate"})," is applied before ",(0,r.jsx)(n.code,{children:"projection"}),".\r\nIf ",(0,r.jsx)(n.code,{children:"projection"})," is not specified, then ",(0,r.jsx)(n.code,{children:"fieldNames"})," enumerates columns returned from table."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"searchBounds"}),": List of bounds representing boundaries of the range scan or point look up Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tablescan",children:"TableScan"}),"\n",(0,r.jsxs)(n.p,{children:["Scans all rows from a table.\r\nA ",(0,r.jsx)(n.code,{children:"predicate"})," is applied before ",(0,r.jsx)(n.code,{children:"projection"}),".\r\nIf ",(0,r.jsx)(n.code,{children:"projection"})," is not specified, then ",(0,r.jsx)(n.code,{children:"fieldNames"})," enumerates columns returned from table."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"keyvalueget",children:"KeyValueGet"}),"\n",(0,r.jsx)(n.p,{children:"Optimized operator which leverages Key-Value API in get-by-key queries."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"key"}),": Key expression to do look up."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"keyvaluemodify",children:"KeyValueModify"}),"\n",(0,r.jsx)(n.p,{children:"Optimized operator which leverages Key-Value API in DML queries."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of data modification operation (e.g., INSERT, UPDATE, DELETE)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"sourceExpression"}),": Source expressions used for row computations for INSERT operation.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"key"}),": Source expressions used for row computations for DELETE operation.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"limit",children:"Limit"}),"\n",(0,r.jsx)(n.p,{children:"Limits the number of returned rows, with optional offset."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fetch"}),": Maximum number of rows to return.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"offset"}),": Number of rows to skip.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"project",children:"Project"}),"\n",(0,r.jsx)(n.p,{children:"Projects specified expressions or columns from the input."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"receiver",children:"Receiver"}),"\n",(0,r.jsxs)(n.p,{children:["Receives data sent by a ",(0,r.jsx)(n.code,{children:"Sender"})," during distributed query execution."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"sourceFragmentId"}),": An identifier of source fragment, indicating the origin of a data flow edge between fragments."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"sender",children:"Sender"}),"\n",(0,r.jsxs)(n.p,{children:["Sends data to a ",(0,r.jsx)(n.code,{children:"Receiver"})," during distributed query execution."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"targetFragmentId"}),": An identifier of target fragment, indicating the origin of a data flow edge between fragments."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"distribution"}),": A distribution strategy that describes how the rows are distributed across nodes.\r\nPossible values are:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"single"}),": a single copy of data is available at single node."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"broadcast"}),": every participating node has the its own copy of all the data."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"random"}),": single copy of data is partitioned and spread randomly across all participating nodes."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"hash"}),": single copy of data is partitioned and spread across nodes based on system-defined hash function of specified columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": single copy of data is partitioned and spread across nodes with regard of distribution of specified table."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"identity"}),": data is distributed with regard to value of specified column."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"selectcount",children:"SelectCount"}),"\n",(0,r.jsxs)(n.p,{children:["Optimized operator for various non-transactional ",(0,r.jsx)(n.code,{children:"SELECT COUNT(*)"})," variations of queries."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"sort",children:"Sort"}),"\n",(0,r.jsxs)(n.p,{children:["Sorts rows based on specified collation.\r\nIf ",(0,r.jsx)(n.code,{children:"fetch"})," attribute is provided, then ",(0,r.jsx)(n.code,{children:"Sort"})," node implements Top-N semantic, implying that only ",(0,r.jsx)(n.code,{children:"fetch"})," + ",(0,r.jsx)(n.code,{children:"offset"})," rows will be stored in memory during sorting phase."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"collation"}),": List of one or more fields to sort by."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fetch"}),": Maximum number of rows to return.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"offset"}),": Number of rows to skip.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"systemviewscan",children:"SystemViewScan"}),"\n",(0,r.jsxs)(n.p,{children:["Scans all rows from a system view.\r\nA ",(0,r.jsx)(n.code,{children:"predicate"})," is applied before ",(0,r.jsx)(n.code,{children:"projection"}),".\r\nIf ",(0,r.jsx)(n.code,{children:"projection"})," is not specified, then ",(0,r.jsx)(n.code,{children:"fieldNames"})," enumerates columns returned from system view."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": System view being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate.\r\nOptional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tablefunctionscan",children:"TableFunctionScan"}),"\n",(0,r.jsx)(n.p,{children:"Scans over a function producing result set."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"invocation"}),": Name of the function producing source result set."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tablemodify",children:"TableModify"}),"\n",(0,r.jsx)(n.p,{children:"Applies DML operations on a table (INSERT, UPDATE, DELETE)."}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of data modification operation (e.g., INSERT, UPDATE, DELETE)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"values",children:"Values"}),"\n",(0,r.jsxs)(n.p,{children:["Produces literal in-memory rows as input (e.g., ",(0,r.jsx)(n.code,{children:"VALUES (1), (2)"}),")."]}),"\n",(0,r.jsx)(n.p,{children:"Attributes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"tuples"}),": List of literal tuples to return."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows.\r\nOptional."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>d});var s=i(96540);const r={},o=s.createContext(r);function t(e){const n=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/51b5f6a1.38609390.js b/docs/ignite3/assets/js/51b5f6a1.38609390.js deleted file mode 100644 index afa5ce1d88..0000000000 --- a/docs/ignite3/assets/js/51b5f6a1.38609390.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9196],{12352:(e,n,t)=>{t.d(n,{A:()=>T});var i=t(96540),r=t(67489),a=t(12181),s=t(6342),o=t(95293);let l=null;async function d(){return l||(l=async function(){return(await t.e(2279).then(t.bind(t,22279))).default}()),l}const c="docusaurus-mermaid-container";function h(){const{colorMode:e}=(0,o.G)(),n=(0,s.p)().mermaid,t=n.theme[e],{options:r}=n;return(0,i.useMemo)(()=>({startOnLoad:!1,...r,theme:t}),[t,r])}function u({text:e,config:n}){const[t,r]=(0,i.useState)(null),a=(0,i.useState)(`mermaid-svg-${Math.round(1e7*Math.random())}`)[0],s=h(),o=n??s;return(0,i.useEffect)(()=>{(async function({id:e,text:n,config:t}){const i=await d();i.initialize(t);try{return await i.render(e,n)}catch(r){throw document.querySelector(`#d${e}`)?.remove(),r}})({id:a,text:e,config:o}).then(r).catch(e=>{r(()=>{throw e})})},[a,e,o]),t}const m={container:"container_lyt7"};var p=t(74848);function g({renderResult:e}){const n=(0,i.useRef)(null);return(0,i.useEffect)(()=>{const t=n.current;e.bindFunctions?.(t)},[e]),(0,p.jsx)("div",{ref:n,className:`${c} ${m.container}`,dangerouslySetInnerHTML:{__html:e.svg}})}function I({value:e}){const n=u({text:e});return null===n?null:(0,p.jsx)(g,{renderResult:n})}function T(e){return(0,p.jsx)(r.A,{fallback:e=>(0,p.jsx)(a.MN,{...e}),children:(0,p.jsx)(I,{...e})})}},17197:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"getting-started/work-with-sql","title":"Working with SQL","description":"This guide walks you through using Apache Ignite 3 SQL capabilities via the command-line interface. You\'ll set up a distributed Apache Ignite cluster, create and manipulate the Chinook database (a sample database representing a digital media store), and learn to leverage Apache Ignite\'s powerful SQL features.","source":"@site/docs/getting-started/work-with-sql.md","sourceDirName":"getting-started","slug":"/getting-started/work-with-sql","permalink":"/docs/ignite3/3.1.0/getting-started/work-with-sql","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Working with SQL"},"sidebar":"tutorialSidebar","previous":{"title":"Start a Cluster in Docker","permalink":"/docs/ignite3/3.1.0/getting-started/start-cluster"},"next":{"title":"Using Java API","permalink":"/docs/ignite3/3.1.0/getting-started/key-value-api"}}');var r=t(74848),a=t(28453),s=t(12352);const o={title:"Working with SQL"},l=void 0,d={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Before Starting",id:"before-starting",level:2},{value:"Setting Up an Apache Ignite 3 Cluster",id:"setting-up-an-apache-ignite-3-cluster",level:2},{value:"Starting the Cluster",id:"starting-the-cluster",level:3},{value:"Connecting to the Cluster Using Ignite CLI",id:"connecting-to-the-cluster-using-ignite-cli",level:2},{value:"Starting the CLI",id:"starting-the-cli",level:3},{value:"Initializing the Cluster",id:"initializing-the-cluster",level:3},{value:"Creating the Chinook Database Schema",id:"creating-the-chinook-database-schema",level:2},{value:"Entering SQL Mode",id:"entering-sql-mode",level:3},{value:"Creating Distribution Zones",id:"creating-distribution-zones",level:3},{value:"Database Entity Relationship",id:"database-entity-relationship",level:3},{value:"Creating Core Tables",id:"creating-core-tables",level:3},{value:"Verifying Table Creation",id:"verifying-table-creation",level:3},{value:"Inserting Sample Data",id:"inserting-sample-data",level:2},{value:"Adding Artists and Albums",id:"adding-artists-and-albums",level:3},{value:"Adding Genres and Media Types",id:"adding-genres-and-media-types",level:3},{value:"Adding Tracks",id:"adding-tracks",level:3},{value:"Adding Employees and Customers",id:"adding-employees-and-customers",level:3},{value:"Adding Invoices and Invoice Lines",id:"adding-invoices-and-invoice-lines",level:3},{value:"Querying Data in Ignite SQL",id:"querying-data-in-ignite-sql",level:2},{value:"Basic Queries",id:"basic-queries",level:3},{value:"Joins",id:"joins",level:3},{value:"Data Manipulation in Ignite SQL",id:"data-manipulation-in-ignite-sql",level:2},{value:"Understanding Distributed Updates",id:"understanding-distributed-updates",level:3},{value:"Inserting New Data",id:"inserting-new-data",level:3},{value:"Updating Existing Data",id:"updating-existing-data",level:3},{value:"Deleting Data",id:"deleting-data",level:3},{value:"Advanced SQL Features",id:"advanced-sql-features",level:2},{value:"Querying System Views",id:"querying-system-views",level:3},{value:"Creating Indexes for Better Performance",id:"creating-indexes-for-better-performance",level:3},{value:"Creating a Dashboard Using SQL",id:"creating-a-dashboard-using-sql",level:2},{value:"Monthly Sales Summary",id:"monthly-sales-summary",level:3},{value:"Top Selling Genres",id:"top-selling-genres",level:3},{value:"Sales Performance by Employee",id:"sales-performance-by-employee",level:3},{value:"Top 20 Longest Tracks with Genres",id:"top-20-longest-tracks-with-genres",level:3},{value:"Customer Purchase Patterns by Month",id:"customer-purchase-patterns-by-month",level:3},{value:"Performance Tuning with Colocated Tables",id:"performance-tuning-with-colocated-tables",level:2},{value:"Colocated Queries",id:"colocated-queries",level:3},{value:"Key Observations in the Execution Plan",id:"key-observations-in-the-execution-plan",level:4},{value:"Improved Cololocation Strategy",id:"improved-cololocation-strategy",level:3},{value:"Key Observations in the Execution Plan",id:"key-observations-in-the-execution-plan-1",level:4},{value:"Colocation Impact",id:"colocation-impact",level:4},{value:"Cleaning Up",id:"cleaning-up",level:2},{value:"Best Practices for Ignite SQL",id:"best-practices-for-ignite-sql",level:2},{value:"Schema Design",id:"schema-design",level:3},{value:"Query Optimization",id:"query-optimization",level:3},{value:"Transaction Management",id:"transaction-management",level:3},{value:"Resource Management",id:"resource-management",level:3},{value:"What's Next",id:"whats-next",level:2}];function h(e){const n={admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"This guide walks you through using Apache Ignite 3 SQL capabilities via the command-line interface. You'll set up a distributed Apache Ignite cluster, create and manipulate the Chinook database (a sample database representing a digital media store), and learn to leverage Apache Ignite's powerful SQL features."}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Docker and Docker Compose installed on your system"}),"\n",(0,r.jsx)(n.li,{children:"Basic familiarity with SQL"}),"\n",(0,r.jsx)(n.li,{children:"Command-line terminal access"}),"\n",(0,r.jsx)(n.li,{children:"8GB+ of available RAM for running the containers"}),"\n",(0,r.jsx)(n.li,{children:"SQL directory with Chinook Database files downloaded"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"before-starting",children:"Before Starting"}),"\n",(0,r.jsx)(n.p,{children:"This tutorial uses prepared files to streamline deployment. Make sure you have downloaded the required files:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"docker-compose.yml (file not available in docs)"}),"\n",(0,r.jsx)(n.li,{children:"sql archive (file not available in docs)"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Unpack the archive into a new folder, and place it and the docker compose file in the same directory where you will be running the Docker CLI commands. The tutorial expects these SQL files to be available and mounted to the container."}),"\n",(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"Without these files, you will be unable to load the sample data needed for the exercises."})}),"\n",(0,r.jsx)(n.h2,{id:"setting-up-an-apache-ignite-3-cluster",children:"Setting Up an Apache Ignite 3 Cluster"}),"\n",(0,r.jsx)(n.p,{children:"Before we can start using SQL, we need to set up an Apache Ignite cluster. We will use Docker Compose to create a three-node cluster."}),"\n",(0,r.jsx)(n.h3,{id:"starting-the-cluster",children:"Starting the Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["Open a terminal in the directory containing the docker compose file ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file and start the cluster with Docker:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(n.p,{children:"This command starts the cluster in detached mode. You should see startup messages from all three nodes. When they are ready, you will see messages indicating that the servers have started successfully."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\r\n\r\n[+] Running 4\r\n \u2714 Network ignite3_default Created\r\n \u2714 Container ignite3-node2-1 Started\r\n \u2714 Container ignite3-node3-1 Started\r\n \u2714 Container ignite3-node1-1 Started\n"})}),"\n",(0,r.jsx)(n.p,{children:"You can check that all containers are running with the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose ps\n"})}),"\n",(0,r.jsx)(n.p,{children:'You should see all three nodes with a "running" status.'}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:'Verify that all three nodes are "running" before continuing.'})}),"\n",(0,r.jsx)(n.h2,{id:"connecting-to-the-cluster-using-ignite-cli",children:"Connecting to the Cluster Using Ignite CLI"}),"\n",(0,r.jsx)(n.p,{children:"Now we will connect to our running cluster using Ignite command-line interface (CLI)."}),"\n",(0,r.jsx)(n.h3,{id:"starting-the-cli",children:"Starting the CLI"}),"\n",(0,r.jsx)(n.p,{children:"In your terminal, run:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker run --rm -it --network=host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -v ./sql/:/opt/ignite/downloads/ apacheignite/ignite:3.0.0 cli\n"})}),"\n",(0,r.jsx)(n.p,{children:"This starts an interactive CLI container connected to the same Docker network as our cluster and mounts a volume containing the sql files for the Chinook Database. When prompted, connect to the default node. If you refused the connection, you can do it manually with the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"connect http://localhost:10300\n"})}),"\n",(0,r.jsxs)(n.p,{children:["You should see a message that you're connected to ",(0,r.jsx)(n.code,{children:"http://localhost:10300"})," and a note that the cluster is not initialized."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"The CLI container runs separately from the cluster nodes, but connects to them over the Docker network."})}),"\n",(0,r.jsx)(n.h3,{id:"initializing-the-cluster",children:"Initializing the Cluster"}),"\n",(0,r.jsx)(n.p,{children:"Before we can use the cluster, we need to initialize it:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster init --name=ignite3 --metastorage-group=node1,node2,node3\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"If the license is not available, make sure the license file was mounted correctly."})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:" # ___ __\r\n ### / | ____ ____ _ _____ / /_ ___\r\n # ##### / /| | / __ \\ / __ `// ___// __ \\ / _ \\\r\n ### ###### / ___ | / /_/ // /_/ // /__ / / / // ___/\r\n ##### ####### /_/ |_|/ .___/ \\__,_/ \\___//_/ /_/ \\___/\r\n ####### ###### /_/\r\n ######## #### ____ _ __ _____\r\n # ######## ## / _/____ _ ____ (_)/ /_ ___ |__ /\r\n #### ####### # / / / __ `// __ \\ / // __// _ \\ /_ <\r\n ##### ##### _/ / / /_/ // / / // // /_ / ___/ ___/ /\r\n #### ## /___/ \\__, //_/ /_//_/ \\__/ \\___/ /____/\r\n ## /____/\r\n\r\n Apache Ignite CLI version 3.0.0\r\n\r\n\r\nYou appear to have not connected to any node yet. Do you want to connect to the default node http://localhost:10300? [Y/n] y\r\nConnected to http://localhost:10300\r\nThe cluster is not initialized. Run cluster init command to initialize it.\r\n[node1]> cluster init --name=ignite3 --metastorage-group=node1,node2,node3\r\nCluster was initialized successfully\r\n[node1]>\n"})}),"\n",(0,r.jsx)(n.h2,{id:"creating-the-chinook-database-schema",children:"Creating the Chinook Database Schema"}),"\n",(0,r.jsx)(n.p,{children:"Now that our cluster is running and initialized, we can start using SQL to create and work with data in Ignite. The Chinook database is a digital music store dataset, with tables for artists, albums, tracks, customers, and sales."}),"\n",(0,r.jsx)(n.h3,{id:"entering-sql-mode",children:"Entering SQL Mode"}),"\n",(0,r.jsx)(n.p,{children:"To start working with SQL, enter SQL mode in the CLI:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"sql\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Your prompt should change to ",(0,r.jsx)(n.code,{children:"sql-cli>"})," indicating you're now in SQL mode."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"[node1]> sql\r\nsql-cli>\n"})}),"\n",(0,r.jsx)(n.h3,{id:"creating-distribution-zones",children:"Creating Distribution Zones"}),"\n",(0,r.jsx)(n.p,{children:"Before we create tables, let's set up distribution zones to control how our data is distributed and replicated across the cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS Chinook WITH replicas=2, storage_profiles='default';\r\nCREATE ZONE IF NOT EXISTS ChinookReplicated WITH replicas=3, partitions=25, storage_profiles='default';\n"})}),"\n",(0,r.jsx)(n.p,{children:"These commands create two zones:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"Chinook"})," - Standard zone with 2 replicas for most tables"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"ChinookReplicated"})," - Zone with 3 replicas for frequently accessed reference data"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"database-entity-relationship",children:"Database Entity Relationship"}),"\n",(0,r.jsx)(n.p,{children:"Here's the entity relationship diagram for our Chinook database:"}),"\n",(0,r.jsx)(s.A,{chart:"\nerDiagram\n ARTIST ||--o{ ALBUM : creates\n ALBUM ||--o{ TRACK : contains\n GENRE ||--o{ TRACK : categorizes\n MEDIATYPE ||--o{ TRACK : formats\n CUSTOMER ||--o{ INVOICE : places\n INVOICE ||--o{ INVOICELINE : contains\n TRACK ||--o{ INVOICELINE : purchased-in\n EMPLOYEE ||--o{ CUSTOMER : supports\n PLAYLIST ||--o{ PLAYLISTTRACK : contains\n TRACK ||--o{ PLAYLISTTRACK : appears-in\n"}),"\n",(0,r.jsx)(n.h3,{id:"creating-core-tables",children:"Creating Core Tables"}),"\n",(0,r.jsx)(n.p,{children:"Now let's create the main tables for the Chinook database. We will start with the Artist and Album tables."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Copy and paste the following SQL blocks at the ",(0,r.jsx)(n.code,{children:"sql-cli>"})," prompt then hit enter."]})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Artist (\r\n ArtistId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (ArtistId)\r\n) ZONE Chinook;\r\n\r\nCREATE TABLE Album (\r\n AlbumId INT NOT NULL,\r\n Title VARCHAR(160) NOT NULL,\r\n ArtistId INT NOT NULL,\r\n ReleaseYear INT,\r\n PRIMARY KEY (AlbumId, ArtistId)\r\n) COLOCATE BY (ArtistId) ZONE Chinook;\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"COLOCATE BY"})," clause in the ",(0,r.jsx)(n.strong,{children:"Album"})," table ensures that albums by the same artist are stored on the same nodes. This optimizes joins between Artist and Album tables by eliminating the need for network transfers during queries."]}),"\n",(0,r.jsx)(n.p,{children:"Next, let's create the Genre and MediaType reference tables:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Genre (\r\n GenreId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (GenreId)\r\n) ZONE ChinookReplicated;\r\n\r\nCREATE TABLE MediaType (\r\n MediaTypeId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (MediaTypeId)\r\n) ZONE ChinookReplicated;\n"})}),"\n",(0,r.jsxs)(n.p,{children:["These reference tables are placed in the ",(0,r.jsx)(n.code,{children:"ChinookReplicated"})," zone with 3 replicas because they contain static data that is frequently joined with other tables. Having a copy on each node improves read performance."]}),"\n",(0,r.jsx)(n.p,{children:"Now, let's create the Track table, which references the Album, Genre, and MediaType tables:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Track (\r\n TrackId INT NOT NULL,\r\n Name VARCHAR(200) NOT NULL,\r\n AlbumId INT,\r\n MediaTypeId INT NOT NULL,\r\n GenreId INT,\r\n Composer VARCHAR(220),\r\n Milliseconds INT NOT NULL,\r\n Bytes INT,\r\n UnitPrice NUMERIC(10,2) NOT NULL,\r\n PRIMARY KEY (TrackId, AlbumId)\r\n) COLOCATE BY (AlbumId) ZONE Chinook;\n"})}),"\n",(0,r.jsx)(n.p,{children:"Tracks are colocated by AlbumId, not by TrackId, because most queries join tracks with their albums. This colocation optimizes these common join patterns."}),"\n",(0,r.jsx)(n.p,{children:"Let's also create tables to manage customers, employees, and sales:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Employee (\r\n EmployeeId INT NOT NULL,\r\n LastName VARCHAR(20) NOT NULL,\r\n FirstName VARCHAR(20) NOT NULL,\r\n Title VARCHAR(30),\r\n ReportsTo INT,\r\n BirthDate DATE,\r\n HireDate DATE,\r\n Address VARCHAR(70),\r\n City VARCHAR(40),\r\n State VARCHAR(40),\r\n Country VARCHAR(40),\r\n PostalCode VARCHAR(10),\r\n Phone VARCHAR(24),\r\n Fax VARCHAR(24),\r\n Email VARCHAR(60),\r\n PRIMARY KEY (EmployeeId)\r\n) ZONE Chinook;\r\n\r\nCREATE TABLE Customer (\r\n CustomerId INT NOT NULL,\r\n FirstName VARCHAR(40) NOT NULL,\r\n LastName VARCHAR(20) NOT NULL,\r\n Company VARCHAR(80),\r\n Address VARCHAR(70),\r\n City VARCHAR(40),\r\n State VARCHAR(40),\r\n Country VARCHAR(40),\r\n PostalCode VARCHAR(10),\r\n Phone VARCHAR(24),\r\n Fax VARCHAR(24),\r\n Email VARCHAR(60) NOT NULL,\r\n SupportRepId INT,\r\n PRIMARY KEY (CustomerId)\r\n) ZONE Chinook;\r\n\r\nCREATE TABLE Invoice (\r\n InvoiceId INT NOT NULL,\r\n CustomerId INT NOT NULL,\r\n InvoiceDate DATE NOT NULL,\r\n BillingAddress VARCHAR(70),\r\n BillingCity VARCHAR(40),\r\n BillingState VARCHAR(40),\r\n BillingCountry VARCHAR(40),\r\n BillingPostalCode VARCHAR(10),\r\n Total NUMERIC(10,2) NOT NULL,\r\n PRIMARY KEY (InvoiceId, CustomerId)\r\n) COLOCATE BY (CustomerId) ZONE Chinook;\r\n\r\nCREATE TABLE InvoiceLine (\r\n InvoiceLineId INT NOT NULL,\r\n InvoiceId INT NOT NULL,\r\n TrackId INT NOT NULL,\r\n UnitPrice NUMERIC(10,2) NOT NULL,\r\n Quantity INT NOT NULL,\r\n PRIMARY KEY (InvoiceLineId, TrackId)\r\n) COLOCATE BY (TrackId) ZONE Chinook;\n"})}),"\n",(0,r.jsx)(n.p,{children:"Invoices are colocated by CustomerId and InvoiceLines are colocated by InvoiceId. This creates an efficient chain of locality: Customer \u2192 Invoice \u2192 InvoiceLine, optimizing queries that analyze customer purchase history."}),"\n",(0,r.jsx)(n.p,{children:"Finally, let's create the playlist-related tables:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Playlist (\r\n PlaylistId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (PlaylistId)\r\n) ZONE Chinook;\r\n\r\nCREATE TABLE PlaylistTrack (\r\n PlaylistId INT NOT NULL,\r\n TrackId INT NOT NULL,\r\n PRIMARY KEY (PlaylistId, TrackId)\r\n) ZONE Chinook;\n"})}),"\n",(0,r.jsx)(n.p,{children:"Note that PlaylistTrack is not colocated with Track. This is a design decision that prioritizes playlist operations over joining with track details. In a real-world scenario, you might make a different colocation choice depending on your most common query patterns."}),"\n",(0,r.jsx)(n.h3,{id:"verifying-table-creation",children:"Verifying Table Creation"}),"\n",(0,r.jsx)(n.p,{children:"Let's confirm that all our tables were created successfully:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"SELECT * FROM system.tables WHERE schema = 'PUBLIC';\n"})}),"\n",(0,r.jsx)(n.p,{children:"This query checks the system tables to verify that our tables exist. You should see a list of all the tables we've created."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql-cli> SELECT * FROM system.tables WHERE schema = 'PUBLIC';\r\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 SCHEMA \u2502 NAME \u2502 ID \u2502 PK_INDEX_ID \u2502 ZONE \u2502 STORAGE_PROFILE \u2502 COLOCATION_KEY_INDEX \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 PUBLIC \u2502 ALBUM \u2502 20 \u2502 21 \u2502 CHINOOK \u2502 default \u2502 ARTISTID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 GENRE \u2502 22 \u2502 23 \u2502 CHINOOKREPLICATED \u2502 default \u2502 GENREID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 ARTIST \u2502 18 \u2502 19 \u2502 CHINOOK \u2502 default \u2502 ARTISTID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 TRACK \u2502 26 \u2502 27 \u2502 CHINOOK \u2502 default \u2502 ALBUMID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 PLAYLIST \u2502 36 \u2502 37 \u2502 CHINOOK \u2502 default \u2502 PLAYLISTID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 PLAYLISTTRACK \u2502 38 \u2502 39 \u2502 CHINOOK \u2502 default \u2502 PLAYLISTID, TRACKID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 MEDIATYPE \u2502 24 \u2502 25 \u2502 CHINOOKREPLICATED \u2502 default \u2502 MEDIATYPEID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 INVOICELINE \u2502 34 \u2502 35 \u2502 CHINOOK \u2502 default \u2502 TRACKID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 EMPLOYEE \u2502 28 \u2502 29 \u2502 CHINOOK \u2502 default \u2502 EMPLOYEEID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 CUSTOMER \u2502 30 \u2502 31 \u2502 CHINOOK \u2502 default \u2502 CUSTOMERID \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 PUBLIC \u2502 INVOICE \u2502 32 \u2502 33 \u2502 CHINOOK \u2502 default \u2502 CUSTOMERID \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Checkpoint",type:"tip",children:(0,r.jsxs)(n.p,{children:["Verify that all tables appear in the ",(0,r.jsx)(n.code,{children:"system.tables"})," output with their proper zones and colocation settings before proceeding to the next section."]})}),"\n",(0,r.jsx)(n.h2,{id:"inserting-sample-data",children:"Inserting Sample Data"}),"\n",(0,r.jsx)(n.p,{children:"Now that we have our tables set up, let's populate them with sample data."}),"\n",(0,r.jsx)(n.h3,{id:"adding-artists-and-albums",children:"Adding Artists and Albums"}),"\n",(0,r.jsx)(n.p,{children:"Let's start by adding some artists."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Exit the interactive sql mode by typing ",(0,r.jsx)(n.code,{children:"exit;"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"Then, load the current store catalog from the sql data file."}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/current_catalog.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql-cli> exit;\r\n[node1]> sql --file=/opt/ignite/downloads/current_catalog.sql\r\nUpdated 275 rows.\r\nUpdated 347 rows.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"adding-genres-and-media-types",children:"Adding Genres and Media Types"}),"\n",(0,r.jsx)(n.p,{children:"Let's populate our reference tables the same way:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/media_and_genre.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"[node1]> sql --file=/opt/ignite/downloads/media_and_genre.sql\r\nUpdated 25 rows.\r\nUpdated 5 rows.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"adding-tracks",children:"Adding Tracks"}),"\n",(0,r.jsx)(n.p,{children:"Now let's add some tracks to our albums:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/tracks.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"[node1]> sql --file=/opt/ignite/downloads/tracks.sql\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 503 rows.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"adding-employees-and-customers",children:"Adding Employees and Customers"}),"\n",(0,r.jsx)(n.p,{children:"Let's add some employee and customer data:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/ee_and_cust.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"[node1]> sql --file=/opt/ignite/downloads/ee_and_cust.sql\r\nUpdated 8 rows.\r\nUpdated 59 rows.\n"})}),"\n",(0,r.jsx)(n.h3,{id:"adding-invoices-and-invoice-lines",children:"Adding Invoices and Invoice Lines"}),"\n",(0,r.jsx)(n.p,{children:"Finally, let's add some sales data:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql --file=/opt/ignite/downloads/invoices.sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"[node1]> sql --file=/opt/ignite/downloads/invoices.sql\r\nUpdated 412 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 240 rows.\r\nUpdated 18 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 1000 rows.\r\nUpdated 715 rows.\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"Checkpoint",type:"tip",children:(0,r.jsx)(n.p,{children:'Verify that all the data has been loaded successfully by checking that the "Updated X rows" messages match the expected row counts for each file.'})}),"\n",(0,r.jsx)(n.h2,{id:"querying-data-in-ignite-sql",children:"Querying Data in Ignite SQL"}),"\n",(0,r.jsx)(n.p,{children:"Now that we have data in our tables, let's run some SQL queries to explore the Chinook database."}),"\n",(0,r.jsx)(n.h3,{id:"basic-queries",children:"Basic Queries"}),"\n",(0,r.jsxs)(n.p,{children:["Let's return to the ",(0,r.jsx)(n.code,{children:"sql-cli>"})," and start with some simple SELECT queries:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Get all artists\r\nSELECT * FROM Artist;\r\n\r\n-- Get all albums for a specific artist\r\nSELECT * FROM Album WHERE ArtistId = 3;\r\n\r\n-- Get all tracks for a specific album\r\nSELECT * FROM Track WHERE AlbumId = 133;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"joins",children:"Joins"}),"\n",(0,r.jsx)(n.p,{children:"Now let's try some more complex queries with joins:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Get all tracks with artist and album information\r\nSELECT\r\n t.Name AS TrackName,\r\n a.Title AS AlbumTitle,\r\n ar.Name AS ArtistName\r\nFROM\r\n Track t\r\n JOIN Album a ON t.AlbumId = a.AlbumId\r\n JOIN Artist ar ON a.ArtistId = ar.ArtistId\r\nLIMIT 10;\n"})}),"\n",(0,r.jsx)(n.h2,{id:"data-manipulation-in-ignite-sql",children:"Data Manipulation in Ignite SQL"}),"\n",(0,r.jsx)(n.p,{children:"Let's explore how to modify data using SQL in Ignite."}),"\n",(0,r.jsx)(n.h3,{id:"understanding-distributed-updates",children:"Understanding Distributed Updates"}),"\n",(0,r.jsx)(n.p,{children:"When you update data in a distributed database, the changes need to be coordinated across multiple nodes:"}),"\n",(0,r.jsx)(s.A,{chart:"\nsequenceDiagram\n participant Client\n participant Node1\n participant Node2\n participant Node3\n\n Client->>Node1: UPDATE request\n Node1->>Node1: Update local primary copy\n Node1->>Node2: Propagate changes to backup copy\n Node1--\x3e>Client: Confirm update completed\n"}),"\n",(0,r.jsx)(n.h3,{id:"inserting-new-data",children:"Inserting New Data"}),"\n",(0,r.jsx)(n.p,{children:"Let's add a new artist and album:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Insert a new artist\r\nINSERT INTO Artist (ArtistId, Name)\r\nVALUES (276, 'New Discovery Band');\r\n\r\n-- Insert a new album for this artist\r\nINSERT INTO Album (AlbumId, Title, ArtistId, ReleaseYear)\r\nVALUES (348, 'First Light', 276, 2023);\r\n\r\n-- Verify the insertions\r\nSELECT * FROM Artist WHERE ArtistId = 276;\r\nSELECT * FROM Album WHERE AlbumId = 348;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"updating-existing-data",children:"Updating Existing Data"}),"\n",(0,r.jsx)(n.p,{children:"Now let's update some of our existing data:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Update the album release year\r\nUPDATE Album\r\nSET ReleaseYear = 2024\r\nWHERE AlbumId = 348;\r\n\r\n-- Update the artist name\r\nUPDATE Artist\r\nSET Name = 'New Discovery Ensemble'\r\nWHERE ArtistId = 276;\r\n\r\n-- Verify the updates\r\nSELECT * FROM Artist WHERE ArtistId = 276;\r\nSELECT * FROM Album WHERE AlbumId = 348;\n"})}),"\n",(0,r.jsx)(n.p,{children:"In a distributed database like Ignite, these updates are automatically propagated to all replicas. The primary copy is updated first, then the changes are sent to the backup copies on other nodes."}),"\n",(0,r.jsx)(n.h3,{id:"deleting-data",children:"Deleting Data"}),"\n",(0,r.jsx)(n.p,{children:"Finally, let's clean up by deleting the data we added:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Delete the album\r\nDELETE FROM Album WHERE AlbumId = 348;\r\n\r\n-- Delete the artist\r\nDELETE FROM Artist WHERE ArtistId = 276;\r\n\r\n-- Verify the deletions\r\nSELECT * FROM Artist WHERE ArtistId = 276;\r\nSELECT * FROM Album WHERE AlbumId = 348;\n"})}),"\n",(0,r.jsx)(n.h2,{id:"advanced-sql-features",children:"Advanced SQL Features"}),"\n",(0,r.jsx)(n.p,{children:"Let's explore some of Ignite's more advanced SQL features."}),"\n",(0,r.jsx)(n.h3,{id:"querying-system-views",children:"Querying System Views"}),"\n",(0,r.jsx)(n.p,{children:"Ignite provides system views that let you inspect cluster metadata:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- View all tables in the cluster\r\nSELECT * FROM system.tables;\r\n\r\n-- View all zones\r\nSELECT * FROM system.zones;\r\n\r\n-- View all columns for a specific table\r\nSELECT * FROM system.table_columns WHERE TABLE_NAME = 'TRACK';\n"})}),"\n",(0,r.jsx)(n.p,{children:"System views provide important metadata about your cluster configuration. They are essential for monitoring and troubleshooting in production environments."}),"\n",(0,r.jsx)(n.h3,{id:"creating-indexes-for-better-performance",children:"Creating Indexes for Better Performance"}),"\n",(0,r.jsx)(n.p,{children:"Let's add some indexes to improve query performance:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Create an index on the Name column of the Track table\r\nCREATE INDEX idx_track_name ON Track (Name);\r\n\r\n-- Create a composite index on Artist and Album\r\nCREATE INDEX idx_album_artist ON Album (ArtistId, Title);\r\n\r\n-- Create a composite index on Track's AlbumId and Name columns to optimize joins with Album table\r\n-- and to improve performance when filtering or sorting by track name within an album\r\nCREATE INDEX idx_track_albumid_name ON Track(AlbumId, Name);\r\n\r\n-- Create an index on Album Title to speed up searches and sorts by album title\r\nCREATE INDEX idx_album_title ON Album(Title);\r\n\r\n-- Create a composite index on InvoiceLine connecting TrackId and InvoiceId\r\n-- This supports efficient queries that join InvoiceLine with Track while filtering by InvoiceId\r\nCREATE INDEX idx_invoiceline_trackid_invoiceid ON InvoiceLine(TrackId, InvoiceId);\r\n\r\n-- Create a hash index for lookups by email\r\nCREATE INDEX idx_customer_email ON Customer USING HASH (Email);\r\n\r\n-- Check index information\r\nSELECT * FROM system.indexes;\n"})}),"\n",(0,r.jsx)(n.p,{children:"Indexes improve query performance, but come with maintenance costs. Each write operation must also update all indexes. Choose indexes that support your most common query patterns rather than indexing everything."}),"\n",(0,r.jsx)(n.h2,{id:"creating-a-dashboard-using-sql",children:"Creating a Dashboard Using SQL"}),"\n",(0,r.jsx)(n.p,{children:"Let's create SQL queries that could be used for a music store dashboard. These queries could be saved and run periodically to generate reports."}),"\n",(0,r.jsx)(n.h3,{id:"monthly-sales-summary",children:"Monthly Sales Summary"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Monthly sales summary for the last 12 months\r\nSELECT\r\n CAST(EXTRACT(YEAR FROM i.InvoiceDate) AS VARCHAR) || '-' ||\r\n CASE\r\n WHEN EXTRACT(MONTH FROM i.InvoiceDate) < 10\r\n THEN '0' || CAST(EXTRACT(MONTH FROM i.InvoiceDate) AS VARCHAR)\r\n ELSE CAST(EXTRACT(MONTH FROM i.InvoiceDate) AS VARCHAR)\r\n END AS YearMonth,\r\n COUNT(DISTINCT i.InvoiceId) AS InvoiceCount,\r\n COUNT(DISTINCT i.CustomerId) AS CustomerCount,\r\n SUM(i.Total) AS MonthlyRevenue,\r\n AVG(i.Total) AS AverageOrderValue\r\nFROM\r\n Invoice i\r\nGROUP BY\r\n EXTRACT(YEAR FROM i.InvoiceDate), EXTRACT(MONTH FROM i.InvoiceDate)\r\nORDER BY\r\n YearMonth DESC;\n"})}),"\n",(0,r.jsx)(n.p,{children:"This query formats the year and month into a sortable string (YYYY-MM) while calculating several key business metrics."}),"\n",(0,r.jsx)(n.h3,{id:"top-selling-genres",children:"Top Selling Genres"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Top selling genres by revenue\r\nSELECT\r\n g.Name AS Genre,\r\n SUM(il.UnitPrice * il.Quantity) AS Revenue\r\nFROM\r\n InvoiceLine il\r\n JOIN Track t ON il.TrackId = t.TrackId\r\n JOIN Genre g ON t.GenreId = g.GenreId\r\nGROUP BY\r\n g.Name\r\nORDER BY\r\n Revenue DESC;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"sales-performance-by-employee",children:"Sales Performance by Employee"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Sales performance by employee\r\nSELECT\r\n e.EmployeeId,\r\n e.FirstName || ' ' || e.LastName AS EmployeeName,\r\n COUNT(DISTINCT i.InvoiceId) AS TotalInvoices,\r\n COUNT(DISTINCT i.CustomerId) AS UniqueCustomers,\r\n SUM(i.Total) AS TotalSales\r\nFROM\r\n Employee e\r\n JOIN Customer c ON e.EmployeeId = c.SupportRepId\r\n JOIN Invoice i ON c.CustomerId = i.CustomerId\r\nGROUP BY\r\n e.EmployeeId, e.FirstName, e.LastName\r\nORDER BY\r\n TotalSales DESC;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"top-20-longest-tracks-with-genres",children:"Top 20 Longest Tracks with Genres"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Top 20 longest tracks with genre information\r\nSELECT\r\n t.trackid,\r\n t.name AS track_name,\r\n g.name AS genre_name,\r\n ROUND(t.milliseconds / (1000 * 60), 2) AS duration_minutes\r\nFROM\r\n track t\r\n JOIN genre g ON t.genreId = g.genreId\r\nWHERE\r\n t.genreId < 17\r\nORDER BY\r\n duration_minutes DESC\r\nLIMIT\r\n 20;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"customer-purchase-patterns-by-month",children:"Customer Purchase Patterns by Month"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Customer purchase patterns by month\r\nSELECT\r\n c.CustomerId,\r\n c.FirstName || ' ' || c.LastName AS CustomerName,\r\n CAST(EXTRACT(YEAR FROM i.InvoiceDate) AS VARCHAR) || '-' ||\r\n CASE\r\n WHEN EXTRACT(MONTH FROM i.InvoiceDate) < 10\r\n THEN '0' || CAST(EXTRACT(MONTH FROM i.InvoiceDate) AS VARCHAR)\r\n ELSE CAST(EXTRACT(MONTH FROM i.InvoiceDate) AS VARCHAR)\r\n END AS YearMonth,\r\n COUNT(DISTINCT i.InvoiceId) AS NumberOfPurchases,\r\n SUM(i.Total) AS TotalSpent,\r\n SUM(i.Total) / COUNT(DISTINCT i.InvoiceId) AS AveragePurchaseValue\r\nFROM\r\n Customer c\r\n JOIN Invoice i ON c.CustomerId = i.CustomerId\r\nGROUP BY\r\n c.CustomerId, c.FirstName, c.LastName,\r\n EXTRACT(YEAR FROM i.InvoiceDate), EXTRACT(MONTH FROM i.InvoiceDate)\r\nORDER BY\r\n c.CustomerId, YearMonth;\n"})}),"\n",(0,r.jsx)(n.h2,{id:"performance-tuning-with-colocated-tables",children:"Performance Tuning with Colocated Tables"}),"\n",(0,r.jsx)(n.p,{children:"One of the key advantages of Ignite is its ability to optimize joins through data colocation. Let's explore this with our existing colocated tables."}),"\n",(0,r.jsx)(n.h3,{id:"colocated-queries",children:"Colocated Queries"}),"\n",(0,r.jsx)(n.p,{children:"Let's start by looking at a query where there is a mismatch in the colocation strategy."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"--This is an example of a poorly created table.\r\nCREATE TABLE InvoiceLine (\r\n InvoiceLineId INT NOT NULL,\r\n InvoiceId INT NOT NULL,\r\n TrackId INT NOT NULL,\r\n UnitPrice NUMERIC(10,2) NOT NULL,\r\n Quantity INT NOT NULL,\r\n PRIMARY KEY (InvoiceLineId, InvoiceId)\r\n) COLOCATE BY (InvoiceId) ZONE Chinook;\n"})}),"\n",(0,r.jsxs)(n.p,{children:["If we create the ",(0,r.jsx)(n.code,{children:"InvoiceLine"})," table to be colocated by InvoiceId, we end up with a mismatch for our query."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Album is colocated by ArtistId"}),"\n",(0,r.jsx)(n.li,{children:"Track is colocated by AlbumId"}),"\n",(0,r.jsx)(n.li,{children:"InvoiceLine is colocated by InvoiceId"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"This means that when you run a query joining InvoiceLine, Track, and Album, the data might be spread across different nodes because they're colocated on different keys. Our query is looking for invoice ID 1, then joining with Track and Album, but these tables are colocated on different keys."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"EXPLAIN PLAN FOR\r\nSELECT\r\n il.InvoiceId,\r\n COUNT(il.InvoiceLineId) AS LineItemCount,\r\n SUM(il.UnitPrice * il.Quantity) AS InvoiceTotal,\r\n t.Name AS TrackName,\r\n a.Title AS AlbumTitle\r\nFROM\r\n InvoiceLine il\r\n JOIN Track t ON il.TrackId = t.TrackId\r\n JOIN Album a ON t.AlbumId = a.AlbumId\r\nWHERE\r\n il.InvoiceId = 1\r\nGROUP BY\r\n il.InvoiceId, t.Name, a.Title;\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 PLAN \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 Project(INVOICEID=[$0], LINEITEMCOUNT=[$3], INVOICETOTAL=[$4], TRACKNAME=[$1], ALBUMTITLE=[$2]): rowcount = 4484471.100479999, cumulative cost = IgniteCost [rowCount=2.3054813220479995E7, cpu=2.3643376967575923E7, memory=9.866772781055996E7, io=2.0, network=50190.0], id = 23843 \u2551\r\n\u2551 ColocatedHashAggregate(group=[{0, 1, 2}], LINEITEMCOUNT=[COUNT()], INVOICETOTAL=[SUM($3)]): rowcount = 4484471.100479999, cumulative cost = IgniteCost [rowCount=1.8570341119999997E7, cpu=1.9158904867095925E7, memory=9.866772681055996E7, io=1.0, network=50189.0], id = 23842 \u2551\r\n\u2551 Project(INVOICEID=[$3], TRACKNAME=[$1], ALBUMTITLE=[$8], $f4=[*($5, $6)]): rowcount = 9189489.959999999, cumulative cost = IgniteCost [rowCount=9380851.159999998, cpu=9969414.907095924, memory=9362.6, io=1.0, network=50189.0], id = 23841 \u2551\r\n\u2551 MergeJoin(condition=[=($2, $7)], joinType=[inner], leftCollation=[[2]], rightCollation=[[0]]): rowcount = 9189489.959999999, cumulative cost = IgniteCost [rowCount=191360.19999999998, cpu=779923.9470959246, memory=9361.6, io=0.0, network=50188.0], id = 23840 \u2551\r\n\u2551 HashJoin(condition=[=($4, $0)], joinType=[inner]): rowcount = 176551.19999999998, cumulative cost = IgniteCost [rowCount=13421.0, cpu=65201.0, memory=6585.6, io=0.0, network=47412.0], id = 23836 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 3503.0, cumulative cost = IgniteCost [rowCount=7006.0, cpu=17515.0, memory=0.0, io=0.0, network=42036.0], id = 23833 \u2551\r\n\u2551 IndexScan(table=[[PUBLIC, TRACK]], tableId=[26], index=[IDX_TRACK_ALBUMID_NAME], type=[SORTED], requiredColumns=[{0, 1, 2}], collation=[[2, 1]]): rowcount = 3503.0, cumulative cost = IgniteCost [rowCount=3503.0, cpu=14012.0, memory=0.0, io=0.0, network=0.0], id = 23832 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 336.0, cumulative cost = IgniteCost [rowCount=2576.0, cpu=9296.0, memory=0.0, io=0.0, network=5376.0], id = 23835 \u2551\r\n\u2551 TableScan(table=[[PUBLIC, INVOICELINE]], tableId=[34], filters=[=($t0, 1)], requiredColumns=[{1, 2, 3, 4}]): rowcount = 336.0, cumulative cost = IgniteCost [rowCount=2240.0, cpu=8960.0, memory=0.0, io=0.0, network=0.0], id = 23834 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=1041.0, cpu=7130.147095924681, memory=2776.0, io=0.0, network=2776.0], id = 23839 \u2551\r\n\u2551 Sort(sort0=[$0], dir0=[ASC]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=694.0, cpu=6783.147095924681, memory=2776.0, io=0.0, network=0.0], id = 23838 \u2551\r\n\u2551 TableScan(table=[[PUBLIC, ALBUM]], tableId=[20], requiredColumns=[{0, 1}]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=347.0, cpu=347.0, memory=0.0, io=0.0, network=0.0], id = 23837 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,r.jsx)(n.h4,{id:"key-observations-in-the-execution-plan",children:"Key Observations in the Execution Plan"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"ColocatedHashAggregate Operation"}),": The plan uses a ",(0,r.jsx)(n.code,{children:"ColocatedHashAggregate"})," operation, which indicates Ignite recognizes that portions of the aggregation can happen on colocated data before results are combined. This reduces network transfer during the ",(0,r.jsx)(n.code,{children:"GROUP BY"})," operation."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Exchange Operations"}),": Several ",(0,r.jsx)(n.code,{children:"Exchange(distribution=[single])"})," operations appear in the plan, indicating data movement between nodes is still necessary. These operations are applied to the Album table, Track table, and InvoiceLine filtered results."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Join Implementation"}),": The plan shows a combination of ",(0,r.jsx)(n.code,{children:"HashJoin"})," and ",(0,r.jsx)(n.code,{children:"MergeJoin"})," operations rather than nested loop joins. The optimizer has determined these join types are more efficient for the data volumes involved:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"HashJoin for joining Track with Album"}),"\n",(0,r.jsx)(n.li,{children:"MergeJoin for joining the above result with InvoiceLine"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Efficient Data Access"}),": The query uses an ",(0,r.jsx)(n.code,{children:"IndexScan"})," with the ",(0,r.jsx)(n.code,{children:"IDX_INVOICELINE_INVOICE_TRACK"})," index rather than a full table scan on InvoiceLine. This provides:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Efficient filtering with ",(0,r.jsx)(n.code,{children:"searchBounds: [ExactBounds [bound=1], null]"})," for InvoiceId = 1"]}),"\n",(0,r.jsxs)(n.li,{children:["Pre-sorted results with ",(0,r.jsx)(n.code,{children:"collation: [INVOICEID ASC, TRACKID ASC]"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Row Count Estimation"}),": There appears to be a significant increase in estimated row counts after joins:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Initial InvoiceLine filtered rows: 746"}),"\n",(0,r.jsx)(n.li,{children:"After HashJoin with Album: 182,331"}),"\n",(0,r.jsx)(n.li,{children:"After MergeJoin with Track: 20,400,668"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"improved-cololocation-strategy",children:"Improved Cololocation Strategy"}),"\n",(0,r.jsxs)(n.p,{children:["However, if we create the ",(0,r.jsx)(n.code,{children:"InvoiceLine"})," table to be colocated by ",(0,r.jsx)(n.code,{children:"TrackId"}),", we dramaticly optimize our query."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"--This table was already created on an earlier step.\r\nCREATE TABLE InvoiceLine (\r\n InvoiceLineId INT NOT NULL,\r\n InvoiceId INT NOT NULL,\r\n TrackId INT NOT NULL,\r\n UnitPrice NUMERIC(10,2) NOT NULL,\r\n Quantity INT NOT NULL,\r\n PRIMARY KEY (InvoiceLineId, TrackId)\r\n) COLOCATE BY (TrackId) ZONE Chinook;\n"})}),"\n",(0,r.jsxs)(n.p,{children:["And run ",(0,r.jsx)(n.code,{children:"EXPLAIN PLAN FOR"})," again..."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"EXPLAIN PLAN FOR\r\nSELECT\r\n il.InvoiceId,\r\n COUNT(il.InvoiceLineId) AS LineItemCount,\r\n SUM(il.UnitPrice * il.Quantity) AS InvoiceTotal,\r\n t.Name AS TrackName,\r\n a.Title AS AlbumTitle\r\nFROM\r\n Track t\r\n JOIN Album a ON t.AlbumId = a.AlbumId\r\n JOIN InvoiceLine il ON t.TrackId = il.TrackId\r\nWHERE\r\n il.InvoiceId = 1\r\nGROUP BY\r\n il.InvoiceId, t.Name, a.Title;\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 PLAN \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 Project(INVOICEID=[$0], LINEITEMCOUNT=[$3], INVOICETOTAL=[$4], TRACKNAME=[$1], ALBUMTITLE=[$2]): rowcount = 2.0019960269999995E9, cumulative cost = IgniteCost [rowCount=1.020839200715E10, cpu=1.0214411135647097E10, memory=4.404685537199999E10, io=2.0, network=2444814.0], id = 25112 \u2551\r\n\u2551 ColocatedHashAggregate(group=[{0, 1, 2}], LINEITEMCOUNT=[COUNT()], INVOICETOTAL=[SUM($3)]): rowcount = 2.0019960269999995E9, cumulative cost = IgniteCost [rowCount=8.20639597915E9, cpu=8.212415107647097E9, memory=4.404685537099999E10, io=1.0, network=2444813.0], id = 25111 \u2551\r\n\u2551 Project(INVOICEID=[$5], TRACKNAME=[$1], ALBUMTITLE=[$4], $f4=[*($7, $8)]): rowcount = 4.102450875E9, cumulative cost = IgniteCost [rowCount=4.10394510415E9, cpu=4.109964232647096E9, memory=2942777.0, io=1.0, network=2444813.0], id = 25110 \u2551\r\n\u2551 HashJoin(condition=[=($0, $6)], joinType=[inner]): rowcount = 4.102450875E9, cumulative cost = IgniteCost [rowCount=1494228.15, cpu=7513356.647095924, memory=2942776.0, io=0.0, network=2444812.0], id = 25109 \u2551\r\n\u2551 MergeJoin(condition=[=($2, $3)], joinType=[inner], leftCollation=[[2, 1]], rightCollation=[[0]]): rowcount = 182331.15, cumulative cost = IgniteCost [rowCount=11897.0, cpu=40045.14709592468, memory=2776.0, io=0.0, network=44812.0], id = 25106 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 3503.0, cumulative cost = IgniteCost [rowCount=7006.0, cpu=17515.0, memory=0.0, io=0.0, network=42036.0], id = 25102 \u2551\r\n\u2551 IndexScan(table=[[PUBLIC, TRACK]], tableId=[26], index=[IDX_TRACK_ALBUMID_NAME], type=[SORTED], requiredColumns=[{0, 1, 2}], collation=[[2, 1]]): rowcount = 3503.0, cumulative cost = IgniteCost [rowCount=3503.0, cpu=14012.0, memory=0.0, io=0.0, network=0.0], id = 25101 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=1041.0, cpu=7130.147095924681, memory=2776.0, io=0.0, network=2776.0], id = 25105 \u2551\r\n\u2551 Sort(sort0=[$0], dir0=[ASC]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=694.0, cpu=6783.147095924681, memory=2776.0, io=0.0, network=0.0], id = 25104 \u2551\r\n\u2551 TableScan(table=[[PUBLIC, ALBUM]], tableId=[20], requiredColumns=[{0, 1}]): rowcount = 347.0, cumulative cost = IgniteCost [rowCount=347.0, cpu=347.0, memory=0.0, io=0.0, network=0.0], id = 25103 \u2551\r\n\u2551 Exchange(distribution=[single]): rowcount = 150000.0, cumulative cost = IgniteCost [rowCount=1150000.0, cpu=4150000.0, memory=0.0, io=0.0, network=2400000.0], id = 25108 \u2551\r\n\u2551 TableScan(table=[[PUBLIC, INVOICELINE]], tableId=[46], filters=[=($t0, 1)], requiredColumns=[{1, 2, 3, 4}]): rowcount = 150000.0, cumulative cost = IgniteCost [rowCount=1000000.0, cpu=4000000.0, memory=0.0, io=0.0, network=0.0], id = 25107 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,r.jsx)(n.h4,{id:"key-observations-in-the-execution-plan-1",children:"Key Observations in the Execution Plan"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"ColocatedHashAggregate Operation"}),": The plan uses a ",(0,r.jsx)(n.code,{children:"ColocatedHashAggregate"})," operation, which indicates Ignite recognizes that portions of the aggregation can happen on colocated data before results are combined. This reduces network transfer during the ",(0,r.jsx)(n.code,{children:"GROUP BY"})," operation."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Improved Row Count Estimates"}),": Notice the dramatic improvement in row count estimates, which now show just 1 row at each step. This indicates the optimizer has much better statistics and understanding of the actual data distribution compared to the original plan that estimated millions of rows."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Join Implementation"}),": The plan shows a combination of ",(0,r.jsx)(n.code,{children:"HashJoin"})," and ",(0,r.jsx)(n.code,{children:"MergeJoin"})," operations:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"HashJoin for joining Track with InvoiceLine"}),"\n",(0,r.jsx)(n.li,{children:"MergeJoin for joining the above result with Album"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Efficient Index Usage"}),": The query now uses the composite index ",(0,r.jsx)(n.code,{children:"IDX_TRACK_ALBUMID_NAME"})," on the Track table, providing:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Efficient sorted access by AlbumId and Name"}),"\n",(0,r.jsx)(n.li,{children:"Direct access to the fields needed for the join and select operations"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Exchange Operations"}),": While Exchange operations still appear in the plan, the estimated row counts are now minimal (just 1 row per exchange). This suggests much less data movement between nodes compared to the original plan where millions of rows were estimated to be transferred."]}),"\n",(0,r.jsx)(n.h4,{id:"colocation-impact",children:"Colocation Impact"}),"\n",(0,r.jsx)(n.p,{children:"The substantial improvement in this execution plan demonstrates the power of proper data colocation in Ignite. By:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Structuring the query to join the tables in the optimal order (Track \u2192 Album \u2192 InvoiceLine)"}),"\n",(0,r.jsx)(n.li,{children:"Creating appropriate supporting indexes"}),"\n",(0,r.jsx)(n.li,{children:"Ensuring proper colocation between related tables"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"We've achieved a dramatic reduction in estimated row counts and data movement. The execution plan now shows streamlined operations with minimal row estimates at each step, indicating an efficient execution path that takes advantage of data locality."}),"\n",(0,r.jsx)(n.p,{children:"This optimization approach highlights three key principles for optimal performance in distributed SQL databases:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Proper colocation of related data"}),"\n",(0,r.jsx)(n.li,{children:"Supporting indexes aligned with join patterns"}),"\n",(0,r.jsx)(n.li,{children:"Query structure that follows the colocation model"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,r.jsx)(n.p,{children:"When you are finished with the Ignite SQL CLI, you can exit by typing:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"exit;\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will return you to the Ignite CLI. To exit the Ignite CLI, type:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"exit\n"})}),"\n",(0,r.jsx)(n.p,{children:"To stop the Ignite cluster, run the following command in your terminal:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose down\n"})}),"\n",(0,r.jsx)(n.p,{children:"This will stop and remove the Docker containers for your Ignite cluster."}),"\n",(0,r.jsx)(n.h2,{id:"best-practices-for-ignite-sql",children:"Best Practices for Ignite SQL"}),"\n",(0,r.jsx)(n.p,{children:"To get the most out of Ignite SQL, follow these best practices:"}),"\n",(0,r.jsx)(n.h3,{id:"schema-design",children:"Schema Design"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use appropriate colocation for tables that are frequently joined"}),"\n",(0,r.jsx)(n.li,{children:"Choose primary keys that distribute data evenly across the cluster"}),"\n",(0,r.jsx)(n.li,{children:"Design with query patterns in mind, especially for large-scale deployments"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"query-optimization",children:"Query Optimization"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Create indexes for columns used in ",(0,r.jsx)(n.code,{children:"WHERE"}),", ",(0,r.jsx)(n.code,{children:"JOIN"}),", and ",(0,r.jsx)(n.code,{children:"ORDER BY"})," clauses"]}),"\n",(0,r.jsxs)(n.li,{children:["Use the ",(0,r.jsx)(n.code,{children:"EXPLAIN"})," statement to analyze and optimize your queries"]}),"\n",(0,r.jsx)(n.li,{children:"Avoid cartesian products and inefficient join conditions"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"transaction-management",children:"Transaction Management"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Keep transactions as short as possible"}),"\n",(0,r.jsx)(n.li,{children:"Do not hold transactions open during user think time"}),"\n",(0,r.jsx)(n.li,{children:"Group related operations into a single transaction for atomicity"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"resource-management",children:"Resource Management"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Monitor query performance in production"}),"\n",(0,r.jsx)(n.li,{children:"Consider partitioning strategies for very large tables"}),"\n",(0,r.jsx)(n.li,{children:"Use appropriate data types to minimize storage requirements"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"whats-next",children:"What's Next"}),"\n",(0,r.jsx)(n.p,{children:"Ignite's SQL capabilities make it a powerful platform for building distributed applications that require high throughput, low latency, and strong consistency. By following the patterns and practices in this guide, you can leverage Ignite SQL to build scalable, resilient systems."}),"\n",(0,r.jsx)(n.p,{children:"Remember that Ignite is not just a SQL database. It's a distributed computing platform with capabilities beyond what we've covered here. As you become more comfortable with Ignite SQL, you may want to explore other features such as compute grid, machine learning, and stream processing."}),"\n",(0,r.jsx)(n.p,{children:"Happy querying!"})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>o});var i=t(96540);const r={},a=i.createContext(r);function s(e){const n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/54b9d659.2476cb2e.js b/docs/ignite3/assets/js/54b9d659.2476cb2e.js deleted file mode 100644 index a09d7810e2..0000000000 --- a/docs/ignite3/assets/js/54b9d659.2476cb2e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4595],{2445:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>d});const l=JSON.parse('{"id":"developers-guide/java-to-tables","title":"Creating Tables from Java Classes","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/java-to-tables.md","sourceDirName":"developers-guide","slug":"/developers-guide/java-to-tables","permalink":"/docs/ignite3/3.0.0/developers-guide/java-to-tables","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Creating Tables from Java Classes","sidebar_label":"Creating Tables from Java Classes"},"sidebar":"tutorialSidebar","previous":{"title":"ODBC Standard Conformance","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification"},"next":{"title":"Distributed Computing","permalink":"/docs/ignite3/3.0.0/developers-guide/compute/"}}');var t=r(74848),a=r(28453);const i={title:"Creating Tables from Java Classes",sidebar_label:"Creating Tables from Java Classes"},s=void 0,o={},d=[{value:"Overview",id:"overview",level:2},{value:"Examples",id:"examples",level:2},{value:"Key-Value POJO Compatible with KeyValueView",id:"key-value-pojo-compatible-with-keyvalueview",level:3},{value:"Single POJO Compatible with RecordView",id:"single-pojo-compatible-with-recordview",level:3},{value:"The Builder Alternative to the @Table Annotation",id:"the-builder-alternative-to-the-table-annotation",level:3},{value:"Next Steps",id:"next-steps",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:["\n",(0,t.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(n.p,{children:["While ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl",children:"SQL DDL"})," supports a comprehensive set of table manipulation commands, you can also create tables and build indexes directly from a POJO using a simple Java API."]}),"\n",(0,t.jsxs)(n.p,{children:["This API supports custom annotations and simple builders; it works seamlessly with the Mapper interface, thus facilitating ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/table-api",children:"KeyValueView and RecordView"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"The Java API lets you perform the following operations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CREATE ZONE"}),"\n",(0,t.jsx)(n.li,{children:"CREATE TABLE"}),"\n",(0,t.jsx)(n.li,{children:"CREATE INDEX"}),"\n",(0,t.jsx)(n.li,{children:"DROP ZONE"}),"\n",(0,t.jsx)(n.li,{children:"DROP TABLE"}),"\n",(0,t.jsx)(n.li,{children:"DROP INDEX"}),"\n",(0,t.jsx)(n.li,{children:"CREATE SCHEMA"}),"\n",(0,t.jsx)(n.li,{children:"DROP SCHEMA"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Use the @Table and other annotations located in the ",(0,t.jsx)(n.code,{children:"org.apache.ignite.catalog.annotations"})," package."]}),"\n",(0,t.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,t.jsx)(n.h3,{id:"key-value-pojo-compatible-with-keyvalueview",children:"Key-Value POJO Compatible with KeyValueView"}),"\n",(0,t.jsxs)(n.p,{children:["The example below creates a table called ",(0,t.jsx)(n.code,{children:"kv_pojo"})," by using the POJO compatible with ",(0,t.jsx)(n.code,{children:"KeyValueView"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'@Table(value = "kv_pojo",\r\n zone = @Zone(value = "zone_test", replicas = 2, storageProfiles = "default"),\r\n colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},\r\n indexes = @Index(value = "ix", columns = {@ColumnRef("f_name"), @ColumnRef("l_name")}))\r\n\r\npublic static class PojoKey {\r\n @Id\r\n Integer id;\r\n\r\n @Id(SortOrder.DEFAULT)\r\n @Column(value = "id_str", length = 20)\r\n String idStr;\r\n\r\n public PojoKey(Integer id, String idStr) {\r\n this.id = id;\r\n this.idStr = idStr;\r\n }\r\n}\r\n\r\npublic static class PojoValue {\r\n @Column("f_name")\r\n private String firstName;\r\n\r\n @Column("l_name")\r\n private String lastName;\r\n\r\n public PojoValue(String firstName, String lastName) {\r\n this.firstName = firstName;\r\n this.lastName = lastName;\r\n }\r\n}\r\n\r\n\r\npublic static void main(String[] args) {\r\n\r\n System.out.println("\\nConnecting to server...");\r\n\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n ) {\r\n\r\n org.apache.ignite.table.Table myTable = client.catalog().createTable(PojoKey.class, PojoValue.class);\r\n\r\n KeyValueView kvView = myTable.keyValueView(PojoKey.class, PojoValue.class);\r\n PojoKey key = new PojoKey(1, "sample");\r\n PojoValue putValue = new PojoValue("John", "Smith");\r\n kvView.put(null, key, putValue);\r\n\r\n PojoValue getValue = kvView.get(null, key);\r\n System.out.println(\r\n "\\nRetrieved values:\\n"\r\n + " Account ID: " + key.id + \'\\n\'\r\n + " First name: " + getValue.firstName + \'\\n\'\r\n + " Last name" + getValue.lastName);\r\n\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"You need to create a storage profile in node configuration by using the CLI tool. See the Storage documentation for details."})}),"\n",(0,t.jsx)(n.p,{children:"The result is equivalent to the following SQL multi-statement:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS zone_test WITH PARTITIONS=2, STORAGE_PROFILES='default';\r\n\r\nCREATE TABLE IF NOT EXISTS kv_pojo (\r\n\tid int,\r\n\tid_str varchar(20),\r\n\tf_name varchar,\r\n\tl_name varchar,\r\n\tstr varchar,\r\n\tPRIMARY KEY (id, id_str)\r\n)\r\nCOLOCATE BY (id, id_str)\r\nWITH PRIMARY_ZONE='ZONE';\r\n\r\nCREATE INDEX ix (f_name, l_name desc nulls last);\n"})}),"\n",(0,t.jsx)(n.h3,{id:"single-pojo-compatible-with-recordview",children:"Single POJO Compatible with RecordView"}),"\n",(0,t.jsxs)(n.p,{children:["The example below creates the ",(0,t.jsx)(n.code,{children:"pojo_sample"})," table by using the POJO compatible with ",(0,t.jsx)(n.code,{children:"RecordView"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'@Table(value = "pojo_sample",\r\n zone = @Zone(value = "zone_test", replicas = 2, storageProfiles = "default"),\r\n colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},\r\n indexes = @Index(value = "ix_sample", columns = {@ColumnRef("f_name"), @ColumnRef("l_name")}))\r\n\r\npublic static class Pojo {\r\n @Id\r\n Integer id;\r\n\r\n @Id(SortOrder.DEFAULT)\r\n @Column(value = "id_str", length = 20)\r\n String idStr;\r\n\r\n @Column("f_name")\r\n String firstName;\r\n\r\n @Column("l_name")\r\n String lastName;\r\n\r\n String str;\r\n}\r\n\r\npublic static void main(String[] args) {\r\n\r\n System.out.println("\\nConnecting to server...");\r\n\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n ) {\r\n\r\n org.apache.ignite.table.Table myTable = client.catalog().createTable(Pojo.class);\r\n\r\n RecordView view = myTable.recordView();\r\n Tuple insertTuple = Tuple.create()\r\n .set("id", 1)\r\n .set("id_str", "sample")\r\n .set("f_name", "John")\r\n .set("l_name", "Smith");\r\n view.insert(null, insertTuple);\r\n\r\n Tuple getTuple = view.get(null, insertTuple);\r\n System.out.println(\r\n "\\nRetrieved record: " +\r\n getTuple.stringValue("f_name")\r\n );\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"the-builder-alternative-to-the-table-annotation",children:"The Builder Alternative to the @Table Annotation"}),"\n",(0,t.jsx)(n.p,{children:"The example below uses a builder to create a table instead on creating it from a Java class:"}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["When using builders, only the ",(0,t.jsx)(n.code,{children:"@Id"})," and ",(0,t.jsx)(n.code,{children:"@Column"})," annotations on fields are supported."]})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'IgniteCatalog catalog = client.catalog();\r\n\r\ncatalog.createTable(\r\n TableDefinition.builder("sampleTable3")\r\n .primaryKey("myKey")\r\n .columns(\r\n column("myKey", ColumnType.INT32),\r\n column("myValue", ColumnType.VARCHAR)\r\n )\r\n .build()\r\n);\r\n\r\nTable myTable = client.tables().table("sampleTable3");\r\nmyTable.keyValueView().put(null, Tuple.create().set("myKey", 1), Tuple.create().set("myValue", "John"));\r\n\r\nTuple value = myTable.keyValueView().get(null, Tuple.create().set("myKey", 1));\r\nSystem.out.println(\r\n "\\nRetrieved value:\\n" +\r\n value.stringValue("myValue")\r\n);\n'})}),"\n",(0,t.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,t.jsxs)(n.p,{children:["Once you have created a table using the Java API, you can manipulate it using the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl",children:"SQL commands"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>s});var l=r(96540);const t={},a=l.createContext(t);function i(e){const n=l.useContext(a);return l.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),l.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/555c49dc.36690bfd.js b/docs/ignite3/assets/js/555c49dc.36690bfd.js deleted file mode 100644 index dce4c4de8a..0000000000 --- a/docs/ignite3/assets/js/555c49dc.36690bfd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6391],{28453:(t,e,i)=>{i.d(e,{R:()=>a,x:()=>r});var s=i(96540);const n={},h=s.createContext(n);function a(t){const e=s.useContext(h);return s.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:a(t.components),s.createElement(h.Provider,{value:e},t.children)}},63367:(t,e,i)=>{i.d(e,{A:()=>U});var s=i(96540);const n={},h=!1,a=8,r=10,d="railroad-diagram",o=!0,l="center",c=8.5,m=7;class w{constructor(t,e,i){this.children=i||[],this.tagName=t,this.attrs=Z(e,{})}format(t,e,i){}addTo(t){if(t instanceof w)return t.children.push(this),this;var e=this.toSVG();return t.appendChild(e),e}toSVG(){var t=function(t,e,i){e=e||{},i=i||"";var s=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e)"xlink:href"===n?s.setAttributeNS("http://www.w3.org/1999/xlink","href",e[n]):s.setAttribute(n,e[n]);return s.textContent=i,s}(this.tagName,this.attrs);return"string"==typeof this.children?t.textContent=this.children:this.children.forEach(function(e){t.appendChild(e.toSVG())}),t}toString(){var t="<"+this.tagName,e="g"==this.tagName||"svg"==this.tagName;for(var i in this.attrs)t+=" "+i+'="'+(this.attrs[i]+"").replace(/&/g,"&").replace(/"/g,""")+'"';return t+=">",e&&(t+="\n"),"string"==typeof this.children?t+=this.children.replace(/[*_\`\[\]<&]/g,function(t){return"&#"+t.charCodeAt(0)+";"}):this.children.forEach(function(e){t+=e}),t+="\n"}walk(t){t(this)}}class u extends w{constructor(t,e){super("path"),this.attrs.d="M"+t+" "+e}m(t,e){return this.attrs.d+="m"+t+" "+e,this}h(t){return this.attrs.d+="h"+t,this}right(t){return this.h(Math.max(0,t))}left(t){return this.h(-Math.max(0,t))}v(t){return this.attrs.d+="v"+t,this}down(t){return this.v(Math.max(0,t))}up(t){return this.v(-Math.max(0,t))}arc(t){var e,i=r,s=r;return"e"!=t[0]&&"w"!=t[1]||(i*=-1),"s"!=t[0]&&"n"!=t[1]||(s*=-1),e="ne"==t||"es"==t||"sw"==t||"wn"==t?1:0,this.attrs.d+="a"+r+" "+r+" 0 0 "+e+" "+i+" "+s,this}arc_8(t,e){const i=r,s=1/Math.sqrt(2)*i,n=i-s;let h="a "+i+" "+i+" 0 0 "+("cw"==e?"1":"0")+" ";const a=t+e;return h+=("ncw"==a?[s,n]:"necw"==a?[n,s]:"ecw"==a?[-n,s]:"secw"==a?[-s,n]:"scw"==a?[-s,-n]:"swcw"==a?[-n,-s]:"wcw"==a?[n,-s]:"nwcw"==a?[s,-n]:"nccw"==a?[-s,n]:"nwccw"==a?[-n,s]:"wccw"==a?[n,s]:"swccw"==a?[s,n]:"sccw"==a?[s,-n]:"seccw"==a?[n,-s]:"eccw"==a?[-n,-s]:"neccw"==a?[-s,-n]:null).join(" "),this.attrs.d+=h,this}l(t,e){return this.attrs.d+="l"+t+" "+e,this}format(){return this.attrs.d+="h.5",this}}class p extends w{constructor(t,e,i,s){super(t,i,s),this.items=e.map(L)}walk(t){t(this),this.items.forEach(e=>e.walk(t))}}class g extends p{constructor(...t){super("svg",t,{class:d}),this.items[0]instanceof z||this.items.unshift(new z),this.items[this.items.length-1]instanceof A||this.items.push(new A),this.up=this.down=this.height=this.width=0;for(const e of this.items)this.width+=e.width+(e.needsSpace?20:0),this.up=Math.max(this.up,e.up-this.height),this.height+=e.height,this.down=Math.max(this.down-e.height,e.down);this.formatted=!1}format(t,e,i,s){t=Z(t,20),e=Z(e,t,20),i=Z(i,t,20);var n=s=Z(s,e,20),h=t;h+=this.up;for(var a=new w("g",o?{transform:"translate(.5 .5)"}:{}),r=0;rnew g(...t);class x extends w{constructor(...t){var e=new g(...t);return e.items[0]=new z({type:"complex"}),e.items[e.items.length-1]=new A({type:"complex"}),e}}n.ComplexDiagram=(...t)=>new x(...t);class f extends p{constructor(...t){super("g",t);this.items.length;this.needsSpace=!0,this.up=this.down=this.height=this.width=0;for(var e=0;e0&&(new u(t,e).h(10).addTo(this),t+=10),h.format(t,e,h.width).addTo(this),t+=h.width,e+=h.height,h.needsSpace&&nnew f(...t);class T extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("Stack() must have at least one child.");this.width=Math.max.apply(null,this.items.map(function(t){return t.width+(t.needsSpace?20:0)})),this.items.length>1&&(this.width+=2*r),this.needsSpace=!0,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=0;for(var e=this.items.length-1,i=0;i0&&(this.height+=Math.max(2*r,s.up+a)),i1&&(new u(t,e).h(r).addTo(this),t+=r);for(var h=0;h1?2*r:0);d.format(t,e,o).addTo(this),t+=o,e+=d.height,h!==this.items.length-1&&(new u(t,e).arc("ne").down(Math.max(0,d.down+a-2*r)).arc("es").left(o).arc("nw").down(Math.max(0,this.items[h+1].up+a-2*r)).arc("ws").addTo(this),e+=Math.max(d.down+a,2*r)+Math.max(this.items[h+1].up+a,2*r),t=n+r)}return this.items.length>1&&(new u(t,e).h(r).addTo(this),t+=r),new u(t,e).h(s[1]).addTo(this),this}}n.Stack=(...t)=>new T(...t);class j extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("OptionalSequence() must have at least one child.");if(1===t.length)return new f(t);var e=r;this.needsSpace=!1,this.width=0,this.up=0,this.height=D(this.items,function(t){return t.height}),this.down=this.items[0].down;for(var i=0,s=0;s0&&(this.down=Math.max(this.height+this.down,i+Math.max(2*e,n.down+a))-this.height);var d=(n.needsSpace?10:0)+n.width;this.width+=0===s?e+Math.max(d,e):2*e+Math.max(d,e)+e}h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="optseq")}format(t,e,i){var s=r,n=q(i,this.width);new u(t,e).right(n[0]).addTo(this),new u(t+n[0]+this.width,e+this.height).right(n[1]).addTo(this),t+=n[0];for(var h=e-this.up,d=this.items.length-1,o=0;onew j(...t);class v extends p{constructor(...t){if(super("g",t),1===t.length)return new f(t);if(2!==t.length)throw new RangeError("AlternatingSequence() must have one or two children.");this.needsSpace=!1;const e=r,i=a,s=Math.max,n=this.items[0],d=this.items[1],o=1/Math.sqrt(2)*e*2,l=(1-1/Math.sqrt(2))*e*2,c=Math.max(e,a),m=c-l+o,w=s(e+e,c/2+e+e,c/2+i+n.down);this.up=w+n.height+n.up;const u=s(e+e,c/2+e+e,c/2+i+d.up);this.down=u+d.height+d.down,this.height=0;const p=2*(n.needsSpace?10:0)+n.width,g=2*(d.needsSpace?10:0)+d.width;this.width=2*e+s(p,m,g)+2*e,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="altseq")}format(t,e,i){const s=r,n=q(i,this.width);new u(t,e).right(n[0]).addTo(this),t+=n[0],new u(t+this.width,e).right(n[1]).addTo(this);const h=this.items[0],d=this.items[1],o=this.up-h.up,l=this.up-h.up-h.height;new u(t,e).arc("se").up(o-2*s).arc("wn").addTo(this),h.format(t+2*s,e-o,this.width-4*s).addTo(this),new u(t+this.width-2*s,e-l).arc("ne").down(l-2*s).arc("ws").addTo(this);const c=this.down-d.down-d.height,m=this.down-d.down;new u(t,e).arc("ne").down(c-2*s).arc("ws").addTo(this),d.format(t+2*s,e+c,this.width-4*s).addTo(this),new u(t+this.width-2*s,e+m).arc("se").up(m-2*s).arc("wn").addTo(this);const w=1/Math.sqrt(2)*s*2,p=(1-1/Math.sqrt(2))*s*2,g=Math.max(s,a),x=g-p+w,f=(this.width-4*s-x)/2;return new u(t+s,e-g/2-s).arc("ws").right(f).arc_8("n","cw").l(x-w,g-p).arc_8("sw","ccw").right(f).arc("ne").addTo(this),new u(t+s,e+g/2+s).arc("wn").right(f).arc_8("s","ccw").l(x-w,-(g-p)).arc_8("nw","cw").right(f).arc("se").addTo(this),this}}n.AlternatingSequence=(...t)=>new v(...t);class b extends p{constructor(t,...e){if(super("g",e),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of Choice() must be an integer.");if(t<0||t>=e.length)throw new RangeError("The first argument of Choice() must be an index for one of the items.");this.normal=t;var i,s=e.length-1;this.width=Math.max.apply(null,this.items.map(function(t){return t.width}))+4*r,this.height=this.items[t].height,this.up=this.items[0].up;for(var n=0;n=0;o--){let i=this.items[o];o==this.normal-1&&(n=Math.max(2*r,this.items[this.normal].up+a+i.down+i.height)),new u(t,e).arc("se").up(n-2*r).arc("wn").addTo(this),i.format(t+2*r,e-n,d).addTo(this),new u(t+2*r+d,e-n+i.height).arc("ne").down(n-i.height+this.height-2*r).arc("ws").addTo(this),n+=Math.max(r,i.up+a+(0===o?0:this.items[o-1].down+this.items[o-1].height))}for(new u(t,e).right(2*r).addTo(this),this.items[this.normal].format(t+2*r,e,d).addTo(this),new u(t+2*r+d,e+this.height).right(2*r).addTo(this),o=this.normal+1;o<=h;o++){let i=this.items[o];o==this.normal+1&&(n=Math.max(2*r,this.height+this.items[this.normal].down+a+i.up)),new u(t,e).arc("ne").down(n-2*r).arc("ws").addTo(this),i.format(t+2*r,e+n,d).addTo(this),new u(t+2*r+d,e+n+i.height).arc("se").up(n-2*r+i.height-this.height).arc("wn").addTo(this),n+=Math.max(r,i.height+i.down+a+(o==h?0:this.items[o+1].up))}return this}}n.Choice=(...t)=>new b(...t);class E extends p{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("HorizontalChoice() must have at least one child.");if(1===t.length)return new f(t);const e=this.items.slice(0,-1),i=this.items.slice(1,-1),s=this.items[0],n=this.items[this.items.length-1];this.needsSpace=!1,this.width=r,this.width+=2*r*(this.items.length-1),this.width+=D(this.items,t=>t.width+(t.needsSpace?20:0)),this.width+=n.height>0?r:0,this.width+=r,this.height=0,this._upperTrack=Math.max(2*r,a,F(e,t=>t.up)+a),this.up=Math.max(this._upperTrack,n.up),this._lowerTrack=Math.max(a,F(i,t=>t.height+Math.max(t.down+a,2*r)),n.height+n.down+a),s.heightt.width+(t.needsSpace?20:0))+(this.items.length-2)*r*2-r;new u(t,e).arc("se").v(-(this._upperTrack-2*r)).arc("wn").h(d).addTo(this);var o=D(a,t=>t.width+(t.needsSpace?20:0))+(this.items.length-2)*r*2+(h.height>0?r:0)-r,l=t+r+n.width+(n.needsSpace?20:0)+2*r;new u(l,e+this._lowerTrack).h(o).arc("se").v(-(this._lowerTrack-2*r)).arc("wn").addTo(this);for(const[m,w]of function*(t){var e=0;for(const i of t)yield[e,i],e++}(this.items)){0===m?(new u(t,e).h(r).addTo(this),t+=r):(new u(t,e-this._upperTrack).arc("ne").v(this._upperTrack-2*r).arc("ws").addTo(this),t+=2*r);var c=w.width+(w.needsSpace?20:0);w.format(t,e,c).addTo(this),t+=c,m===this.items.length-1?0===w.height?new u(t,e).h(r).addTo(this):new u(t,e+w.height).arc("se").addTo(this):0===m&&w.height>this._lowerTrack?w.height-this._lowerTrack>=2*r?new u(t,e+w.height).arc("se").v(this._lowerTrack-w.height+2*r).arc("wn").addTo(this):new u(t,e+w.height).l(2*r,this._lowerTrack-w.height).addTo(this):new u(t,e+w.height).arc("ne").v(this._lowerTrack-w.height-2*r).arc("ws").addTo(this)}return this}}n.HorizontalChoice=(...t)=>new E(...t);class S extends p{constructor(t,e,...i){if(super("g",i),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of MultipleChoice() must be an integer.");if(t<0||t>=i.length)throw new RangeError("The first argument of MultipleChoice() must be an index for one of the items.");if(this.normal=t,"any"!=e&&"all"!=e)throw new SyntaxError("The second argument of MultipleChoice must be 'any' or 'all'.");this.type=e,this.needsSpace=!0,this.innerWidth=F(this.items,function(t){return t.width}),this.width=30+r+this.innerWidth+r+20,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=this.items[t].height;for(var s=0;st&&(this.down+=Math.max(e,i.up+a+this.items[s-1].down+this.items[s-1].height))}this.down-=this.items[t].height,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="multiplechoice")}format(t,e,i){var s=q(i,this.width);new u(t,e).right(s[0]).addTo(this),new u(t+s[0]+this.width,e+this.height).right(s[1]).addTo(this),t+=s[0];for(var n,h=this.items[this.normal],d=this.normal-1;d>=0;d--){var o=this.items[d];d==this.normal-1&&(n=Math.max(10+r,h.up+a+o.down+o.height)),new u(t+30,e).up(n-r).arc("wn").addTo(this),o.format(t+30+r,e-n,this.innerWidth).addTo(this),new u(t+30+r+this.innerWidth,e-n+o.height).arc("ne").down(n-o.height+this.height-r-10).addTo(this),0!==d&&(n+=Math.max(r,o.up+a+this.items[d-1].down+this.items[d-1].height))}for(new u(t+30,e).right(r).addTo(this),h.format(t+30+r,e,this.innerWidth).addTo(this),new u(t+30+r+this.innerWidth,e+this.height).right(r).addTo(this),d=this.normal+1;dnew S(...t);class y extends w{constructor(t,e){if(void 0===e)return new b(1,new R,t);if("skip"===e)return new b(0,new R,t);throw"Unknown value for Optional()'s 'skip' argument."}}n.Optional=(...t)=>new y(...t);class O extends w{constructor(t,e){super("g"),e=e||new R,this.item=L(t),this.rep=L(e),this.width=Math.max(this.item.width,this.rep.width)+2*r,this.height=this.item.height,this.up=this.item.up,this.down=Math.max(2*r,this.item.down+a+this.rep.up+this.rep.height+this.rep.down),this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="oneormore")}format(t,e,i){var s=q(i,this.width);new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e+this.height).h(s[1]).addTo(this),t+=s[0],new u(t,e).right(r).addTo(this),this.item.format(t+r,e,this.width-2*r).addTo(this),new u(t+this.width-r,e+this.height).right(r).addTo(this);var n=Math.max(2*r,this.item.height+this.item.down+a+this.rep.up);return new u(t+r,e).arc("nw").down(n-2*r).arc("ws").addTo(this),this.rep.format(t+r,e+n,this.width-2*r).addTo(this),new u(t+this.width-r,e+n+this.rep.height).arc("se").up(n-2*r+this.rep.height-this.item.height).arc("en").addTo(this),this}walk(t){t(this),this.item.walk(t),this.rep.walk(t)}}n.OneOrMore=(...t)=>new O(...t);class M extends w{constructor(t,e,i){return new y(new O(t,e),i)}}n.ZeroOrMore=(...t)=>new M(...t);class N extends w{constructor(t,e){super("g"),this.item=L(t),this.label=e instanceof w?e:e?new C(e):void 0,this.width=Math.max(this.item.width+(this.item.needsSpace?20:0),this.label?this.label.width:0,2*r),this.height=this.item.height,this.boxUp=this.up=Math.max(this.item.up+a,r),this.label&&(this.up+=this.label.up+this.label.height+this.label.down),this.down=Math.max(this.item.down+a,r),this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="group")}format(t,e,i){var s=q(i,this.width);return new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e+this.height).h(s[1]).addTo(this),t+=s[0],new w("rect",{x:t,y:e-this.boxUp,width:this.width,height:this.boxUp+this.height+this.down,rx:r,ry:r,class:"group-box"}).addTo(this),this.item.format(t,e,this.width).addTo(this),this.label&&this.label.format(t,e-(this.boxUp+this.label.down+this.label.height),this.label.width).addTo(this),this}walk(t){t(this),this.item.walk(t),this.label.walk(t)}}n.Group=(...t)=>new N(...t);class z extends w{constructor({type:t="simple",label:e}={}){super("g"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,e&&(this.label=""+e,this.width=Math.max(20,this.label.length*c+10)),h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="start")}format(t,e){let i=new u(t,e-10);return"complex"===this.type?i.down(20).m(0,-10).right(this.width).addTo(this):i.down(20).m(10,-20).down(20).m(-10,-10).right(this.width).addTo(this),this.label&&new w("text",{x:t,y:e-15,style:"text-anchor:start"},this.label).addTo(this),this}}n.Start=(...t)=>new z(...t);class A extends w{constructor({type:t="simple"}={}){super("path"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="end")}format(t,e){return"complex"===this.type?this.attrs.d="M "+t+" "+e+" h 20 m 0 -10 v 20":this.attrs.d="M "+t+" "+e+" h 20 m -10 -10 v 20 m 10 -20 v 20",this}}n.End=(...t)=>new A(...t);class I extends w{constructor(t,{href:e,title:i,cls:s}={}){super("g",{class:["terminal",s].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=s,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="terminal")}format(t,e,i){var s=q(i,this.width);new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e).h(s[1]).addTo(this),t+=s[0],new w("rect",{x:t,y:e-11,width:this.width,height:this.up+this.down,rx:10,ry:10}).addTo(this);var n=new w("text",{x:t+this.width/2,y:e+4},this.text);return this.href?new w("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new w("title",{},[this.title]).addTo(this),this}}n.Terminal=(...t)=>new I(...t);class k extends w{constructor(t,{href:e,title:i,cls:s=""}={}){super("g",{class:["non-terminal",s].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=s,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="nonterminal")}format(t,e,i){var s=q(i,this.width);new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e).h(s[1]).addTo(this),t+=s[0],new w("rect",{x:t,y:e-11,width:this.width,height:this.up+this.down}).addTo(this);var n=new w("text",{x:t+this.width/2,y:e+4},this.text);return this.href?new w("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new w("title",{},[this.title]).addTo(this),this}}n.NonTerminal=(...t)=>new k(...t);class C extends w{constructor(t,{href:e,title:i,cls:s=""}={}){super("g",{class:["comment",s].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=s,this.width=this.text.length*m+10,this.height=0,this.up=8,this.down=8,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="comment")}format(t,e,i){var s=q(i,this.width);new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e+this.height).h(s[1]).addTo(this),t+=s[0];var n=new w("text",{x:t+this.width/2,y:e+5,class:"comment"},this.text);return this.href?new w("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new w("title",{},this.title).addTo(this),this}}n.Comment=(...t)=>new C(...t);class R extends w{constructor(){super("g"),this.width=0,this.height=0,this.up=0,this.down=0,this.needsSpace=!1,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="skip")}format(t,e,i){return new u(t,e).right(i).addTo(this),this}}n.Skip=(...t)=>new R(...t);class _ extends w{constructor({width:t=50,up:e=15,height:i=25,down:s=15,needsSpace:n=!0}={}){super("g"),this.width=t,this.height=i,this.up=e,this.down=s,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="block")}format(t,e,i){var s=q(i,this.width);return new u(t,e).h(s[0]).addTo(this),new u(t+s[0]+this.width,e).h(s[1]).addTo(this),t+=s[0],new w("rect",{x:t,y:e-this.up,width:this.width,height:this.up+this.height+this.down}).addTo(this),this}}function Z(...t){return t.reduce(function(t,e){return void 0!==t?t:e})}function q(t,e){var i=t-e;switch(l){case"left":return[0,i];case"right":return[i,0];default:return[i/2,i/2]}}function L(t){return t instanceof w?t:new I(""+t)}function D(t,e){return e||(e=function(t){return t}),t.map(e).reduce(function(t,e){return t+e},0)}function F(t,e){return e||(e=function(t){return t}),Math.max.apply(null,t.map(e))}n.Block=(...t)=>new _(...t);var P=i(74848);function U({children:t}){const e=(0,s.useRef)(null),i=(0,s.useRef)(null),[n,h]=(0,s.useState)(!1),a=e=>{if(e.current)try{const s=(...t)=>new g(...t),n=(...t)=>new I(...t),h=(...t)=>new k(...t),a=(...t)=>new y(...t),r=(...t)=>new f(...t),d=(...t)=>new b(...t),o=(...t)=>new R(...t),l=(...t)=>new C(...t),c=(...t)=>new O(...t),m=(...t)=>new M(...t),w=t.replace(/ComplexDiagram\(/g,"Diagram(").replace(/Start\([^)]*\),?\s*/g,"").replace(/,?\s*End\([^)]*\)/g,"").trim();try{const t=new Function("Diagram","Terminal","NonTerminal","Optional","Sequence","Choice","Skip","Comment","OneOrMore","ZeroOrMore",`'use strict'; return ${w};`)(s,n,h,a,r,d,o,l,c,m);if(!t||"function"!=typeof t.toSVG)throw new Error("Diagram function did not return a valid diagram object");e.current.innerHTML="";const i=t.toSVG();i.querySelectorAll("a[*|href]").forEach(t=>{const e=t.getAttributeNS("http://www.w3.org/1999/xlink","href");e&&t.setAttribute("href",e)}),e.current.appendChild(i)}catch(i){throw console.error("Error in diagram generation:",i),i}}catch(s){console.error("Error rendering railroad diagram:",s),e.current.innerHTML='

                                                              Error rendering diagram. Check console for details.

                                                              '}};(0,s.useEffect)(()=>{a(e)},[t]),(0,s.useEffect)(()=>{if(n){a(i);const t=t=>{"Escape"===t.key&&h(!1)};return document.addEventListener("keydown",t),document.body.style.overflow="hidden",()=>{document.removeEventListener("keydown",t),document.body.style.overflow=""}}},[n,t]);return(0,P.jsxs)(P.Fragment,{children:[(0,P.jsxs)("div",{className:"railroad-diagram-wrapper",children:[(0,P.jsx)("button",{className:"railroad-expand-button",onClick:()=>h(!0),"aria-label":"Expand diagram",title:"View full size",children:(0,P.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:(0,P.jsx)("path",{d:"M1.5 1a.5.5 0 0 0-.5.5v4a.5.5 0 0 1-1 0v-4A1.5 1.5 0 0 1 1.5 0h4a.5.5 0 0 1 0 1h-4zM10 .5a.5.5 0 0 1 .5-.5h4A1.5 1.5 0 0 1 16 1.5v4a.5.5 0 0 1-1 0v-4a.5.5 0 0 0-.5-.5h-4a.5.5 0 0 1-.5-.5zM.5 10a.5.5 0 0 1 .5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 1 0 1h-4A1.5 1.5 0 0 1 0 14.5v-4a.5.5 0 0 1 .5-.5zm15 0a.5.5 0 0 1 .5.5v4a1.5 1.5 0 0 1-1.5 1.5h-4a.5.5 0 0 1 0-1h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 1 .5-.5z"})})}),(0,P.jsx)("div",{ref:e,className:"railroad-diagram-container"})]}),n&&(0,P.jsx)("div",{className:"railroad-modal-overlay",onClick:t=>{t.target===t.currentTarget&&h(!1)},children:(0,P.jsxs)("div",{className:"railroad-modal-content",children:[(0,P.jsx)("button",{className:"railroad-modal-close",onClick:()=>h(!1),"aria-label":"Close",title:"Close (ESC)",children:"\xd7"}),(0,P.jsx)("div",{ref:i,className:"railroad-diagram-container railroad-diagram-modal"})]})})]})}},88045:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>o,contentTitle:()=>d,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"sql/reference/language-definition/distribution-zones","title":"Distribution Zones","description":"This section describes Apache Ignite 3 distribution zones. In Apache Ignite 3, you can fine-tune distribution of your partitions on nodes for better performance and stability.","source":"@site/docs/sql/reference/language-definition/distribution-zones.mdx","sourceDirName":"sql/reference/language-definition","slug":"/sql/reference/language-definition/distribution-zones","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"id":"distribution-zones","title":"Distribution Zones","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Data Manipulation Language (DML)","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/dml"},"next":{"title":"Transactions","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/transactions"}}');var n=i(74848),h=i(28453),a=i(63367);const r={id:"distribution-zones",title:"Distribution Zones",sidebar_position:1},d="Distribution Zones",o={},l=[{value:"CREATE ZONE",id:"create-zone",level:2},{value:"Keywords and parameters",id:"keywords-and-parameters",level:3},{value:"Examples",id:"examples",level:3},{value:"ALTER ZONE",id:"alter-zone",level:2},{value:"ALTER ZONE RENAME TO new_qualified_zone_name",id:"alter-zone-rename-to-new_qualified_zone_name",level:3},{value:"Keywords and parameters",id:"keywords-and-parameters-1",level:4},{value:"Examples",id:"examples-1",level:4},{value:"ALTER ZONE SET",id:"alter-zone-set",level:3},{value:"Keywords and parameters",id:"keywords-and-parameters-2",level:4},{value:"Examples",id:"examples-2",level:4},{value:"DROP ZONE",id:"drop-zone",level:2},{value:"Keywords and parameters",id:"keywords-and-parameters-3",level:3},{value:"Examples",id:"examples-3",level:3}];function c(t){const e={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,h.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"distribution-zones",children:"Distribution Zones"})}),"\n",(0,n.jsx)(e.p,{children:"This section describes Apache Ignite 3 distribution zones. In Apache Ignite 3, you can fine-tune distribution of your partitions on nodes for better performance and stability."}),"\n",(0,n.jsx)(e.h2,{id:"create-zone",children:"CREATE ZONE"}),"\n",(0,n.jsx)(e.p,{children:"Creates a new distribution zone."}),"\n",(0,n.jsx)(e.admonition,{type:"note",children:(0,n.jsxs)(e.p,{children:["This can also be done via the ",(0,n.jsx)(e.a,{href:"/3.1.0/develop/work-with-data/java-to-tables",children:"Java API"}),"."]})}),"\n",(0,n.jsx)(a.A,{children:'\nDiagram(\nTerminal("CREATE ZONE"),\nOptional(Terminal("IF NOT EXISTS")),\nNonTerminal("qualified_zone_name"),\nOptional(\nSequence(\nTerminal("("),\nOneOrMore(\nNonTerminal("zone_parameter"),\nTerminal(",")\n),\nTerminal(")")\n)\n),\nEnd({ type: "complex" })\n)\n'}),"\n",(0,n.jsx)(a.A,{children:'\nDiagram(\nStart({ type: "complex" }),\nTerminal("STORAGE PROFILES"),\nTerminal("["),\nOneOrMore(\nNonTerminal("storage_profile"),\nTerminal(",")\n),\nTerminal("]"),\nTerminal(";")\n)\n'}),"\n",(0,n.jsx)(e.h3,{id:"keywords-and-parameters",children:"Keywords and parameters"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"IF NOT EXISTS"})," - create a zone only if a different zone with the same name does not exist."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"qualified_zone_name"})," - a name of the distribution zone. Can be specified as a case-sensitive string or case-insensitive identifier. Does not need to exist at the moment of table creation, and can be created before writing data."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"STORAGE PROFILES"})," - Required. Comma-separated list of the profiles of the storage engines to use."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"PARTITIONS"})," - the number of partition the data is divided into. Partitions are then split between nodes for storage."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"REPLICAS"})," - the number of copies of each partition."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"NODES FILTER"})," - specifies the nodes that can be used to store data in the distribution zone based on node attributes. You can configure node attributes by using cli. Filter uses JSONPath rules. If the attribute is not found, all negative comparisons will be valid. For example, ",(0,n.jsx)(e.code,{children:"$[?(@.storage != 'SSD']}"})," will also include nodes without the ",(0,n.jsx)(e.code,{children:"storage"})," attribute specified."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"AUTO SCALE UP"})," - Configures automatic scaling up of the distribution zone. Possible values:"]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"OFF"})," - disables the automatic distribution zone adjustment."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"integer"})," - the delay in seconds between the new node joining and the start of distribution zone adjustment. Possible values are between 0 and 2147483647. Default value: 5."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"AUTO SCALE DOWN"})," - Configures automatic scaling down of the distribution zone. Possible values:"]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"OFF"})," - disables the automatic distribution zone adjustment. Default value."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"integer"})," - the delay in seconds between the new node joining and the start of distribution zone adjustment. Possible values are between 0 and 2147483647."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"CONSISTENCY MODE"})," - how the zone handles partition majority losses. If set to ",(0,n.jsx)(e.code,{children:"STRONG CONSISTENCY"}),", the data will become unavailable until majority is restored (typically, this means nodes leaving and returning to the cluster). ",(0,n.jsx)(e.code,{children:"HIGH AVAILABILITY"})," means that the data will be written and read from remaining nodes, accepting possible data loss. Default value: ",(0,n.jsx)(e.code,{children:"STRONG_CONSISTENCY"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"QUORUM SIZE"})," - the size of the majority of nodes in the consensus of a replication group. Quorum size is determined by the replica count."]}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Minimal"})," value: ",(0,n.jsx)(e.code,{children:"1"})," if there is only one replica and ",(0,n.jsx)(e.code,{children:"2"})," if there is more than one.\r\n",(0,n.jsx)(e.em,{children:"Maximum"})," value: half the total number of replicas rounded up."]}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Default values"}),": ",(0,n.jsx)(e.code,{children:"3"})," if there are 5 and more replicas. Otherwise, the smallest of 2 and the total replica count."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(e.h3,{id:"examples",children:"Examples"}),"\n",(0,n.jsxs)(e.p,{children:["Creates an ",(0,n.jsx)(e.code,{children:"exampleZone"})," distribution zone that is specified as a ",(0,n.jsx)(e.em,{children:"case-insensitive"})," identifier:"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone STORAGE PROFILES['default'];\n"})}),"\n",(0,n.jsxs)(e.p,{children:["Creates a ",(0,n.jsx)(e.code,{children:'"myExampleZone"'})," distribution zone that is specified as a ",(0,n.jsx)(e.em,{children:"case-sensitive"})," string:"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS \"myExampleZone\" STORAGE PROFILES['default'];\n"})}),"\n",(0,n.jsxs)(e.p,{children:["Creates an ",(0,n.jsx)(e.code,{children:"exampleZone"})," distribution zone that will adjust 300 seconds after cluster topology changes before adding nodes:"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (AUTO SCALE UP 300) STORAGE PROFILES['default'];\n"})}),"\n",(0,n.jsxs)(e.p,{children:["Creates an ",(0,n.jsx)(e.code,{children:"exampleZone"})," distribution zone that will wait 600 seconds before scaling down any idle nodes once the cluster topology changes:"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (AUTO SCALE DOWN 600) STORAGE PROFILES['default'];\n"})}),"\n",(0,n.jsxs)(e.p,{children:["Creates an ",(0,n.jsx)(e.code,{children:"exampleZone"})," distribution zone where data will only be stored on nodes that have SSD attribute:"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (NODES FILTER '$[?(@.storage == \"SSD\")]') STORAGE PROFILES['default'];\n"})}),"\n",(0,n.jsx)(e.admonition,{type:"note",children:(0,n.jsxs)(e.p,{children:["The example above assumes that there are nodes that have the attribute set as shown in the ",(0,n.jsx)(e.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"node filtering"})," example."]})}),"\n",(0,n.jsxs)(e.p,{children:["Creates an ",(0,n.jsx)(e.code,{children:"exampleZone"})," distribution zone with consistency mode set to ",(0,n.jsx)(e.code,{children:"HIGH_AVAILABILITY"}),":"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (REPLICAS 5, CONSISTENCY MODE 'HIGH_AVAILABILITY') STORAGE PROFILES['default'];\n"})}),"\n",(0,n.jsx)(e.h2,{id:"alter-zone",children:"ALTER ZONE"}),"\n",(0,n.jsx)(e.p,{children:"Modifies a distribution zone."}),"\n",(0,n.jsx)(e.h3,{id:"alter-zone-rename-to-new_qualified_zone_name",children:"ALTER ZONE RENAME TO new_qualified_zone_name"}),"\n",(0,n.jsx)(a.A,{children:"\nDiagram(\nTerminal('ALTER ZONE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_zone_name'),\nTerminal('RENAME TO'),\nNonTerminal('new_qualified_zone_name'),\n)\n"}),"\n",(0,n.jsx)(e.h4,{id:"keywords-and-parameters-1",children:"Keywords and parameters"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"IF EXISTS"})," - do not throw an error if a zone with the specified name does not exist."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"qualified_zone_name"})," - the current name of the distribution zone."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"RENAME TO"})," - renames the selected zone to the new name."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"new_qualified_zone_name"})," - the new name of the distribution zone (assigned by ",(0,n.jsx)(e.code,{children:"RENAME"}),")."]}),"\n"]}),"\n",(0,n.jsx)(e.h4,{id:"examples-1",children:"Examples"}),"\n",(0,n.jsxs)(e.p,{children:["Renames the ",(0,n.jsx)(e.code,{children:"exampleZone"})," to ",(0,n.jsx)(e.code,{children:"renamedZone"}),":"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"ALTER ZONE IF EXISTS exampleZone RENAME TO renamedZone;\n"})}),"\n",(0,n.jsx)(e.h3,{id:"alter-zone-set",children:"ALTER ZONE SET"}),"\n",(0,n.jsx)(a.A,{children:"\nDiagram(\nTerminal('ALTER ZONE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_zone_name'),\nSequence(Terminal('SET'),\nOptional('('),\nOneOrMore(\nNonTerminal('parameter', {href:'./grammar-reference#parameter'}),\n','),\nOptional(')')))\n"}),"\n",(0,n.jsx)(e.h4,{id:"keywords-and-parameters-2",children:"Keywords and parameters"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"IF EXISTS"})," - do not throw an error if a zone with the specified name does not exist."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"qualified_zone_name"})," - a name of the distribution zone."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"SET"})," - assigns values to any or all of the following parameters:","\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"PARTITIONS"})," - the number of partitions"]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"REPLICAS"})," - the number of copies of each partition."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"NODES FILTER"})," - specifies the nodes that can be used to store data in the distribution zone based on node attributes."]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"AUTO SCALE"})," - Configures automatic distribution zone adjustment. Possible values:"]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"OFF"})," - disables the automatic distribution zone adjustment. Default value."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"integer"})," - the delay in seconds between the new node joining and the start of distribution zone adjustment. Possible values are between 0 and 2147483647."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"AUTO SCALE UP"})," - Configures automatic scaling up of the distribution zone. Possible values:"]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"OFF"})," - disables the automatic distribution zone adjustment. Default value."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"integer"})," - the delay in seconds between the new node joining and the start of distribution zone adjustment. Possible values are between 0 and 2147483647."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"AUTO SCALE DOWN"})," - Configures automatic scaling down of the distribution zone. Possible values:"]}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"OFF"})," - disables the automatic distribution zone adjustment. Default value."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.code,{children:"QUORUM SIZE"})," - the size of the majority of nodes in the consensus of a replication group. Quorum size is determined by the replica count."]}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Minimal"})," value: ",(0,n.jsx)(e.code,{children:"1"})," if there is only one replica and ",(0,n.jsx)(e.code,{children:"2"})," if there is more than one.\r\n",(0,n.jsx)(e.em,{children:"Maximum"})," value: half the total number of replicas rounded up."]}),"\n",(0,n.jsxs)(e.p,{children:[(0,n.jsx)(e.em,{children:"Default values"}),": ",(0,n.jsx)(e.code,{children:"3"})," if there are 5 and more replicas. Otherwise, the smallest of 2 and the total replica count."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(e.h4,{id:"examples-2",children:"Examples"}),"\n",(0,n.jsx)(e.p,{children:"Sets the number of data replicas to 10:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"ALTER ZONE IF EXISTS exampleZone SET REPLICAS 10;\n"})}),"\n",(0,n.jsx)(e.p,{children:"Sets data nodes filter to match the specific region, set the number of data replicas to 5 and quorum size to 3:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"ALTER ZONE IF EXISTS exampleZone SET (REPLICAS 5, QUORUM SIZE 3, NODES FILTER '$[?(@.region == \"US\")]');\n"})}),"\n",(0,n.jsx)(e.h2,{id:"drop-zone",children:"DROP ZONE"}),"\n",(0,n.jsx)(e.p,{children:"Drops an existing distribution zone."}),"\n",(0,n.jsx)(e.admonition,{type:"note",children:(0,n.jsxs)(e.p,{children:["This can also be done via the ",(0,n.jsx)(e.a,{href:"/3.1.0/develop/work-with-data/java-to-tables",children:"Java API"}),"."]})}),"\n",(0,n.jsx)(a.A,{children:"\nDiagram(\nTerminal('DROP ZONE'),\nTerminal('IF EXISTS'),\nNonTerminal('qualified_zone_name')\n)\n"}),"\n",(0,n.jsx)(e.h3,{id:"keywords-and-parameters-3",children:"Keywords and parameters"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"IF EXISTS"})," - do not throw an error if a zone with the specified name does not exist."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"qualified_zone_name"})," - the name of the distribution zone."]}),"\n"]}),"\n",(0,n.jsx)(e.h3,{id:"examples-3",children:"Examples"}),"\n",(0,n.jsx)(e.p,{children:"Drop Person table if the one exists:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"DROP ZONE IF EXISTS exampleZone;\n"})})]})}function m(t={}){const{wrapper:e}={...(0,h.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(c,{...t})}):c(t)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/55bb5782.277f34db.js b/docs/ignite3/assets/js/55bb5782.277f34db.js deleted file mode 100644 index 6580d754f9..0000000000 --- a/docs/ignite3/assets/js/55bb5782.277f34db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6147],{28453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>a});var s=r(96540);const c={},i=s.createContext(c);function o(e){const n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),s.createElement(i.Provider,{value:n},e.children)}},96514:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"sql/reference/sql-conformance/index","title":"SQL Conformance","description":"SQL standards compliance and reserved keywords.","source":"@site/docs/sql/reference/sql-conformance/index.mdx","sourceDirName":"sql/reference/sql-conformance","slug":"/sql/reference/sql-conformance/","permalink":"/docs/ignite3/3.1.0/sql/reference/sql-conformance/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"SQL Conformance"},"sidebar":"tutorialSidebar","previous":{"title":"Operational Commands","permalink":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands"},"next":{"title":"SQL Conformance","permalink":"/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview"}}');var c=r(74848),i=r(28453);const o={title:"SQL Conformance"},a="SQL Conformance",t={},d=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components},{IIcon:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"sql-conformance",children:"SQL Conformance"})}),"\n",(0,c.jsx)(n.p,{children:"SQL standards compliance and reserved keywords."}),"\n",(0,c.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,c.jsxs)("div",{className:"card-container",children:[(0,c.jsxs)("div",{className:"card",children:[(0,c.jsx)("div",{className:"card__header",children:(0,c.jsxs)("h3",{children:[(0,c.jsx)(r,{icon:"mdi:check-decagram-outline",height:"24"})," SQL Conformance"]})}),(0,c.jsx)("div",{className:"card__body",children:(0,c.jsx)("p",{children:"SQL standards compliance and supported ANSI SQL features."})}),(0,c.jsx)("div",{className:"card__footer",children:(0,c.jsx)("a",{href:"./sql-conformance/overview",children:"Learn more \u2192"})})]}),(0,c.jsxs)("div",{className:"card",children:[(0,c.jsx)("div",{className:"card__header",children:(0,c.jsxs)("h3",{children:[(0,c.jsx)(r,{icon:"mdi:key",height:"24"})," Keywords"]})}),(0,c.jsx)("div",{className:"card__body",children:(0,c.jsx)("p",{children:"Reserved SQL keywords and naming restrictions for identifiers."})}),(0,c.jsx)("div",{className:"card__footer",children:(0,c.jsx)("a",{href:"./sql-conformance/keywords",children:"Learn more \u2192"})})]})]}),"\n",(0,c.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"language-definition",children:"Language Definition"})," - DDL, DML, and grammar"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"data-types-and-functions",children:"Data Types and Functions"})," - SQL types and functions"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"../working-with-sql",children:"SQL Operations"})," - Execute queries"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/56216d1a.b80bcfb6.js b/docs/ignite3/assets/js/56216d1a.b80bcfb6.js deleted file mode 100644 index 36f4ba637e..0000000000 --- a/docs/ignite3/assets/js/56216d1a.b80bcfb6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3433],{28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var r=t(96540);const o={},s=r.createContext(o);function i(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:n},e.children)}},88769:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"api-reference/native-clients/dotnet/compute-api","title":"Compute API","description":"The Compute API executes distributed jobs across cluster nodes. Jobs run colocated with data for maximum performance, accessing the full Ignite API through an execution context.","source":"@site/docs/api-reference/native-clients/dotnet/compute-api.md","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/compute-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"Compute API","id":"compute-api","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"Transactions API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api"},"next":{"title":"Network API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api"}}');var o=t(74848),s=t(28453);const i={title:"Compute API",id:"compute-api",sidebar_position:6},a="Compute API",c={},l=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Job Targets",id:"job-targets",level:3},{value:"Broadcast Execution",id:"broadcast-execution",level:3},{value:"Execution Tracking",id:"execution-tracking",level:3},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Basic Job Execution",id:"basic-job-execution",level:3},{value:"Job with Data Access",id:"job-with-data-access",level:3},{value:"Broadcast Execution",id:"broadcast-execution-1",level:3},{value:"Job with Custom Marshallers",id:"job-with-custom-marshallers",level:3},{value:"Monitoring Job Execution",id:"monitoring-job-execution",level:3},{value:"Changing Job Priority",id:"changing-job-priority",level:3},{value:"Colocated Execution",id:"colocated-execution",level:3},{value:"Exception Handling",id:"exception-handling",level:3},{value:"Cancellation Support",id:"cancellation-support",level:3},{value:"Reference",id:"reference",level:2},{value:"ICompute Interface",id:"icompute-interface",level:3},{value:"IComputeJob<TArg, TResult> Interface",id:"icomputejobtarg-tresult-interface",level:3},{value:"IJobExecutionContext Interface",id:"ijobexecutioncontext-interface",level:3},{value:"IJobExecution<T> Interface",id:"ijobexecutiont-interface",level:3},{value:"IJobTarget<T> Interface",id:"ijobtargett-interface",level:3},{value:"JobDescriptor<TArg, TResult> Class",id:"jobdescriptortarg-tresult-class",level:3},{value:"JobState Record",id:"jobstate-record",level:3},{value:"JobStatus Enum",id:"jobstatus-enum",level:3},{value:"Best Practices",id:"best-practices",level:3}];function u(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"compute-api",children:"Compute API"})}),"\n",(0,o.jsx)(n.p,{children:"The Compute API executes distributed jobs across cluster nodes. Jobs run colocated with data for maximum performance, accessing the full Ignite API through an execution context."}),"\n",(0,o.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,o.jsx)(n.p,{children:"Compute jobs are C# classes deployed to the cluster that implement IComputeJob. Submit jobs for execution using the Compute API, which routes them to appropriate nodes based on the specified target."}),"\n",(0,o.jsx)(n.h3,{id:"job-targets",children:"Job Targets"}),"\n",(0,o.jsx)(n.p,{children:"Job targets control where jobs execute. Target by specific node, node name, or colocated partition to run jobs near data. The client routes job submissions to the appropriate cluster node based on the target."}),"\n",(0,o.jsx)(n.h3,{id:"broadcast-execution",children:"Broadcast Execution"}),"\n",(0,o.jsx)(n.p,{children:"Broadcast jobs run on multiple nodes simultaneously. Use this pattern for operations that need to execute across the entire cluster or a subset of nodes."}),"\n",(0,o.jsx)(n.h3,{id:"execution-tracking",children:"Execution Tracking"}),"\n",(0,o.jsx)(n.p,{children:"Job submission returns an execution handle for monitoring progress and retrieving results. Query job state, change priority, or wait for completion through the execution interface."}),"\n",(0,o.jsx)(n.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,o.jsx)(n.h3,{id:"basic-job-execution",children:"Basic Job Execution"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-csharp",children:'// Define job class (must be deployed to cluster)\r\npublic class HelloJob : IComputeJob\r\n{\r\n public IMarshaller? InputMarshaller => null;\r\n public IMarshaller? ResultMarshaller => null;\r\n\r\n public async ValueTask ExecuteAsync(\r\n IJobExecutionContext context,\r\n string arg,\r\n CancellationToken cancellationToken)\r\n {\r\n return $"Hello, {arg}!";\r\n }\r\n}\r\n\r\n// Submit job\r\nvar compute = client.Compute;\r\nvar jobDescriptor = new JobDescriptor(typeof(HelloJob));\r\n\r\nvar nodes = await client.GetClusterNodesAsync();\r\nvar target = JobTarget.Node(nodes[0]);\r\n\r\nvar execution = await compute.SubmitAsync(target, jobDescriptor, "World");\r\nvar result = await execution.GetResultAsync();\r\n\r\nConsole.WriteLine(result); // "Hello, World!"\n'})}),"\n",(0,o.jsx)(n.h3,{id:"job-with-data-access",children:"Job with Data Access"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-csharp",children:'public class DataProcessingJob : IComputeJob\r\n{\r\n public IMarshaller? InputMarshaller => null;\r\n public IMarshaller? ResultMarshaller => null;\r\n\r\n public async ValueTask ExecuteAsync(\r\n IJobExecutionContext context,\r\n long customerId,\r\n CancellationToken cancellationToken)\r\n {\r\n // Access Ignite APIs through context\r\n var tables = context.Ignite.Tables;\r\n var ordersTable = await tables.GetTableAsync("orders");\r\n var view = ordersTable.GetRecordView();\r\n\r\n // Execute SQL through context\r\n var sql = context.Ignite.Sql;\r\n var statement = new SqlStatement(\r\n "SELECT SUM(amount) FROM orders WHERE customer_id = ?");\r\n var resultSet = await sql.ExecuteAsync(\r\n null, statement, customerId);\r\n\r\n var sum = await resultSet.FirstOrDefaultAsync();\r\n return sum?.Total ?? 0m;\r\n }\r\n}\r\n\r\n// Submit job colocated with data\r\nvar compute = client.Compute;\r\nvar jobDescriptor = new JobDescriptor(typeof(DataProcessingJob));\r\n\r\nvar target = JobTarget.Colocated("orders", 12345L);\r\nvar execution = await compute.SubmitAsync(target, jobDescriptor, 12345L);\r\nvar totalAmount = await execution.GetResultAsync();\r\n\r\nConsole.WriteLine($"Total orders: ${totalAmount}");\n'})}),"\n",(0,o.jsx)(n.h3,{id:"broadcast-execution-1",children:"Broadcast Execution"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-csharp",children:'public class DiagnosticsJob : IComputeJob\r\n{\r\n public IMarshaller? InputMarshaller => null;\r\n public IMarshaller? ResultMarshaller => null;\r\n\r\n public async ValueTask ExecuteAsync(\r\n IJobExecutionContext context,\r\n string arg,\r\n CancellationToken cancellationToken)\r\n {\r\n // Gather node information\r\n return new NodeInfo\r\n {\r\n NodeName = Environment.MachineName,\r\n Timestamp = DateTime.UtcNow,\r\n MemoryUsed = GC.GetTotalMemory(false)\r\n };\r\n }\r\n}\r\n\r\n// Broadcast to all nodes\r\nvar compute = client.Compute;\r\nvar jobDescriptor = new JobDescriptor(typeof(DiagnosticsJob));\r\n\r\nvar nodes = await client.GetClusterNodesAsync();\r\nvar target = BroadcastTarget.Nodes(nodes);\r\n\r\nvar execution = await compute.SubmitBroadcastAsync(\r\n target, jobDescriptor, "diagnostics");\r\n\r\n// Get results from all nodes\r\nforeach (var jobExecution in execution.JobExecutions)\r\n{\r\n var nodeInfo = await jobExecution.GetResultAsync();\r\n Console.WriteLine($"{nodeInfo.NodeName}: {nodeInfo.MemoryUsed} bytes");\r\n}\n'})}),"\n",(0,o.jsx)(n.h3,{id:"job-with-custom-marshallers",children:"Job with Custom Marshallers"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-csharp",children:"public class ComplexDataJob : IComputeJob\r\n{\r\n // Provide custom serialization\r\n public IMarshaller? InputMarshaller => new CustomInputMarshaller();\r\n public IMarshaller? ResultMarshaller => new CustomOutputMarshaller();\r\n\r\n public async ValueTask ExecuteAsync(\r\n IJobExecutionContext context,\r\n CustomInput input,\r\n CancellationToken cancellationToken)\r\n {\r\n // Process complex input\r\n return new CustomOutput\r\n {\r\n ProcessedData = input.RawData.Select(x => x * 2).ToList()\r\n };\r\n }\r\n}\n"})}),"\n",(0,o.jsx)(n.h3,{id:"monitoring-job-execution",children:"Monitoring Job Execution"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-csharp",children:'var compute = client.Compute;\r\nvar jobDescriptor = new JobDescriptor(typeof(LongRunningJob));\r\n\r\nvar target = JobTarget.Node(nodes[0]);\r\nvar execution = await compute.SubmitAsync(target, jobDescriptor, "input");\r\n\r\n// Monitor job state\r\nwhile (true)\r\n{\r\n var state = await execution.GetStateAsync();\r\n if (state == null)\r\n {\r\n Console.WriteLine("Job information expired");\r\n break;\r\n }\r\n\r\n Console.WriteLine($"Job state: {state.Status}");\r\n\r\n if (state.Status == JobStatus.Completed ||\r\n state.Status == JobStatus.Failed ||\r\n state.Status == JobStatus.Canceled)\r\n {\r\n break;\r\n }\r\n\r\n await Task.Delay(1000);\r\n}\r\n\r\n// Get final result\r\ntry\r\n{\r\n var result = await execution.GetResultAsync();\r\n Console.WriteLine($"Result: {result}");\r\n}\r\ncatch (Exception ex)\r\n{\r\n Console.WriteLine($"Job failed: {ex.Message}");\r\n}\n'})}),"\n",(0,o.jsx)(n.h3,{id:"changing-job-priority",children:"Changing Job Priority"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-csharp",children:'var execution = await compute.SubmitAsync(target, jobDescriptor, "input");\r\n\r\n// Increase priority\r\nvar changed = await execution.ChangePriorityAsync(10);\r\nif (changed == true)\r\n{\r\n Console.WriteLine("Priority changed");\r\n}\r\nelse if (changed == false)\r\n{\r\n Console.WriteLine("Job already executing or completed");\r\n}\r\nelse\r\n{\r\n Console.WriteLine("Job not found (retention expired)");\r\n}\n'})}),"\n",(0,o.jsx)(n.h3,{id:"colocated-execution",children:"Colocated Execution"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-csharp",children:'// Execute job on node that owns the data\r\nvar compute = client.Compute;\r\nvar jobDescriptor = new JobDescriptor(typeof(ColocatedProcessor));\r\n\r\n// Target partition that contains the key\r\nvar target = JobTarget.Colocated("customers", customerId);\r\nvar execution = await compute.SubmitAsync(target, jobDescriptor, customerId);\r\nvar result = await execution.GetResultAsync();\n'})}),"\n",(0,o.jsx)(n.p,{children:"Colocated execution minimizes network traffic by running jobs on the node that stores the data."}),"\n",(0,o.jsx)(n.h3,{id:"exception-handling",children:"Exception Handling"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-csharp",children:'try\r\n{\r\n var execution = await compute.SubmitAsync(target, jobDescriptor, "input");\r\n var result = await execution.GetResultAsync();\r\n}\r\ncatch (IgniteException ex)\r\n{\r\n Console.WriteLine($"Job execution failed: {ex.Message}");\r\n}\r\ncatch (TimeoutException ex)\r\n{\r\n Console.WriteLine($"Job timed out: {ex.Message}");\r\n}\n'})}),"\n",(0,o.jsx)(n.h3,{id:"cancellation-support",children:"Cancellation Support"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-csharp",children:'using var cts = new CancellationTokenSource();\r\ncts.CancelAfter(TimeSpan.FromSeconds(30));\r\n\r\ntry\r\n{\r\n var execution = await compute.SubmitAsync(\r\n target, jobDescriptor, "input", cts.Token);\r\n var result = await execution.GetResultAsync();\r\n}\r\ncatch (OperationCanceledException)\r\n{\r\n Console.WriteLine("Job submission cancelled");\r\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,o.jsx)(n.h3,{id:"icompute-interface",children:"ICompute Interface"}),"\n",(0,o.jsx)(n.p,{children:"Job submission methods:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"SubmitAsync(IJobTarget target, JobDescriptor jobDescriptor, TArg arg, CancellationToken cancellationToken)"})," - Submit job to target with cancellation"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"SubmitAsync(IJobTarget target, JobDescriptor jobDescriptor, TArg arg)"})," - Submit job to target"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Broadcast methods:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"SubmitBroadcastAsync(IBroadcastJobTarget target, JobDescriptor jobDescriptor, TArg arg, CancellationToken cancellationToken)"})," - Broadcast job with cancellation"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"SubmitBroadcastAsync(IBroadcastJobTarget target, JobDescriptor jobDescriptor, TArg arg)"})," - Broadcast job"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Map-reduce methods:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"SubmitMapReduceAsync(TaskDescriptor taskDescriptor, TArg arg, CancellationToken cancellationToken)"})," - Submit map-reduce task with cancellation"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"SubmitMapReduceAsync(TaskDescriptor taskDescriptor, TArg arg)"})," - Submit map-reduce task"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"icomputejobtarg-tresult-interface",children:"IComputeJob Interface"}),"\n",(0,o.jsx)(n.p,{children:"Properties:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"InputMarshaller"})," - Optional custom marshaller for job arguments"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"ResultMarshaller"})," - Optional custom marshaller for job results"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Methods:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"ExecuteAsync(IJobExecutionContext context, TArg arg, CancellationToken cancellationToken)"})," - Execute the job on the server"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Jobs must be deployed to cluster nodes before submission. The job implementation has full access to the Ignite API through the execution context."}),"\n",(0,o.jsx)(n.h3,{id:"ijobexecutioncontext-interface",children:"IJobExecutionContext Interface"}),"\n",(0,o.jsx)(n.p,{children:"Properties:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Ignite"})," - Full Ignite API access for the server environment"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Use the context to access tables, execute SQL, start transactions, or perform other operations from within the job. All operations execute in the server context on the cluster node."}),"\n",(0,o.jsx)(n.h3,{id:"ijobexecutiont-interface",children:"IJobExecution Interface"}),"\n",(0,o.jsx)(n.p,{children:"Properties:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Id"})," - Unique job identifier (Guid)"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Node"})," - Cluster node where job is executing"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Methods:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"GetResultAsync()"})," - Wait for and retrieve job result"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"GetStateAsync()"})," - Get current job state (returns null if retention expired)"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"ChangePriorityAsync(int priority)"})," - Change job priority (returns true if changed, false if executing/completed, null if not found)"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"The execution handle tracks a submitted job. Use it to monitor progress, adjust priority, or wait for completion."}),"\n",(0,o.jsx)(n.h3,{id:"ijobtargett-interface",children:"IJobTarget Interface"}),"\n",(0,o.jsx)(n.p,{children:"Properties:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Data"})," - Target data (node, partition, etc.)"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Static factory methods (on JobTarget class):"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"JobTarget.Node(IClusterNode node)"})," - Target specific node"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"JobTarget.AnyNode(IEnumerable nodes)"})," - Target any node from collection"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"JobTarget.AnyNode(params IClusterNode[] nodes)"})," - Target any node from array"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"JobTarget.Colocated(string tableName, TKey key)"})," - Target partition containing key"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"JobTarget.Colocated(QualifiedName tableName, TKey key)"})," - Target partition containing key with qualified table name"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"jobdescriptortarg-tresult-class",children:"JobDescriptor Class"}),"\n",(0,o.jsx)(n.p,{children:"Constructors:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"JobDescriptor(Type type)"})," - Create descriptor from job type implementing IComputeJob"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"JobDescriptor(string jobClassName)"})," - Create descriptor with Java job class name for server-side execution"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"The job type must implement IComputeJob. Use the Type constructor for .NET jobs, or the string constructor for Java jobs on the server."}),"\n",(0,o.jsx)(n.h3,{id:"jobstate-record",children:"JobState Record"}),"\n",(0,o.jsx)(n.p,{children:"Job state information:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Id"})," - Job identifier (Guid)"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Status"})," - Current job status (JobStatus enum)"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"CreateTime"})," - Job creation timestamp"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"StartTime"})," - Job start timestamp (null when not yet started)"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"FinishTime"})," - Job completion timestamp (null when not yet finished)"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"State information may expire based on cluster configuration. GetStateAsync returns null when state information is no longer available."}),"\n",(0,o.jsx)(n.h3,{id:"jobstatus-enum",children:"JobStatus Enum"}),"\n",(0,o.jsx)(n.p,{children:"Possible job status values:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Queued"})," - Job is submitted and waiting for execution start"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Executing"})," - Job is currently running"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Failed"})," - Job was unexpectedly terminated during execution"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Completed"})," - Job executed successfully and returned result"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Canceling"})," - Job received cancel command but is still running"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Canceled"})," - Job was successfully cancelled"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"best-practices",children:"Best Practices"}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Deploy jobs before submission"}),". Jobs must exist on cluster nodes before the client can submit them."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Use colocated execution"})," when jobs access specific data. This eliminates network transfers between compute and data nodes."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Keep jobs focused"}),". Each job should perform a specific task. Use multiple jobs for complex workflows."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Handle exceptions in jobs"}),". Unhandled exceptions fail the job and return errors to the client."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Consider job serialization"}),". Job arguments and results cross network boundaries. Use efficient serialization or custom marshallers for large data."]}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Monitor long-running jobs"}),". Use GetStateAsync to track progress and detect failures early."]})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/5745cf5f.077c7aea.js b/docs/ignite3/assets/js/5745cf5f.077c7aea.js deleted file mode 100644 index 17e6c04674..0000000000 --- a/docs/ignite3/assets/js/5745cf5f.077c7aea.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2808],{28453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>s});var t=i(96540);const r={},o=t.createContext(r);function c(e){const n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),t.createElement(o.Provider,{value:n},e.children)}},75374:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>c,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"configure-and-operate/monitoring/index","title":"Monitoring","description":"Monitor Apache Ignite 3 cluster health and performance.","source":"@site/docs/configure-and-operate/monitoring/index.mdx","sourceDirName":"configure-and-operate/monitoring","slug":"/configure-and-operate/monitoring/","permalink":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Monitoring"},"sidebar":"tutorialSidebar","previous":{"title":"Colocation","permalink":"/docs/ignite3/3.1.0/configure-and-operate/operations/colocation"},"next":{"title":"Overview","permalink":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics"}}');var r=i(74848),o=i(28453);const c={title:"Monitoring"},s="Monitoring",a={},l=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components},{IIcon:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"monitoring",children:"Monitoring"})}),"\n",(0,r.jsx)(n.p,{children:"Monitor Apache Ignite 3 cluster health and performance."}),"\n",(0,r.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,r.jsx)("div",{className:"card-container",children:(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:chart-line",height:"24"})," Metrics"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Collect and export cluster metrics for monitoring and alerting."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./monitoring/metrics",children:"Learn more \u2192"})})]})}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"configuration",children:"Configuration"})," - Configure metrics collection"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"operations",children:"Operations"})," - Cluster operations"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"reference",children:"Reference"})," - Configuration reference"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/588bd741.ebb0b23f.js b/docs/ignite3/assets/js/588bd741.ebb0b23f.js deleted file mode 100644 index 0ed2056bd1..0000000000 --- a/docs/ignite3/assets/js/588bd741.ebb0b23f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4324],{11470:(e,n,t)=>{t.d(n,{A:()=>I});var i=t(96540),r=t(34164),l=t(17559),s=t(23104),a=t(56347),o=t(205),d=t(57485),c=t(31682),h=t(70679);function u(e){return i.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,i.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:t,default:i}})=>({value:e,label:n,attributes:t,default:i}))}(t);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const t=(0,a.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,d.aZ)(r),(0,i.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=p(e),[s,a]=(0,i.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:l})),[d,c]=x({queryString:t,groupId:r}),[u,g]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,h.Dv)(n);return[t,(0,i.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),j=(()=>{const e=d??u;return m({value:e,tabValues:l})?e:null})();(0,o.A)(()=>{j&&a(j)},[j]);return{selectedValue:s,selectValue:(0,i.useCallback)(e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);a(e),c(e),g(e)},[c,g,l]),tabValues:l}}var j=t(92303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=t(74848);function v({className:e,block:n,selectedValue:t,selectValue:i,tabValues:l}){const a=[],{blockElementScrollPositionUntilNextRender:o}=(0,s.a_)(),d=e=>{const n=e.currentTarget,r=a.indexOf(n),s=l[r].value;s!==t&&(o(n),i(s))},c=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:i})=>(0,b.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{a.push(e)},onKeyDown:c,onClick:d,...i,className:(0,r.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function w({lazy:e,children:n,selectedValue:t}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===t);return e?(0,i.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function y(e){const n=g(e);return(0,b.jsxs)("div",{className:(0,r.A)(l.G.tabs.container,"tabs-container",f.tabList),children:[(0,b.jsx)(v,{...n,...e}),(0,b.jsx)(w,{...n,...e})]})}function I(e){const n=(0,j.A)();return(0,b.jsx)(y,{...e,children:u(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var i=t(34164);const r={tabItem:"tabItem_Ymn6"};var l=t(74848);function s({children:e,hidden:n,className:t}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,i.A)(r.tabItem,t),hidden:n,children:e})}},23014:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"getting-started/quick-start","title":"Getting Started","description":"This guide shows you how to start working with Ignite. In this guide, we will download Ignite from the website, install it, start the database and perform some simple SQL queries by using the provided CLI tool.","source":"@site/docs/getting-started/quick-start.md","sourceDirName":"getting-started","slug":"/getting-started/quick-start","permalink":"/docs/ignite3/3.1.0/getting-started/quick-start","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Getting Started"},"sidebar":"tutorialSidebar","previous":{"title":"Introduction","permalink":"/docs/ignite3/3.1.0/getting-started/intro"},"next":{"title":"Start a Cluster in Docker","permalink":"/docs/ignite3/3.1.0/getting-started/start-cluster"}}');var r=t(74848),l=t(28453),s=t(11470),a=t(19365);const o={title:"Getting Started"},d=void 0,c={},h=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Install Ignite",id:"install-ignite",level:2},{value:"Start Ignite Node",id:"start-ignite-node",level:2},{value:"Start the Ignite CLI",id:"start-the-ignite-cli",level:2},{value:"Initialize Your Cluster",id:"initialize-your-cluster",level:2},{value:"Run SQL Statements Against the Cluster",id:"run-sql-statements-against-the-cluster",level:2},{value:"Stop the Node",id:"stop-the-node",level:2},{value:"Extended Cluster Startup Tutorial",id:"extended-cluster-startup-tutorial",level:2},{value:"Optional: Starting Multiple Ignite Nodes in Docker",id:"optional-starting-multiple-ignite-nodes-in-docker",level:3},{value:"Optional: Start Multiple Ignite Nodes on Different Hosts",id:"optional-start-multiple-ignite-nodes-on-different-hosts",level:3},{value:"List all Nodes in NodeFinder",id:"list-all-nodes-in-nodefinder",level:4},{value:"Change Node Names",id:"change-node-names",level:4},{value:"Start all Nodes",id:"start-all-nodes",level:4},{value:"Initialize Your Cluster",id:"initialize-your-cluster-1",level:4},{value:"Next Steps",id:"next-steps",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"This guide shows you how to start working with Ignite. In this guide, we will download Ignite from the website, install it, start the database and perform some simple SQL queries by using the provided CLI tool."}),"\n",(0,r.jsxs)(n.p,{children:["We will be using the ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/installation/install-zip",children:"zip archive"})," to demonstrate how to use Ignite. When using ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/installation/install-deb-rpm",children:"deb or rpm packages"}),", or when running Ignite in Docker, some steps may be different."]}),"\n",(0,r.jsxs)(n.p,{children:["If you are more comfortable with running the database from Java code, you can try ",(0,r.jsx)(n.a,{href:"/3.1.0/getting-started/embedded-mode",children:"starting Ignite from code"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"This section describes the platform requirements for machines running Ignite. Ignite system requirements scale depending on the size of the cluster."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Requirement"}),(0,r.jsx)(n.th,{children:"Version"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"JDK"}),(0,r.jsx)(n.td,{children:"11 and later"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"OS"}),(0,r.jsx)(n.td,{children:"Linux (Debian and Red Hat flavours), Windows 10 or 11"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ISA"}),(0,r.jsx)(n.td,{children:"x86 or x64"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"install-ignite",children:"Install Ignite"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://ignite.apache.org/download.cgi",children:"Download"})," Ignite from the website. This archive contains everything related to the Ignite database itself."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Also from the same page, download the ",(0,r.jsx)(n.a,{href:"/3.1.0/tools/cli-commands",children:"Ignite command line interface"}),". This tool is the main way of interacting with Ignite database and will be used in the tutorial."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Unpack the downloaded archives:"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"unix",label:"Unix",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"unzip ignite3-3.0.0.zip\n"})})}),(0,r.jsx)(a.A,{value:"windows-ps",label:"Windows (PowerShell)",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"Expand-Archive ignite3-3.0.0.zip -DestinationPath .\n"})})}),(0,r.jsx)(a.A,{value:"windows-cmd",label:"Windows (CMD)",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"unzip -xf ignite3-3.0.0.zip\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Now you should have the ",(0,r.jsx)(n.code,{children:"ignite3-db-3.0.0"})," and ",(0,r.jsx)(n.code,{children:"ignite3-cli-3.0.0"})," directories that we will be using in this tutorial, and the license file provided via e-mail."]}),"\n",(0,r.jsx)(n.h2,{id:"start-ignite-node",children:"Start Ignite Node"}),"\n",(0,r.jsxs)(n.p,{children:["Ignite is a distributed database, that runs on a collection of ",(0,r.jsx)(n.strong,{children:"nodes"})," - Ignite database instances that contain data. When running Ignite, you would typically run multiple nodes - a ",(0,r.jsx)(n.strong,{children:"cluster"}),", that shares information and evenly distributes data across its nodes. In this part of the tutorial, we will only run one node, but a later part shows how you can start multiple."]}),"\n",(0,r.jsx)(n.p,{children:"To start a locally running node:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Navigate to the ",(0,r.jsx)(n.code,{children:"ignite3-db-3.0.0"})," directory."]}),"\n",(0,r.jsxs)(n.li,{children:["Run the ",(0,r.jsx)(n.code,{children:"ignite3db"})," script:"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"linux",label:"Linux",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"bin/ignite3db\n"})})}),(0,r.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"You need to install Java in the Bash environment to run Ignite on Windows."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"bash bin\\ignite3db\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"start-the-ignite-cli",children:"Start the Ignite CLI"}),"\n",(0,r.jsxs)(n.p,{children:["The primary means of interacting with your nodes and cluster is the ",(0,r.jsx)(n.a,{href:"/3.1.0/tools/cli-commands",children:"Ignite CLI"}),". It can connect to a node running on a local or remote machine, and is the main tool that is used to manually configure and manage the database. In this example, we will be connecting to a local node."]}),"\n",(0,r.jsx)(n.p,{children:"To start the Ignite CLI:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Navigate to the ",(0,r.jsx)(n.code,{children:"ignite3-cli-3.0.0"})," directory."]}),"\n",(0,r.jsx)(n.li,{children:"Run the following command:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"linux",label:"Linux",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"bin/ignite3\n"})})}),(0,r.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"You need to install Java in the Bash environment to run Ignite on Windows."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"bash bin\\ignite3\n"})})]})]}),"\n",(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Confirm the connection the CLI tool attempts to establish with the node running on the default URI."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["If your node is running at a different address, use the ",(0,r.jsx)(n.code,{children:"connect"})," command to connect to the node. For example:"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"connect http://127.0.0.1:10300\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Connected to http://127.0.0.1:10300\n"})})})]}),"\n",(0,r.jsx)(n.h2,{id:"initialize-your-cluster",children:"Initialize Your Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["Ignite database functions as a cluster. Even if we are currently only running a single node, theoretically you could start another node and have it join the already running cluster. When the nodes are started, they find each other and wait for the user to start the cluster. The process of starting a cluster is called ",(0,r.jsx)(n.em,{children:"initialization"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To initialize the cluster with the node you have started (see ",(0,r.jsx)(n.a,{href:"#start-ignite-node",children:"Start Ignite Node"}),"), run the following command:"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster init --name=sampleCluster\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Cluster was initialized successfully\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Optionally, you can pass the ",(0,r.jsx)(n.code,{children:"--metastorage-group"})," parameter to specify the nodes that will be used to store cluster meta information. In most scenarios, you want to have 3, 5 or 7 metastorage group nodes. For more information on what they are and cluster lifecycle, see ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/operations/lifecycle",children:"Cluster Lifecycle"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsxs)(n.p,{children:["Cluster and node configurations in Ignite are separated and cannot be used interchangeably. When initializing a cluster, make sure to provide the ",(0,r.jsx)(n.strong,{children:"cluster"})," configuration file."]})}),"\n",(0,r.jsx)(n.h2,{id:"run-sql-statements-against-the-cluster",children:"Run SQL Statements Against the Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["Once your cluster has been initialized, you can start working with it. In this tutorial, we will be using the CLI tool to create a table, insert some rows and retrieve data. In most real scenarios you would have a ",(0,r.jsx)(n.a,{href:"/3.1.0/develop/ignite-clients/",children:"client"})," writing data to a cluster and retrieving it, but the CLI tool can still be used for debugging or minor adjustments."]}),"\n",(0,r.jsx)(n.p,{children:"To work with the SQL in CLI:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Enter the SQL REPL mode. In this mode, you will have access to SQL hints and command completion:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sql\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sql-cli>\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["Use the ",(0,r.jsx)(n.code,{children:"CREATE TABLE"})," statement to create a new table:"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (id int primary key, city varchar, name varchar, age int, company varchar)\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Updated 0 rows.\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsxs)(n.li,{children:["Fill the table with data using the ",(0,r.jsx)(n.code,{children:"INSERT"})," statement:"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"INSERT INTO Person (id, city, name, age, company) VALUES (1, 'London', 'John Doe', 42, 'Apache')\r\nINSERT INTO Person (id, city, name, age, company) VALUES (2, 'New York', 'Jane Doe', 36, 'Apache')\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Updated 1 rows.\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"4",children:["\n",(0,r.jsx)(n.li,{children:"Get all the data you inserted in the previous step:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"SELECT * FROM Person\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\u2554\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 ID \u2502 CITY \u2502 NAME \u2502 AGE \u2502 COMPANY \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 2 \u2502 New York \u2502 Jane Doe \u2502 36 \u2502 Apache \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 1 \u2502 London \u2502 John Doe \u2502 42 \u2502 Apache \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"5",children:["\n",(0,r.jsxs)(n.li,{children:["If needed, exit the REPL mode with the ",(0,r.jsx)(n.code,{children:"exit"})," command."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["For more information about available SQL statements, see the ",(0,r.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/ddl",children:"SQL Reference"})," section."]})}),"\n",(0,r.jsx)(n.h2,{id:"stop-the-node",children:"Stop the Node"}),"\n",(0,r.jsxs)(n.p,{children:["After you are done working with your cluster, you need to stop the node by stopping the ",(0,r.jsx)(n.code,{children:"ignite3db"})," process:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Unix: ",(0,r.jsx)(n.code,{children:"Control + C"})]}),"\n",(0,r.jsxs)(n.li,{children:["Windows: ",(0,r.jsx)(n.code,{children:"Ctrl+C"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can also exit the CLI tool with the ",(0,r.jsx)(n.code,{children:"exit"})," command."]}),"\n",(0,r.jsx)(n.p,{children:"The cluster will remain initialized, and ready once again when you restart the node."}),"\n",(0,r.jsx)(n.h2,{id:"extended-cluster-startup-tutorial",children:"Extended Cluster Startup Tutorial"}),"\n",(0,r.jsx)(n.p,{children:"Ignite 3 is designed to work in a cluster of 3 or more nodes at once. While a single node can be used in some scenarios and can be used for the tutorial, having multiple nodes in a cluster is the most common use case. The steps below provide optional alternatives to starting your cluster, in case you want to run the tutorial on multiple nodes in a cluster that is closer to what would be encountered in real scenarios."}),"\n",(0,r.jsx)(n.h3,{id:"optional-starting-multiple-ignite-nodes-in-docker",children:"Optional: Starting Multiple Ignite Nodes in Docker"}),"\n",(0,r.jsx)(n.p,{children:"To run multiple instances of Ignite, you would normally install it on multiple machines before starting a cluster. If you want to run an Ignite cluster on local VMs for this tutorial, we recommend using a Docker image:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Download the docker-compose (file not available in docs) and node configuration (file not available in docs) that will be used by docker compose to start the cluster. The node configuration should be in the same folder as docker compose file"}),"\n",(0,r.jsx)(n.li,{children:"Download the Docker image:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker pull apacheignite/ignite:3.0.0\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"latest: Pulling from ignite/ignite3\r\n3713021b0277: Pull complete\r\nfea31cb87980: Pull complete\r\n07f7cfe80ff6: Pull complete\r\nab1fd3f4849e: Pull complete\r\n34896af28f87: Pull complete\r\nDigest: sha256:43ab9cfb8f58b66e4a5027d4ed529216963d0bcab3fa3fc6d5e2042fa3dd5a74\r\nStatus: Downloaded newer image for ignite/ignite3:latest\r\ndocker.io/ignite/ignite3:latest\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsx)(n.li,{children:"Run the Docker compose command, providing the previously downloaded compose file:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker compose -f docker-compose.yml up -d\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"[+] Running 4/4\r\n \u2714 Network ignite3_default Created 0.8s\r\n \u2714 Container ignite3-node1-1 Started 3.2s\r\n \u2714 Container ignite3-node2-1 Started 1.7s\r\n \u2714 Container ignite3-node3-1 Started 3.4s\n"})})})]}),"\n",(0,r.jsx)(n.p,{children:"3 nodes start in Docker and become available through the CLI tool that can be run locally."}),"\n",(0,r.jsxs)(n.ol,{start:"4",children:["\n",(0,r.jsx)(n.li,{children:"Make sure you initialize your cluster before attempting to work with it:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster init --name=sampleCluster\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Cluster was initialized successfully\n"})})})]}),"\n",(0,r.jsx)(n.h3,{id:"optional-start-multiple-ignite-nodes-on-different-hosts",children:"Optional: Start Multiple Ignite Nodes on Different Hosts"}),"\n",(0,r.jsx)(n.p,{children:"In the examples above, we were running a single node, or a small cluster that used predefined configuration. Creating a Ignite cluster on several hosts involves adjustments to its configuration."}),"\n",(0,r.jsx)(n.h4,{id:"list-all-nodes-in-nodefinder",children:"List all Nodes in NodeFinder"}),"\n",(0,r.jsxs)(n.p,{children:["When nodes are running, they use the node finder configuration. When the node starts, it loads the configuration file from ",(0,r.jsx)(n.code,{children:"/etc/ignite-config.conf"}),". Add the addresses to the ",(0,r.jsx)(n.code,{children:"network.nodeFinder"})," configuration, for example for the 3-node cluster:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "nodeFinder" : {\r\n "netClusterNodes" : [\r\n "localhost:3344",\r\n "otherhost:3344",\r\n "thirdhost:3344"\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Now, when the node starts, it automatically tries to find nodes at the listed addresses. You can see the current configuration of a running node at any point by running the following command from the CLI tool:"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node config show ignite.network.nodeFinder\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'{\r\n "netClusterNodes" : [ "localhost:3344", "otherhost:3344", "thirdhost:3344" ],\r\n "type" : "STATIC"\r\n}\n'})})})]}),"\n",(0,r.jsx)(n.p,{children:"If the node is already running, you can also use the CLI tool to change node configuration, for example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'node config update ignite.network.nodeFinder.netClusterNodes=["localhost:3344", "otherHost:3344"]\n'})}),"\n",(0,r.jsx)(n.p,{children:"This change requires the node restart to take effect."}),"\n",(0,r.jsx)(n.h4,{id:"change-node-names",children:"Change Node Names"}),"\n",(0,r.jsxs)(n.p,{children:["You need to make sure that all nodes in the cluster have different names. Node name is defined in the ",(0,r.jsx)(n.code,{children:"/etc/vars.env"})," file. Change the ",(0,r.jsx)(n.code,{children:"NODE_NAME"})," variable to have unique name for each node in cluster, otherwise it will be impossible for the nodes with conflicting names to enter the same cluster."]}),"\n",(0,r.jsx)(n.h4,{id:"start-all-nodes",children:"Start all Nodes"}),"\n",(0,r.jsxs)(n.p,{children:["Start each node as described in ",(0,r.jsx)(n.a,{href:"#start-ignite-node",children:"Start Ignite Node"}),"."]}),"\n",(0,r.jsx)(n.h4,{id:"initialize-your-cluster-1",children:"Initialize Your Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["Before initializing the cluster, it is important to check that all nodes found each other and can connect into a cluster. Nodes visible to each other, but not necessarily connected into a cluster form ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/operations/lifecycle",children:"physical topology"}),". You can check it by connecting to any node using the CLI tool and executing the following command:"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster topology physical\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 name \u2502 host \u2502 port \u2502 consistent id \u2502 id \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 node1 \u2502 172.19.0.4 \u2502 3344 \u2502 node1 \u2502 0c61dad3-bc4c-4c60-8772-1a903632dcb4 \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 node2 \u2502 172.19.0.2 \u2502 3344 \u2502 node2 \u2502 21f516bd-0774-4c53-bbfb-ad21bc21c500 \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 node3 \u2502 172.19.0.3 \u2502 3344 \u2502 node3 \u2502 b2bbfbff-eb08-4252-b154-681c49164708 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})})})]}),"\n",(0,r.jsx)(n.p,{children:"The command lists the nodes visible to the node you are connecting to, their addresses, names, and IDs. Once you are certain all nodes are running and visible, initialize your cluster:"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster init --name=sampleCluster\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Cluster was initialized successfully\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Once the cluster starts, the nodes in it will form the ",(0,r.jsx)(n.em,{children:"logical topology"}),". You can check if all nodes have entered the cluster by using the following command:"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster topology logical\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 name \u2502 host \u2502 port \u2502 consistent id \u2502 id \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 node1 \u2502 172.19.0.4 \u2502 3344 \u2502 node1 \u2502 0c61dad3-bc4c-4c60-8772-1a903632dcb4 \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 node2 \u2502 172.19.0.2 \u2502 3344 \u2502 node2 \u2502 21f516bd-0774-4c53-bbfb-ad21bc21c500 \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 node3 \u2502 172.19.0.3 \u2502 3344 \u2502 node3 \u2502 b2bbfbff-eb08-4252-b154-681c49164708 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})})})]}),"\n",(0,r.jsx)(n.p,{children:"If all nodes are in the command output, the cluster is now started and can be worked with."}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsx)(n.p,{children:"From here, you may want to:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Check out the ",(0,r.jsx)(n.a,{href:"/3.1.0/tools/cli-commands",children:"Ignite CLI Tool"})," page for more detail on supported commands"]}),"\n",(0,r.jsxs)(n.li,{children:["Try out our ",(0,r.jsx)(n.a,{href:"https://github.com/apache/ignite-3/tree/main/examples",children:"examples"})]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(96540);const r={},l=i.createContext(r);function s(e){const n=i.useContext(l);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/59074688.f156df34.js b/docs/ignite3/assets/js/59074688.f156df34.js deleted file mode 100644 index 9dfd32deb2..0000000000 --- a/docs/ignite3/assets/js/59074688.f156df34.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3092],{11358:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"developers-guide/rest/rest-api","title":"REST API","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/rest/rest-api.md","sourceDirName":"developers-guide/rest","slug":"/developers-guide/rest/rest-api","permalink":"/docs/ignite3/3.0.0/developers-guide/rest/rest-api","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"REST API","sidebar_label":"REST API"},"sidebar":"tutorialSidebar","previous":{"title":"Available Events","permalink":"/docs/ignite3/3.0.0/developers-guide/events/events-list"},"next":{"title":"Configuration","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/"}}');var i=n(74848),r=n(28453);const s={title:"REST API",sidebar_label:"REST API"},a=void 0,c={},l=[{value:"REST Connector Configuration",id:"rest-connector-configuration",level:2},{value:"Using HTTP Tools",id:"using-http-tools",level:2},{value:"Java Project Configuration",id:"java-project-configuration",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsxs)(t.p,{children:["The Apache Ignite clusters provide an ",(0,i.jsx)(t.a,{href:"https://www.openapis.org/",children:"OpenAPI"})," specification that can be used to work with Apache Ignite by standard REST methods."]}),"\n",(0,i.jsx)(t.h2,{id:"rest-connector-configuration",children:"REST Connector Configuration"}),"\n",(0,i.jsxs)(t.p,{children:["By default, rest connector starts on port 10300. THis port can be configured in the ",(0,i.jsx)(t.code,{children:"ignite.rest"})," ",(0,i.jsx)(t.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config#rest-configuration",children:"node configuration"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"using-http-tools",children:"Using HTTP Tools"}),"\n",(0,i.jsxs)(t.p,{children:["Once the cluster is started, you can use external tools to monitor the cluster over http, or manage the cluster. In this example, we will use ",(0,i.jsx)(t.a,{href:"https://curl.se/",children:"curl"})," to get cluster status:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"curl 'http://localhost:10300/management/v1/cluster/state'\n"})}),"\n",(0,i.jsxs)(t.p,{children:["You are not limited to only monitoring, as Apache Ignite REST API provides endpoints that can be used to manage the cluster as well. For example, you can create a ",(0,i.jsx)(t.a,{href:"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery",children:"snapshot"})," via REST:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:'curl -H "Content-Type: application/json" -d \'{"snapshotType": "FULL","tableNames": "table1,table2","startTimeEpochMilli": 0}\' http://localhost:10300/management/v1/snapshot/create\n'})}),"\n",(0,i.jsx)(t.h2,{id:"java-project-configuration",children:"Java Project Configuration"}),"\n",(0,i.jsxs)(t.p,{children:["If you want to integrate Apache Ignite REST API closer into your application, we recommend using an ",(0,i.jsx)(t.a,{href:"https://github.com/OpenAPITools/openapi-generator",children:"OpenAPI generator"})," to generate a Java client. Once the client is generated, you can use it to work with REST API from code, for example:"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-java",children:'ApiClient client = Configuration.getDefaultApiClient();\r\n// Set base URL\r\nclient.setBasePath("http://localhost:10300");\r\n\r\n// Get cluster configuration.\r\nClusterConfigurationApi clusterConfigurationApi = new ClusterConfigurationApi(client);\r\nString configuration = clusterConfigurationApi.getClusterConfiguration();\n'})})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var o=n(96540);const i={},r=o.createContext(i);function s(e){const t=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/5ba93427.8990d848.js b/docs/ignite3/assets/js/5ba93427.8990d848.js deleted file mode 100644 index ba2d25165a..0000000000 --- a/docs/ignite3/assets/js/5ba93427.8990d848.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6324],{20949:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>c,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"administrators-guide/config/node-config","title":"Node Configuration Parameters","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/config/node-config.md","sourceDirName":"administrators-guide/config","slug":"/administrators-guide/config/node-config","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/node-config","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Node Configuration Parameters","sidebar_label":"Node Configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Configuration","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/"},"next":{"title":"Cluster Configuration","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config"}}');var r=t(74848),d=t(28453);const i={title:"Node Configuration Parameters",sidebar_label:"Node Configuration"},l="Node Configuration Parameters",c={},h=[{value:"Checking Node Configuration",id:"checking-node-configuration",level:2},{value:"Changing Node Configuration",id:"changing-node-configuration",level:2},{value:"Exporting Node Configuration",id:"exporting-node-configuration",level:2},{value:"Configuration Parameters",id:"configuration-parameters",level:2},{value:"Client Connector Configuration",id:"client-connector-configuration",level:3},{value:"Compute Configuration",id:"compute-configuration",level:3},{value:"Code Deployment Configuration",id:"code-deployment-configuration",level:3},{value:"Failure Handler Configuration",id:"failure-handler-configuration",level:3},{value:"Network Configuration",id:"network-configuration",level:3},{value:"Node Attributes",id:"node-attributes",level:3},{value:"RAFT Configuration",id:"raft-configuration",level:3},{value:"REST Configuration",id:"rest-configuration",level:3},{value:"SQL Configuration",id:"sql-configuration",level:3},{value:"Storage Configuration",id:"storage-configuration",level:3},{value:"System Configuration",id:"system-configuration",level:2}];function o(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"node-configuration-parameters",children:"Node Configuration Parameters"})}),"\n",(0,r.jsx)(s.p,{children:"Node configuration is individual for each node and is not shared across the whole cluster."}),"\n",(0,r.jsxs)(s.p,{children:['In Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,r.jsx)(s.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node."]}),"\n",(0,r.jsx)(s.h2,{id:"checking-node-configuration",children:"Checking Node Configuration"}),"\n",(0,r.jsx)(s.p,{children:"To get node configuration, use the CLI tool."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Start the CLI tool and connect to the node."}),"\n",(0,r.jsxs)(s.li,{children:["Run the ",(0,r.jsx)(s.code,{children:"node config show"})," command."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"The CLI tool will print the full node configuration. If you only need a part of the configuration, you can narrow down the search by providing the properties you need as the command argument, for example:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"node config show ignite.clientConnector\n"})}),"\n",(0,r.jsx)(s.h2,{id:"changing-node-configuration",children:"Changing Node Configuration"}),"\n",(0,r.jsx)(s.p,{children:"Node configuration is changed from the CLI tool. To change the configuration:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:'Start the CLI tool and connect to the node. This becomes the "default" node for subsequent CL commands.'}),"\n",(0,r.jsxs)(s.li,{children:["To update the default node's configuration, run the ",(0,r.jsx)(s.code,{children:"node config update"})," command and provide the update as the command argument, for example:"]}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"node config update ignite.clientConnector.connectTimeoutMillis=10000\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["To update the configuration of a node other than the default one, run the ",(0,r.jsx)(s.code,{children:"node config update"})," command with the target node explicitly specified. For example, for node named ",(0,r.jsx)(s.code,{children:"node1"}),":"]}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:'node config update -n node1 ignite.nodeAttributes.nodeAttributes.clientConnector="10900"\n'})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Restart the node to apply the configuration changes."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"exporting-node-configuration",children:"Exporting Node Configuration"}),"\n",(0,r.jsx)(s.p,{children:"If you need to export node configuration to a HOCON-formatted file, use the following command:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"bin/ignite3 node config show > node-config.conf\n"})}),"\n",(0,r.jsx)(s.h2,{id:"configuration-parameters",children:"Configuration Parameters"}),"\n",(0,r.jsx)(s.h3,{id:"client-connector-configuration",children:"Client Connector Configuration"}),"\n",(0,r.jsxs)(s.p,{children:["See the ",(0,r.jsx)(s.a,{href:"/docs/ignite3/3.0.0/developers-guide/clients/",children:"Clients"})," section for information on configuring client connector."]}),"\n",(0,r.jsx)(s.h3,{id:"compute-configuration",children:"Compute Configuration"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "compute" : {\r\n "queueMaxSize" : 2147483647,\r\n "statesLifetimeMillis" : 60000,\r\n "threadPoolSize" : 10\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"queueMaxSize"}),(0,r.jsx)(s.td,{children:"2147483647"}),(0,r.jsx)(s.td,{children:"Maximum number of compute tasks in queue."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"statesLifetimeMillis"}),(0,r.jsx)(s.td,{children:"60000"}),(0,r.jsx)(s.td,{children:"The lifetime of job states after the job finishes, in milliseconds."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"threadPoolSize"}),(0,r.jsx)(s.td,{children:"10"}),(0,r.jsx)(s.td,{children:"The number of threads available to compute jobs."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - Integer.MAX_VALUE"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"code-deployment-configuration",children:"Code Deployment Configuration"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "deployment" : {\r\n "location" : "deployment"\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"location"}),(0,r.jsx)(s.td,{children:"deployment"}),(0,r.jsx)(s.td,{children:"Relative path to folder in the working directory. All deployment units content will be stored there."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"A valid path"})]})})]}),"\n",(0,r.jsx)(s.h3,{id:"failure-handler-configuration",children:"Failure Handler Configuration"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "failureHandler" : {\r\n "dumpThreadsOnFailure" : true,\r\n "dumpThreadsThrottlingTimeoutMillis" : 10000,\r\n "handler" : {\r\n "ignoredFailureTypes" : [\r\n "systemWorkerBlocked", "systemCriticalOperationTimeout"\r\n ],\r\n "type" : "noop"\r\n },\r\n "oomBufferSizeBytes" : 16384\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"dumpThreadsOnFailure"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"The number of items that can be expired at once."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"dumpThreadsThrottlingTimeoutMillis"}),(0,r.jsx)(s.td,{children:"10000"}),(0,r.jsx)(s.td,{children:"Throttling timeout for thread dump generation during failure handling, in milliseconds."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"handler.ignoredFailureTypes"}),(0,r.jsx)(s.td,{children:"[systemWorkerBlocked, systemCriticalOperationTimeout]"}),(0,r.jsx)(s.td,{children:"Types of failures that will be ignored."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"handler.type"}),(0,r.jsx)(s.td,{children:"noop"}),(0,r.jsx)(s.td,{children:"Failure handler configuration type."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"noop, stop, stopOrHalt"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"oomBufferSizeBytes"}),(0,r.jsx)(s.td,{children:"16384"}),(0,r.jsx)(s.td,{children:"Amount of memory reserved in the heap at node start, in bytes."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"network-configuration",children:"Network Configuration"}),"\n",(0,r.jsxs)(s.p,{children:["In Apache Ignite 3, you can choose between two node discovery types. With ",(0,r.jsx)(s.code,{children:"STATIC"})," type, you manually specify the node addresses, while ",(0,r.jsx)(s.code,{children:"MULTICAST"})," type automatically detects nodes on your network, making setup simpler."]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Example configuration with a ",(0,r.jsx)(s.code,{children:"STATIC"})," node finder:"]}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "network" : {\r\n "fileTransfer" : {\r\n "chunkSizeBytes" : 1048576,\r\n "maxConcurrentRequests" : 4,\r\n "responseTimeoutMillis" : 10000,\r\n "threadPoolSize" : 8\r\n },\r\n "inbound" : {\r\n "soBacklog" : 128,\r\n "soKeepAlive" : true,\r\n "soLinger" : 0,\r\n "soReuseAddr" : true,\r\n "tcpNoDelay" : true\r\n },\r\n "listenAddresses" : [],\r\n "membership" : {\r\n "failurePingIntervalMillis" : 1000,\r\n "membershipSyncIntervalMillis" : 30000,\r\n "scaleCube" : {\r\n "failurePingRequestMembers" : 3,\r\n "gossipIntervalMillis" : 200,\r\n "gossipRepeatMult" : 3,\r\n "membershipSuspicionMultiplier" : 5,\r\n "metadataTimeoutMillis" : 3000\r\n }\r\n },\r\n "nodeFinder" : {\r\n "netClusterNodes" : [ "localhost:3344" ],\r\n "type" : "STATIC"\r\n },\r\n "outbound" : {\r\n "soKeepAlive" : true,\r\n "soLinger" : 0,\r\n "tcpNoDelay" : true\r\n },\r\n "port" : 3344,\r\n "shutdownQuietPeriodMillis" : 0,\r\n "shutdownTimeoutMillis" : 15000,\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "none",\r\n "enabled" : false,\r\n "keyStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n },\r\n "trustStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["To switch to a ",(0,r.jsx)(s.code,{children:"MULTICAST"})," node finder, update the ",(0,r.jsx)(s.code,{children:"nodeFinder"})," section in your configuration file to the following:"]}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "nodeFinder": {\r\n "type": "MULTICAST",\r\n "multicast" : {\r\n "group": "239.192.0.0",\r\n "port": 47401,\r\n "resultWaitTime": 500,\r\n "ttl": -1\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"fileTransfer"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"File transfer configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"fileTransfer.chunkSizeBytes"}),(0,r.jsx)(s.td,{children:"1048576"}),(0,r.jsx)(s.td,{children:"Chunk size in bytes."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"fileTransfer.maxConcurrentRequests"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Maximum number of concurrent requests."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"fileTransfer.responseTimeoutMillis"}),(0,r.jsx)(s.td,{children:"10000"}),(0,r.jsx)(s.td,{children:"Node response timeout during file transfer."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"fileTransfer.threadPoolSize"}),(0,r.jsx)(s.td,{children:"8"}),(0,r.jsx)(s.td,{children:"File sender thread pool size."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"inbound"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["Server socket configuration. See ",(0,r.jsx)(s.a,{href:"https://man7.org/linux/man-pages/man7/tcp.7.html",children:"TCP documentation"})," and ",(0,r.jsx)(s.a,{href:"https://man7.org/linux/man-pages/man7/socket.7.html",children:"socket documentation"})," for more information."]}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"inbound.soBacklog"}),(0,r.jsx)(s.td,{children:"128"}),(0,r.jsx)(s.td,{children:"The size of the backlog."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"inbound.soKeepAlive"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"Defines if the keep-alive packets are allowed."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"inbound.soLinger"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Defines how long the closed socket should linger."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - 65535"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"inbound.soReuseAddr"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"Defines if the address can be reused."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"inbound.tcpNoDelay"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"Defines if the TCP no delay option is used."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"listenAddresses"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"List of addresses (IPs or hostnames) to listen on. If empty, listens on all interfaces. Currently, only a single address is supported. This limitation will be lifted in a future update."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A list of valid addresses separated by comma"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"membership"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Node membership configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"membership.failurePingIntervalMillis"}),(0,r.jsx)(s.td,{children:"1000"}),(0,r.jsx)(s.td,{children:"Failure detector ping interval."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"membership.membershipSyncIntervalMillis"}),(0,r.jsx)(s.td,{children:"30000"}),(0,r.jsx)(s.td,{children:"Periodic membership data synchronization interval."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"membership.scaleCube"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"ScaleCube-specific configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"scaleCube.failurePingRequestMembers"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Number of members that are randomly selected by a cluster node for an indirect ping request."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"scaleCube.gossipIntervalMillis"}),(0,r.jsx)(s.td,{children:"200"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Gossip_protocol",children:"Gossip"})," spreading interval."]}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"scaleCube.gossipRepeatMult"}),(0,r.jsx)(s.td,{children:"3"}),(0,r.jsx)(s.td,{children:"Gossip repeat multiplier."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"scaleCube.membershipSuspicionMultiplier"}),(0,r.jsx)(s.td,{children:"5"}),(0,r.jsx)(s.td,{children:"The multiplier that is used to calculate the timeout after which the node is considered dead."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"scaleCube.metadataTimeoutMillis"}),(0,r.jsx)(s.td,{children:"3000"}),(0,r.jsx)(s.td,{children:"The timeout on metadata update operation, in milliseconds."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"nodeFinder"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Configuration for how the node finds other nodes in the cluster."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"nodeFinder.netClusterNodes"}),(0,r.jsx)(s.td,{}),(0,r.jsxs)(s.td,{children:["Addresses of all nodes in the cluster in the host",":port"," format. Applicable when ",(0,r.jsx)(s.code,{children:"STATIC"})," node finder type is used."]}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Addresses in a valid format"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"nodeFinder.type"}),(0,r.jsx)(s.td,{children:"STATIC"}),(0,r.jsxs)(s.td,{children:["Node finder type. Use ",(0,r.jsx)(s.code,{children:"STATIC"})," to manually configure node addresses."]}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"STATIC"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"nodeFinder.type"}),(0,r.jsx)(s.td,{children:"MULTICAST"}),(0,r.jsxs)(s.td,{children:["Node finder type. Use ",(0,r.jsx)(s.code,{children:"MULTICAST"})," to automatically detect nodes on your network. When using this type, you must also specify a multicast group address."]}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"MULTICAST"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"nodeFinder.multicast.group"}),(0,r.jsx)(s.td,{children:"239.192.0.0"}),(0,r.jsx)(s.td,{children:"The multicast group address for node discovery."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Multicast address in a valid format"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"nodeFinder.multicast.port"}),(0,r.jsx)(s.td,{children:"47401"}),(0,r.jsx)(s.td,{children:"The port used for multicast."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - 65535"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"nodeFinder.multicast.resultWaitTime"}),(0,r.jsx)(s.td,{children:"500"}),(0,r.jsx)(s.td,{children:"The time in milliseconds a node waits for responses after a discovery request."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"nodeFinder.multicast.ttl"}),(0,r.jsx)(s.td,{children:"-1"}),(0,r.jsx)(s.td,{children:"Sets the maximum number of network hops for multicast packets. By default is set to -1 and uses the default system TTL."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"-1 - 255"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"outbound"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Outbound request configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"outbound.soKeepAlive"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"Defines if the keep-alive packets are allowed."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"outbound.soLinger"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Defines how long the closed socket should linger."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - 65535"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"outbound.tcpNoDelay"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"Defines if the TCP no delay option is used."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"port"}),(0,r.jsx)(s.td,{children:"3344"}),(0,r.jsx)(s.td,{children:"Node port."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid port number"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"shutdownQuietPeriodMillis"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"The period during node shutdown when Ignite ensures that no tasks are submitted for the before the node shuts itself down. If a task is submitted during this period, it is guaranteed to be accepted."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"shutdownTimeoutMillis"}),(0,r.jsx)(s.td,{children:"15000"}),(0,r.jsxs)(s.td,{children:["The maximum amount of time until the node is shut down regardless of if new network messages were submitted during ",(0,r.jsx)(s.code,{children:"shutdownQuietPeriodMillis"}),"."]}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.ciphers"}),(0,r.jsx)(s.td,{children:'""'}),(0,r.jsx)(s.td,{children:"List of ciphers to enable, comma-separated. Empty for automatic cipher selection."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"TLS_AES_256_GCM_SHA384, etc. (standard cipher ids)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.clientAuth"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Whether the SSL client authentication is enabled and whether it is mandatory."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"none, optional, require"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.enabled"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"Defines if SSL is enabled for the node."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.keyStore"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"SSL keystore configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"keyStore.password"}),(0,r.jsx)(s.td,{children:"********"}),(0,r.jsx)(s.td,{children:"Keystore password."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid password"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"keyStore.path"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Path to the keystore."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid path"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"keyStore.type"}),(0,r.jsx)(s.td,{children:"PKCS12"}),(0,r.jsx)(s.td,{children:"Keystore type."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"PKCS12, JKS"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.trustStore"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"SSL trustsore configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"trustStore.password"}),(0,r.jsx)(s.td,{children:"********"}),(0,r.jsx)(s.td,{children:"Truststore password."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid password"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"trustStore.path"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Path to the truststore."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid path"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"trustStore.type"}),(0,r.jsx)(s.td,{children:"PKCS12"}),(0,r.jsx)(s.td,{children:"Truststore type."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"PKCS12, JKS"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"node-attributes",children:"Node Attributes"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "nodeAttributes" : {\r\n "nodeAttributes" : { }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsx)(s.tbody,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"nodeAttributes"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"A collection of node attributes used for dynamically distributing data only to those nodes that have the specified attribute values."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A JSON-formatted object"})]})})]}),"\n",(0,r.jsx)(s.h3,{id:"raft-configuration",children:"RAFT Configuration"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "raft" : {\r\n "fsync" : false,\r\n "installSnapshotTimeoutMillis" : 300000,\r\n "logStripesCount" : 4,\r\n "logYieldStrategy" : false,\r\n "responseTimeoutMillis" : 3000,\r\n "retryDelayMillis" : 200,\r\n "retryTimeoutMillis" : 10000,\r\n "stripes" : 10,\r\n "volatileRaft" : {\r\n "logStorageBudget" : {\r\n "name" : "unlimited"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"fsync"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsxs)(s.td,{children:["Specifies whether ",(0,r.jsx)(s.code,{children:"fsync"})," is used to safely write Raft log entries to disk on table partition groups before confirming replication. If set to ",(0,r.jsx)(s.code,{children:"false"}),", user data may be lost in the event of an OS crash, but an Ignite application crash will not result in data loss."]}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"installSnapshotTimeoutMillis"}),(0,r.jsx)(s.td,{children:"300000"}),(0,r.jsx)(s.td,{children:"The maximum period allowed for transferring a RAFT snapshot to a recipient and installing it."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"logStripesCount"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Amount of stripes in disruptors of log manager"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"logYieldStrategy"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"If true, the non-blocking strategy is used in the Disruptor of log manager."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"responseTimeoutMillis"}),(0,r.jsx)(s.td,{children:"3000"}),(0,r.jsx)(s.td,{children:"Period for which the RAFT client will try to receive a response from a remote peer."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"retryDelayMillis"}),(0,r.jsx)(s.td,{children:"200"}),(0,r.jsx)(s.td,{children:"Delay between re-sends of a failed request by the RAFT client."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"retryTimeoutMillis"}),(0,r.jsx)(s.td,{children:"10000"}),(0,r.jsx)(s.td,{children:"Period for which the RAFT client will try to receive a successful response from a remote peer."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"volatileRaft.logStorageBudget.name"}),(0,r.jsx)(s.td,{children:"unlimited"}),(0,r.jsx)(s.td,{children:"The name of the log storage budget used by the node."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No, but the new values are only applied to new partitions"}),(0,r.jsx)(s.td,{children:"unlimited, entry-count"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"rest-configuration",children:"REST Configuration"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "rest" : {\r\n "dualProtocol" : false,\r\n "httpToHttpsRedirection" : false,\r\n "port" : 10300,\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "none",\r\n "enabled" : false,\r\n "keyStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n },\r\n "port" : 10400,\r\n "trustStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"dualProtocol"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"Defines if both HTTP and HTTPS protocols are used by the endpoint."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"httpToHttpsRedirection"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"Defines if requests to HTTP endpoint will be redirected to HTTPS."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"port"}),(0,r.jsx)(s.td,{children:"10300"}),(0,r.jsx)(s.td,{children:"The port of the node's REST endpoint."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid port"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.ciphers"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Explicitly set node SSL cipher."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsxs)(s.td,{children:["See ",(0,r.jsx)(s.a,{href:"https://www.java.com/en/configure_crypto.html",children:"acceptable values"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.clientAuth"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Client authorization used by the node, if any."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"none, optional, require"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.enabled"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"Defines if SSL is enabled for the node."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.keyStore"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"SSL keystore configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"keyStore.password"}),(0,r.jsx)(s.td,{children:"********"}),(0,r.jsx)(s.td,{children:"Keystore password."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid password"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"keyStore.path"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Path to the keystore."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid path"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"keyStore.type"}),(0,r.jsx)(s.td,{children:"PKCS12"}),(0,r.jsx)(s.td,{children:"Keystore type."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"PKCS12, JKS"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.port"}),(0,r.jsx)(s.td,{children:"10400"}),(0,r.jsx)(s.td,{children:"Port used for SSL connections."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid port"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl.trustStore"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"SSL trustsore configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"trustStore.password"}),(0,r.jsx)(s.td,{children:"********"}),(0,r.jsx)(s.td,{children:"Truststore password."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid password"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"trustStore.path"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Path to the truststore."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A valid path"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"trustStore.type"}),(0,r.jsx)(s.td,{children:"PKCS12"}),(0,r.jsx)(s.td,{children:"Truststore type."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"PKCS12, JKS"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"sql-configuration",children:"SQL Configuration"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "sql" : {\r\n "execution" : {\r\n "threadCount" : 4\r\n },\r\n "planner" : {\r\n "threadCount" : 4\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"execution.threadCount"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Number of threads for query execution."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"planner.threadCount"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Number of threads for query planning."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - Integer.MAX_VALUE"})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"storage-configuration",children:"Storage Configuration"}),"\n",(0,r.jsx)(s.p,{children:"Ignite Persistence is designed to provide a quick and responsive persistent storage. When using the persistent storage, Ignite stores all the data on disk, and loads as much data as it can into RAM for processing. When persistence is enabled, Ignite stores each partition in a separate file on disk. In addition to data partitions, Ignite stores indexes and metadata."}),"\n",(0,r.jsxs)(s.p,{children:["Each Ignite storage engine can have several storage ",(0,r.jsx)(s.em,{children:"profiles"}),"."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.em,{children:"Checkpointing"})," is the process of copying dirty pages from RAM to partition files on disk. A dirty page is a page that was updated in RAM but was not written to the respective partition file. After a checkpoint is created, all changes are persisted to disk and will be available if the node crashes and is restarted. Checkpointing is designed to ensure durability of data and recovery in case of a node failure. This process helps you utilize disk space frugally by keeping pages in the most up-to-date state on disk."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "storage" : {\r\n "engines" : {\r\n "aimem" : {\r\n "pageSizeBytes" : 16384\r\n },\r\n "aipersist" : {\r\n "checkpoint" : {\r\n "checkpointDelayMillis" : 200,\r\n "checkpointThreads" : 4,\r\n "compactionThreads" : 4,\r\n "intervalMillis" : 180000,\r\n "intervalDeviationPercent" : 40,\r\n "logReadLockThresholdTimeout" : 0,\r\n "readLockTimeoutMillis" : 10000,\r\n "useAsyncFileIoFactory" : true\r\n },\r\n "pageSizeBytes" : 16384\r\n },\r\n "rocksdb" : {\r\n "flushDelayMillis" : 100\r\n },\r\n "profiles" : [ {\r\n "engine" : "aipersist",\r\n "name" : "default",\r\n "replacementMode" : "CLOCK",\r\n "sizeBytes" : 268435456\r\n },\r\n {\r\n "engine" : "aimem",\r\n "name" : "default_aimem",\r\n "emptyPagesPoolSize" : 100,\r\n "initSizeBytes" : 268435456,\r\n "maxSizeBytes" : 268435456\r\n },\r\n {\r\n "engine" : "rocksdb",\r\n "name" : "default_rocksdb",\r\n "sizeBytes" : 268435456,\r\n "writeBufferSizeBytes" : 67108864\r\n } ]\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"engines.aimem"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Aimem configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aimem.pageSizeBytes"}),(0,r.jsx)(s.td,{children:"16384"}),(0,r.jsx)(s.td,{children:"The size of pages in the storage, in bytes."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1024-16384"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"engines.aipersist"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Aipersist configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.checkpoint.checkpointDelayMillis"}),(0,r.jsx)(s.td,{children:"200"}),(0,r.jsx)(s.td,{children:"Delay before staring a checkpoint after receiving the command."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.checkpoint.checkpointThreads"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Number of CPU threads dedicated to checkpointing."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.checkpoint.compactionThreads"}),(0,r.jsx)(s.td,{children:"4"}),(0,r.jsx)(s.td,{children:"Number of CPU threads dedicated to data compaction."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.checkpoint.intervalMillis"}),(0,r.jsx)(s.td,{children:"180000"}),(0,r.jsx)(s.td,{children:"Interval between checkpoints in milliseconds."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.checkpoint.intervalDeviationPercent"}),(0,r.jsx)(s.td,{children:"40"}),(0,r.jsx)(s.td,{children:"Jitter that will be added or subtracted from time period till next scheduled checkpoint (percentage)."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"0-100"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.checkpoint.logReadLockThresholdTimeoutMillis"}),(0,r.jsx)(s.td,{children:"0"}),(0,r.jsx)(s.td,{children:"Threshold for logging long read locks, in milliseconds."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.checkpoint.readLockTimeoutMillis"}),(0,r.jsx)(s.td,{children:"10000"}),(0,r.jsx)(s.td,{children:"Timeout for checkpoint read lock acquisition, in milliseconds."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.checkpoint.useAsyncFileIoFactory"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"If Ignite uses asynchronous file I/O operations provider."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"true, false"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.pageSizeBytes"}),(0,r.jsx)(s.td,{children:"16384"}),(0,r.jsx)(s.td,{children:"The size of pages in the storage, in bytes."}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"N/A"}),(0,r.jsx)(s.td,{children:"1024-16384"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"engines.rocksdb"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Rocksdb configuration."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"rocksdb.flushDelayMillis"}),(0,r.jsx)(s.td,{children:"100"}),(0,r.jsx)(s.td,{children:"Delay before executing a flush triggered by RAFT."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Refreshed on engine registration"}),(0,r.jsx)(s.td,{children:"0 - inf"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"profiles"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"The list of available storage profiles."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"engine"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"The storage engine."}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"N/A"}),(0,r.jsx)(s.td,{children:"aimem, aipersist, rocksdb"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"name"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"User-defined profile name."}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"N/A"}),(0,r.jsx)(s.td,{children:"A valid name"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"replacementMode"}),(0,r.jsx)(s.td,{children:"CLOCK"}),(0,r.jsx)(s.td,{children:"Sets the page replacement algorithm."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"CLOCK, RANDOM_LRU, SEGMENTED_LRU"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"size"}),(0,r.jsx)(s.td,{children:"256Mb"}),(0,r.jsx)(s.td,{children:"Memory (RAM) region size."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Min 256Mb, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.sizeBytes"}),(0,r.jsx)(s.td,{children:"268435456"}),(0,r.jsx)(s.td,{children:"Memory (offheap) region size."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Min 268435456, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aipersist.replacementMode"}),(0,r.jsx)(s.td,{children:"CLOCK"}),(0,r.jsx)(s.td,{children:"Sets the page replacement algorithm."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"CLOCK, RANDOM_LRU, SEGMENTED_LRU"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aimem.initSizeBytes"}),(0,r.jsx)(s.td,{children:"268435456"}),(0,r.jsx)(s.td,{children:"Initial memory region size in bytes, when the used memory size exceeds this value, new chunks of memory will be allocated."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Min 256Mb, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"aimem.maxSizeBytes"}),(0,r.jsx)(s.td,{children:"268435456"}),(0,r.jsx)(s.td,{children:"Maximum memory region size in bytes."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Min 256Mb, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"rocksdb.sizeBytes"}),(0,r.jsx)(s.td,{children:"268435456"}),(0,r.jsx)(s.td,{children:"Size of the rocksdb offheap cache."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Min 0, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"rocksdb.writeBufferSizeBytes"}),(0,r.jsx)(s.td,{children:"67108864"}),(0,r.jsx)(s.td,{children:"Size of rocksdb write buffer."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Min 1, max defined by the addressable memory limit of the OS"})]})]})]}),"\n",(0,r.jsx)(s.h2,{id:"system-configuration",children:"System Configuration"}),"\n",(0,r.jsxs)(s.p,{children:["This section describes internal properties, which are used by a number of Ignite components. Although you can edit these properties in the same way you edit all others by using the ",(0,r.jsx)(s.code,{children:"node config update"})," CLI command, we suggest that you discuss the proposed changes with the Ignite support team. The properties can apply to a specific node or to the ",(0,r.jsx)(s.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config#system-configuration",children:"cluster as a whole"}),"."]}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["Note that the property names are in ",(0,r.jsx)(s.code,{children:"camelCase"}),"."]})}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "system" : {\r\n "cmgPath" : "",\r\n "metastoragePath" : "",\r\n "partitionsBasePath" : "",\r\n "partitionsLogPath" : "",\r\n "properties":[],\r\n "criticalWorkers" : {\r\n "livenessCheckIntervalMillis" : 2000,\r\n "maxAllowedLagMillis" : 5000,\r\n "nettyThreadsHeartbeatIntervalMillis" : 1000\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Property"}),(0,r.jsx)(s.th,{children:"Default"}),(0,r.jsx)(s.th,{children:"Description"}),(0,r.jsx)(s.th,{children:"Changeable"}),(0,r.jsx)(s.th,{children:"Requires Restart"}),(0,r.jsx)(s.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"system.cmgPath"}),(0,r.jsxs)(s.td,{children:["The path the cluster management group information is stored to. Only applicable if the node is part of CMG. By default, data is stored in ",(0,r.jsx)(s.code,{children:"{IGNITE_HOME}/work/cmg"}),". It is recommended to only change this path on an empty node."]}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"system.metastoragePath"}),(0,r.jsxs)(s.td,{children:["The path the cluster meta information is stored to. Only applicable if the node is part of the metastorage group. By default, data is stored in ",(0,r.jsx)(s.code,{children:"{IGNITE_HOME}/work/metastorage"}),". It is recommended to only change this path on an empty node."]}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"system.partitionsBasePath"}),(0,r.jsxs)(s.td,{children:["The path data partitions are saved to on the node. By default, partitions are stored in ",(0,r.jsx)(s.code,{children:"{IGNITE_HOME}/work/partitions"}),". It is recommended to only change this path on an empty node."]}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"system.partitionsLogPath"}),(0,r.jsxs)(s.td,{children:["The path RAFT log the partitions are stored at. By default, this log is stored in ",(0,r.jsx)(s.code,{children:"{system.partitionsBasePath}/log"}),". It is recommended to only change this path on an empty node."]}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"system.properties"}),(0,r.jsx)(s.td,{children:"System properties used by the Ignite components."}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"A map of properties."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"system.criticalWorkers.livenessCheckIntervalMillis"}),(0,r.jsx)(s.td,{children:"2000"}),(0,r.jsx)(s.td,{children:"Interval between liveness checks (ms) performed by the critical worker infrastructure."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf (not greater than half of maxAllowedLagMillis)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"system.criticalWorkers.maxAllowedLagMillis"}),(0,r.jsx)(s.td,{children:"5000"}),(0,r.jsx)(s.td,{children:"Maximum allowed delay from the last heartbeat to the current time (ms). If exceeded, the critical worker is considered to be blocked."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"No"}),(0,r.jsx)(s.td,{children:"1 - inf (should be at least twice livenessCheckInterval)"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"system.criticalWorkers.nettyThreadsHeartbeatIntervalMillis"}),(0,r.jsx)(s.td,{children:"1000"}),(0,r.jsx)(s.td,{children:"Interval between heartbeats used to update the Netty threads' heartbeat timestamps (ms)."}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"Yes"}),(0,r.jsx)(s.td,{children:"1 - inf"})]})]})]})]})}function a(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},28453:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(96540);const r={},d=n.createContext(r);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/5c36b491.48cc296e.js b/docs/ignite3/assets/js/5c36b491.48cc296e.js deleted file mode 100644 index a8f82b0524..0000000000 --- a/docs/ignite3/assets/js/5c36b491.48cc296e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5348],{28453:(e,r,s)=>{s.d(r,{R:()=>c,x:()=>d});var n=s(96540);const a={},i=n.createContext(a);function c(e){const r=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),n.createElement(i.Provider,{value:r},e.children)}},38973:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>c,metadata:()=>n,toc:()=>o});const n=JSON.parse('{"id":"understand/index","title":"Understand","description":"This section explains how Apache Ignite 3 works. Start with core concepts to understand the data model and distributed processing fundamentals, then explore the architecture for implementation details.","source":"@site/docs/understand/index.mdx","sourceDirName":"understand","slug":"/understand/","permalink":"/docs/ignite3/3.1.0/understand/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Storage Profiles","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles"},"next":{"title":"Core Concepts","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/"}}');var a=s(74848),i=s(28453);const c={},d="Understand",t={},o=[{value:"Core Concepts",id:"core-concepts",level:2},{value:"Architecture",id:"architecture",level:2},{value:"Performance",id:"performance",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const r={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components},{IIcon:s}=r;return s||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.header,{children:(0,a.jsx)(r.h1,{id:"understand",children:"Understand"})}),"\n",(0,a.jsx)(r.p,{children:"This section explains how Apache Ignite 3 works. Start with core concepts to understand the data model and distributed processing fundamentals, then explore the architecture for implementation details."}),"\n",(0,a.jsx)(r.h2,{id:"core-concepts",children:"Core Concepts"}),"\n",(0,a.jsx)(r.p,{children:"Fundamental concepts for working with Apache Ignite 3."}),"\n",(0,a.jsxs)("div",{className:"card-container",children:[(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:information-outline",height:"24"})," What is Apache Ignite 3?"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Distributed database capabilities, use cases, and system components."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/core-concepts/what-is-ignite",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:table-large",height:"24"})," Tables and Schemas"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Data organization with tables, schemas, indexes, and the system catalog."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/core-concepts/tables-and-schemas",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:history",height:"24"})," Transactions and MVCC"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"ACID transactions, isolation levels, and multi-version concurrency control."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/core-concepts/transactions-and-mvcc",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:map-marker-multiple-outline",height:"24"})," Distribution and Colocation"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Distribution zones, data placement, and colocation strategies for joins."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/core-concepts/distribution-and-colocation",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:view-grid-outline",height:"24"})," Data Partitioning"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Partition distribution, replicas, leases, and replication groups."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/core-concepts/data-partitioning",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:server-network",height:"24"})," Compute and Events"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Distributed job execution, code deployment, and cluster event handling."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/core-concepts/compute-and-events",children:"Learn more \u2192"})})]})]}),"\n",(0,a.jsx)(r.h2,{id:"architecture",children:"Architecture"}),"\n",(0,a.jsx)(r.p,{children:"System architecture, storage implementation, and data distribution."}),"\n",(0,a.jsxs)("div",{className:"card-container",children:[(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:sitemap",height:"24"})," Architecture Overview"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Node components, cluster coordination, RAFT consensus, and request flow."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/architecture/architecture-overview",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:harddisk",height:"24"})," Storage Architecture"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Storage layers, profiles, and the relationship between zones and engines."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/architecture/storage-architecture",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:database-cog-outline",height:"24"})," Storage Engines"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"AIMemory, AIPersist, and RocksDB engine configuration and characteristics."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/architecture/storage-engines/",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:shield-lock-outline",height:"24"})," Security Architecture"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Authentication, SSL/TLS encryption, and security configuration."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/architecture/security",children:"Learn more \u2192"})})]})]}),"\n",(0,a.jsx)(r.h2,{id:"performance",children:"Performance"}),"\n",(0,a.jsx)(r.p,{children:"Query analysis and optimization techniques."}),"\n",(0,a.jsxs)("div",{className:"card-container",children:[(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:file-search-outline",height:"24"})," Using EXPLAIN"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Analyze query execution plans to understand performance characteristics."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/performance/using-explain",children:"Learn more \u2192"})})]}),(0,a.jsxs)("div",{className:"card",children:[(0,a.jsx)("div",{className:"card__header",children:(0,a.jsxs)("h3",{children:[(0,a.jsx)(s,{icon:"mdi:format-list-text",height:"24"})," EXPLAIN Operators"]})}),(0,a.jsx)("div",{className:"card__body",children:(0,a.jsx)("p",{children:"Reference for all query plan operators and their attributes."})}),(0,a.jsx)("div",{className:"card__footer",children:(0,a.jsx)("a",{href:"./understand/performance/explain-operators",children:"Learn more \u2192"})})]})]}),"\n",(0,a.jsx)(r.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.a,{href:"getting-started",children:"Getting Started"})," - Quick start guides"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.a,{href:"develop",children:"Develop"})," - Build applications with Ignite"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.a,{href:"sql",children:"SQL Reference"})," - SQL syntax and operations"]}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/5ced4073.f9210559.js b/docs/ignite3/assets/js/5ced4073.f9210559.js deleted file mode 100644 index f0432281e2..0000000000 --- a/docs/ignite3/assets/js/5ced4073.f9210559.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8362],{28453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>s});var t=i(96540);const c={},r=t.createContext(c);function l(e){const n=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:l(e.components),t.createElement(r.Provider,{value:n},e.children)}},53973:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"api-reference/api/cpp-api-reference","title":"C++ API Reference","description":"Complete reference documentation for the Apache Ignite 3 C++ API.","source":"@site/docs/api-reference/api/cpp-api.md","sourceDirName":"api-reference/api","slug":"/api-reference/api/cpp-api-reference","permalink":"/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"C++ API Reference","id":"cpp-api-reference","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":".NET API Reference","permalink":"/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference"},"next":{"title":"Tools","permalink":"/docs/ignite3/3.1.0/tools/"}}');var c=i(74848),r=i(28453);const l={title:"C++ API Reference",id:"cpp-api-reference",sidebar_position:3},s="C++ API Reference",a={},o=[{value:"Overview",id:"overview",level:2},{value:"API Documentation",id:"api-documentation",level:2},{value:"Access the Documentation",id:"access-the-documentation",level:3},{value:"Generating Local Documentation",id:"generating-local-documentation",level:3},{value:"Core Headers",id:"core-headers",level:2},{value:"Client",id:"client",level:3},{value:"Data Access",id:"data-access",level:3},{value:"SQL",id:"sql",level:3},{value:"Transactions and Compute",id:"transactions-and-compute",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"Building Applications",id:"building-applications",level:2},{value:"Compiler Requirements",id:"compiler-requirements",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"c-api-reference",children:"C++ API Reference"})}),"\n",(0,c.jsx)(n.p,{children:"Complete reference documentation for the Apache Ignite 3 C++ API."}),"\n",(0,c.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,c.jsx)(n.p,{children:"The C++ API provides headers and libraries for thin client operations. The implementation uses modern C++17 features with callback-based async patterns."}),"\n",(0,c.jsx)(n.h2,{id:"api-documentation",children:"API Documentation"}),"\n",(0,c.jsx)(n.p,{children:"API documentation is generated from source code comments using Doxygen."}),"\n",(0,c.jsx)(n.h3,{id:"access-the-documentation",children:"Access the Documentation"}),"\n",(0,c.jsx)("a",{href:"/docs/ignite3/api/cpp/index.html",target:"_blank",rel:"noopener noreferrer",style:{display:"inline-block",padding:"12px 24px",backgroundColor:"#0066cc",color:"white",textDecoration:"none",borderRadius:"4px",fontWeight:"bold",marginBottom:"20px"},children:"Open C++ API Reference \u2192"}),"\n",(0,c.jsx)(n.p,{children:"The locally generated Doxygen documentation includes all public APIs, with detailed documentation for classes, functions, and types."}),"\n",(0,c.jsx)(n.h3,{id:"generating-local-documentation",children:"Generating Local Documentation"}),"\n",(0,c.jsx)(n.p,{children:"Generate API documentation from the C++ module:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-bash",children:"cd modules/platforms/cpp\r\ndoxygen Doxyfile\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Generated documentation appears in ",(0,c.jsx)(n.code,{children:"modules/platforms/cpp/docs/html/"}),"."]}),"\n",(0,c.jsxs)(n.p,{children:["Open ",(0,c.jsx)(n.code,{children:"index.html"})," in a browser to view the reference."]}),"\n",(0,c.jsx)(n.h2,{id:"core-headers",children:"Core Headers"}),"\n",(0,c.jsx)(n.h3,{id:"client",children:"Client"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/ignite_client.h"})," - Client interface and configuration"]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"data-access",children:"Data Access"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/table/tables.h"})," - Table discovery"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/table/table.h"})," - Table operations"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/table/record_view.h"})," - Typed record access"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/table/key_value_view.h"})," - Typed key-value access"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/table/ignite_tuple.h"})," - Binary tuple container"]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"sql",children:"SQL"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/sql/sql.h"})," - Query execution interface"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/sql/result_set.h"})," - Result processing"]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"transactions-and-compute",children:"Transactions and Compute"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/transaction/transactions.h"})," - Transaction factory"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/transaction/transaction.h"})," - Transaction control"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/compute/compute.h"})," - Job execution interface"]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"infrastructure",children:"Infrastructure"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ignite/client/network/cluster_node.h"})," - Node information"]}),"\n"]}),"\n",(0,c.jsx)(n.h2,{id:"building-applications",children:"Building Applications"}),"\n",(0,c.jsx)(n.p,{children:"Link against the Ignite client library:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cmake",children:"find_package(ignite-client REQUIRED)\r\ntarget_link_libraries(your_app ignite-client)\n"})}),"\n",(0,c.jsx)(n.p,{children:"The library provides:"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsx)(n.li,{children:"Client implementation"}),"\n",(0,c.jsx)(n.li,{children:"Type serialization"}),"\n",(0,c.jsx)(n.li,{children:"Connection handling"}),"\n",(0,c.jsx)(n.li,{children:"Protocol implementation"}),"\n"]}),"\n",(0,c.jsx)(n.h2,{id:"compiler-requirements",children:"Compiler Requirements"}),"\n",(0,c.jsx)(n.p,{children:"The C++ client requires:"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsx)(n.li,{children:"C++17 compatible compiler"}),"\n",(0,c.jsx)(n.li,{children:"CMake 3.10 or later"}),"\n",(0,c.jsx)(n.li,{children:"OpenSSL (optional, for TLS)"}),"\n"]}),"\n",(0,c.jsx)(n.p,{children:"Tested compilers:"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsx)(n.li,{children:"GCC 7.0+"}),"\n",(0,c.jsx)(n.li,{children:"Clang 5.0+"}),"\n",(0,c.jsx)(n.li,{children:"MSVC 2017+"}),"\n"]}),"\n",(0,c.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"../native-clients/cpp",children:"C++ API Documentation"})," - Usage guides for each API area"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"../../develop/ignite-clients/cpp-client",children:"C++ Client Guide"})," - Build setup and configuration"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"../../getting-started",children:"Getting Started"})," - Tutorials and examples"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/5d2daac0.55498b05.js b/docs/ignite3/assets/js/5d2daac0.55498b05.js deleted file mode 100644 index 0d656edd77..0000000000 --- a/docs/ignite3/assets/js/5d2daac0.55498b05.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4641],{28453:(t,e,i)=>{i.d(e,{R:()=>a,x:()=>r});var s=i(96540);const n={},h=s.createContext(n);function a(t){const e=s.useContext(h);return s.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:a(t.components),s.createElement(h.Provider,{value:e},t.children)}},63367:(t,e,i)=>{i.d(e,{A:()=>Y});var s=i(96540);const n={},h=!1,a=8,r=10,o="railroad-diagram",d=!0,l="center",c=8.5,m=7;class p{constructor(t,e,i){this.children=i||[],this.tagName=t,this.attrs=L(e,{})}format(t,e,i){}addTo(t){if(t instanceof p)return t.children.push(this),this;var e=this.toSVG();return t.appendChild(e),e}toSVG(){var t=function(t,e,i){e=e||{},i=i||"";var s=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e)"xlink:href"===n?s.setAttributeNS("http://www.w3.org/1999/xlink","href",e[n]):s.setAttribute(n,e[n]);return s.textContent=i,s}(this.tagName,this.attrs);return"string"==typeof this.children?t.textContent=this.children:this.children.forEach(function(e){t.appendChild(e.toSVG())}),t}toString(){var t="<"+this.tagName,e="g"==this.tagName||"svg"==this.tagName;for(var i in this.attrs)t+=" "+i+'="'+(this.attrs[i]+"").replace(/&/g,"&").replace(/"/g,""")+'"';return t+=">",e&&(t+="\n"),"string"==typeof this.children?t+=this.children.replace(/[*_\`\[\]<&]/g,function(t){return"&#"+t.charCodeAt(0)+";"}):this.children.forEach(function(e){t+=e}),t+="\n"}walk(t){t(this)}}class w extends p{constructor(t,e){super("path"),this.attrs.d="M"+t+" "+e}m(t,e){return this.attrs.d+="m"+t+" "+e,this}h(t){return this.attrs.d+="h"+t,this}right(t){return this.h(Math.max(0,t))}left(t){return this.h(-Math.max(0,t))}v(t){return this.attrs.d+="v"+t,this}down(t){return this.v(Math.max(0,t))}up(t){return this.v(-Math.max(0,t))}arc(t){var e,i=r,s=r;return"e"!=t[0]&&"w"!=t[1]||(i*=-1),"s"!=t[0]&&"n"!=t[1]||(s*=-1),e="ne"==t||"es"==t||"sw"==t||"wn"==t?1:0,this.attrs.d+="a"+r+" "+r+" 0 0 "+e+" "+i+" "+s,this}arc_8(t,e){const i=r,s=1/Math.sqrt(2)*i,n=i-s;let h="a "+i+" "+i+" 0 0 "+("cw"==e?"1":"0")+" ";const a=t+e;return h+=("ncw"==a?[s,n]:"necw"==a?[n,s]:"ecw"==a?[-n,s]:"secw"==a?[-s,n]:"scw"==a?[-s,-n]:"swcw"==a?[-n,-s]:"wcw"==a?[n,-s]:"nwcw"==a?[s,-n]:"nccw"==a?[-s,n]:"nwccw"==a?[-n,s]:"wccw"==a?[n,s]:"swccw"==a?[s,n]:"sccw"==a?[s,-n]:"seccw"==a?[n,-s]:"eccw"==a?[-n,-s]:"neccw"==a?[-s,-n]:null).join(" "),this.attrs.d+=h,this}l(t,e){return this.attrs.d+="l"+t+" "+e,this}format(){return this.attrs.d+="h.5",this}}class u extends p{constructor(t,e,i,s){super(t,i,s),this.items=e.map(V)}walk(t){t(this),this.items.forEach(e=>e.walk(t))}}class g extends u{constructor(...t){super("svg",t,{class:o}),this.items[0]instanceof I||this.items.unshift(new I),this.items[this.items.length-1]instanceof N||this.items.push(new N),this.up=this.down=this.height=this.width=0;for(const e of this.items)this.width+=e.width+(e.needsSpace?20:0),this.up=Math.max(this.up,e.up-this.height),this.height+=e.height,this.down=Math.max(this.down-e.height,e.down);this.formatted=!1}format(t,e,i,s){t=L(t,20),e=L(e,t,20),i=L(i,t,20);var n=s=L(s,e,20),h=t;h+=this.up;for(var a=new p("g",d?{transform:"translate(.5 .5)"}:{}),r=0;rnew g(...t);class x extends p{constructor(...t){var e=new g(...t);return e.items[0]=new I({type:"complex"}),e.items[e.items.length-1]=new N({type:"complex"}),e}}n.ComplexDiagram=(...t)=>new x(...t);class f extends u{constructor(...t){super("g",t);this.items.length;this.needsSpace=!0,this.up=this.down=this.height=this.width=0;for(var e=0;e0&&(new w(t,e).h(10).addTo(this),t+=10),h.format(t,e,h.width).addTo(this),t+=h.width,e+=h.height,h.needsSpace&&nnew f(...t);class T extends u{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("Stack() must have at least one child.");this.width=Math.max.apply(null,this.items.map(function(t){return t.width+(t.needsSpace?20:0)})),this.items.length>1&&(this.width+=2*r),this.needsSpace=!0,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=0;for(var e=this.items.length-1,i=0;i0&&(this.height+=Math.max(2*r,s.up+a)),i1&&(new w(t,e).h(r).addTo(this),t+=r);for(var h=0;h1?2*r:0);o.format(t,e,d).addTo(this),t+=d,e+=o.height,h!==this.items.length-1&&(new w(t,e).arc("ne").down(Math.max(0,o.down+a-2*r)).arc("es").left(d).arc("nw").down(Math.max(0,this.items[h+1].up+a-2*r)).arc("ws").addTo(this),e+=Math.max(o.down+a,2*r)+Math.max(this.items[h+1].up+a,2*r),t=n+r)}return this.items.length>1&&(new w(t,e).h(r).addTo(this),t+=r),new w(t,e).h(s[1]).addTo(this),this}}n.Stack=(...t)=>new T(...t);class j extends u{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("OptionalSequence() must have at least one child.");if(1===t.length)return new f(t);var e=r;this.needsSpace=!1,this.width=0,this.up=0,this.height=F(this.items,function(t){return t.height}),this.down=this.items[0].down;for(var i=0,s=0;s0&&(this.down=Math.max(this.height+this.down,i+Math.max(2*e,n.down+a))-this.height);var o=(n.needsSpace?10:0)+n.width;this.width+=0===s?e+Math.max(o,e):2*e+Math.max(o,e)+e}h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="optseq")}format(t,e,i){var s=r,n=P(i,this.width);new w(t,e).right(n[0]).addTo(this),new w(t+n[0]+this.width,e+this.height).right(n[1]).addTo(this),t+=n[0];for(var h=e-this.up,o=this.items.length-1,d=0;dnew j(...t);class v extends u{constructor(...t){if(super("g",t),1===t.length)return new f(t);if(2!==t.length)throw new RangeError("AlternatingSequence() must have one or two children.");this.needsSpace=!1;const e=r,i=a,s=Math.max,n=this.items[0],o=this.items[1],d=1/Math.sqrt(2)*e*2,l=(1-1/Math.sqrt(2))*e*2,c=Math.max(e,a),m=c-l+d,p=s(e+e,c/2+e+e,c/2+i+n.down);this.up=p+n.height+n.up;const w=s(e+e,c/2+e+e,c/2+i+o.up);this.down=w+o.height+o.down,this.height=0;const u=2*(n.needsSpace?10:0)+n.width,g=2*(o.needsSpace?10:0)+o.width;this.width=2*e+s(u,m,g)+2*e,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="altseq")}format(t,e,i){const s=r,n=P(i,this.width);new w(t,e).right(n[0]).addTo(this),t+=n[0],new w(t+this.width,e).right(n[1]).addTo(this);const h=this.items[0],o=this.items[1],d=this.up-h.up,l=this.up-h.up-h.height;new w(t,e).arc("se").up(d-2*s).arc("wn").addTo(this),h.format(t+2*s,e-d,this.width-4*s).addTo(this),new w(t+this.width-2*s,e-l).arc("ne").down(l-2*s).arc("ws").addTo(this);const c=this.down-o.down-o.height,m=this.down-o.down;new w(t,e).arc("ne").down(c-2*s).arc("ws").addTo(this),o.format(t+2*s,e+c,this.width-4*s).addTo(this),new w(t+this.width-2*s,e+m).arc("se").up(m-2*s).arc("wn").addTo(this);const p=1/Math.sqrt(2)*s*2,u=(1-1/Math.sqrt(2))*s*2,g=Math.max(s,a),x=g-u+p,f=(this.width-4*s-x)/2;return new w(t+s,e-g/2-s).arc("ws").right(f).arc_8("n","cw").l(x-p,g-u).arc_8("sw","ccw").right(f).arc("ne").addTo(this),new w(t+s,e+g/2+s).arc("wn").right(f).arc_8("s","ccw").l(x-p,-(g-u)).arc_8("nw","cw").right(f).arc("se").addTo(this),this}}n.AlternatingSequence=(...t)=>new v(...t);class y extends u{constructor(t,...e){if(super("g",e),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of Choice() must be an integer.");if(t<0||t>=e.length)throw new RangeError("The first argument of Choice() must be an index for one of the items.");this.normal=t;var i,s=e.length-1;this.width=Math.max.apply(null,this.items.map(function(t){return t.width}))+4*r,this.height=this.items[t].height,this.up=this.items[0].up;for(var n=0;n=0;d--){let i=this.items[d];d==this.normal-1&&(n=Math.max(2*r,this.items[this.normal].up+a+i.down+i.height)),new w(t,e).arc("se").up(n-2*r).arc("wn").addTo(this),i.format(t+2*r,e-n,o).addTo(this),new w(t+2*r+o,e-n+i.height).arc("ne").down(n-i.height+this.height-2*r).arc("ws").addTo(this),n+=Math.max(r,i.up+a+(0===d?0:this.items[d-1].down+this.items[d-1].height))}for(new w(t,e).right(2*r).addTo(this),this.items[this.normal].format(t+2*r,e,o).addTo(this),new w(t+2*r+o,e+this.height).right(2*r).addTo(this),d=this.normal+1;d<=h;d++){let i=this.items[d];d==this.normal+1&&(n=Math.max(2*r,this.height+this.items[this.normal].down+a+i.up)),new w(t,e).arc("ne").down(n-2*r).arc("ws").addTo(this),i.format(t+2*r,e+n,o).addTo(this),new w(t+2*r+o,e+n+i.height).arc("se").up(n-2*r+i.height-this.height).arc("wn").addTo(this),n+=Math.max(r,i.height+i.down+a+(d==h?0:this.items[d+1].up))}return this}}n.Choice=(...t)=>new y(...t);class b extends u{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("HorizontalChoice() must have at least one child.");if(1===t.length)return new f(t);const e=this.items.slice(0,-1),i=this.items.slice(1,-1),s=this.items[0],n=this.items[this.items.length-1];this.needsSpace=!1,this.width=r,this.width+=2*r*(this.items.length-1),this.width+=F(this.items,t=>t.width+(t.needsSpace?20:0)),this.width+=n.height>0?r:0,this.width+=r,this.height=0,this._upperTrack=Math.max(2*r,a,W(e,t=>t.up)+a),this.up=Math.max(this._upperTrack,n.up),this._lowerTrack=Math.max(a,W(i,t=>t.height+Math.max(t.down+a,2*r)),n.height+n.down+a),s.heightt.width+(t.needsSpace?20:0))+(this.items.length-2)*r*2-r;new w(t,e).arc("se").v(-(this._upperTrack-2*r)).arc("wn").h(o).addTo(this);var d=F(a,t=>t.width+(t.needsSpace?20:0))+(this.items.length-2)*r*2+(h.height>0?r:0)-r,l=t+r+n.width+(n.needsSpace?20:0)+2*r;new w(l,e+this._lowerTrack).h(d).arc("se").v(-(this._lowerTrack-2*r)).arc("wn").addTo(this);for(const[m,p]of function*(t){var e=0;for(const i of t)yield[e,i],e++}(this.items)){0===m?(new w(t,e).h(r).addTo(this),t+=r):(new w(t,e-this._upperTrack).arc("ne").v(this._upperTrack-2*r).arc("ws").addTo(this),t+=2*r);var c=p.width+(p.needsSpace?20:0);p.format(t,e,c).addTo(this),t+=c,m===this.items.length-1?0===p.height?new w(t,e).h(r).addTo(this):new w(t,e+p.height).arc("se").addTo(this):0===m&&p.height>this._lowerTrack?p.height-this._lowerTrack>=2*r?new w(t,e+p.height).arc("se").v(this._lowerTrack-p.height+2*r).arc("wn").addTo(this):new w(t,e+p.height).l(2*r,this._lowerTrack-p.height).addTo(this):new w(t,e+p.height).arc("ne").v(this._lowerTrack-p.height-2*r).arc("ws").addTo(this)}return this}}n.HorizontalChoice=(...t)=>new b(...t);class S extends u{constructor(t,e,...i){if(super("g",i),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of MultipleChoice() must be an integer.");if(t<0||t>=i.length)throw new RangeError("The first argument of MultipleChoice() must be an index for one of the items.");if(this.normal=t,"any"!=e&&"all"!=e)throw new SyntaxError("The second argument of MultipleChoice must be 'any' or 'all'.");this.type=e,this.needsSpace=!0,this.innerWidth=W(this.items,function(t){return t.width}),this.width=30+r+this.innerWidth+r+20,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=this.items[t].height;for(var s=0;st&&(this.down+=Math.max(e,i.up+a+this.items[s-1].down+this.items[s-1].height))}this.down-=this.items[t].height,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="multiplechoice")}format(t,e,i){var s=P(i,this.width);new w(t,e).right(s[0]).addTo(this),new w(t+s[0]+this.width,e+this.height).right(s[1]).addTo(this),t+=s[0];for(var n,h=this.items[this.normal],o=this.normal-1;o>=0;o--){var d=this.items[o];o==this.normal-1&&(n=Math.max(10+r,h.up+a+d.down+d.height)),new w(t+30,e).up(n-r).arc("wn").addTo(this),d.format(t+30+r,e-n,this.innerWidth).addTo(this),new w(t+30+r+this.innerWidth,e-n+d.height).arc("ne").down(n-d.height+this.height-r-10).addTo(this),0!==o&&(n+=Math.max(r,d.up+a+this.items[o-1].down+this.items[o-1].height))}for(new w(t+30,e).right(r).addTo(this),h.format(t+30+r,e,this.innerWidth).addTo(this),new w(t+30+r+this.innerWidth,e+this.height).right(r).addTo(this),o=this.normal+1;onew S(...t);class C extends p{constructor(t,e){if(void 0===e)return new y(1,new A,t);if("skip"===e)return new y(0,new A,t);throw"Unknown value for Optional()'s 'skip' argument."}}n.Optional=(...t)=>new C(...t);class M extends p{constructor(t,e){super("g"),e=e||new A,this.item=V(t),this.rep=V(e),this.width=Math.max(this.item.width,this.rep.width)+2*r,this.height=this.item.height,this.up=this.item.up,this.down=Math.max(2*r,this.item.down+a+this.rep.up+this.rep.height+this.rep.down),this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="oneormore")}format(t,e,i){var s=P(i,this.width);new w(t,e).h(s[0]).addTo(this),new w(t+s[0]+this.width,e+this.height).h(s[1]).addTo(this),t+=s[0],new w(t,e).right(r).addTo(this),this.item.format(t+r,e,this.width-2*r).addTo(this),new w(t+this.width-r,e+this.height).right(r).addTo(this);var n=Math.max(2*r,this.item.height+this.item.down+a+this.rep.up);return new w(t+r,e).arc("nw").down(n-2*r).arc("ws").addTo(this),this.rep.format(t+r,e+n,this.width-2*r).addTo(this),new w(t+this.width-r,e+n+this.rep.height).arc("se").up(n-2*r+this.rep.height-this.item.height).arc("en").addTo(this),this}walk(t){t(this),this.item.walk(t),this.rep.walk(t)}}n.OneOrMore=(...t)=>new M(...t);class O extends p{constructor(t,e,i){return new C(new M(t,e),i)}}n.ZeroOrMore=(...t)=>new O(...t);class k extends p{constructor(t,e){super("g"),this.item=V(t),this.label=e instanceof p?e:e?new _(e):void 0,this.width=Math.max(this.item.width+(this.item.needsSpace?20:0),this.label?this.label.width:0,2*r),this.height=this.item.height,this.boxUp=this.up=Math.max(this.item.up+a,r),this.label&&(this.up+=this.label.up+this.label.height+this.label.down),this.down=Math.max(this.item.down+a,r),this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="group")}format(t,e,i){var s=P(i,this.width);return new w(t,e).h(s[0]).addTo(this),new w(t+s[0]+this.width,e+this.height).h(s[1]).addTo(this),t+=s[0],new p("rect",{x:t,y:e-this.boxUp,width:this.width,height:this.boxUp+this.height+this.down,rx:r,ry:r,class:"group-box"}).addTo(this),this.item.format(t,e,this.width).addTo(this),this.label&&this.label.format(t,e-(this.boxUp+this.label.down+this.label.height),this.label.width).addTo(this),this}walk(t){t(this),this.item.walk(t),this.label.walk(t)}}n.Group=(...t)=>new k(...t);class I extends p{constructor({type:t="simple",label:e}={}){super("g"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,e&&(this.label=""+e,this.width=Math.max(20,this.label.length*c+10)),h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="start")}format(t,e){let i=new w(t,e-10);return"complex"===this.type?i.down(20).m(0,-10).right(this.width).addTo(this):i.down(20).m(10,-20).down(20).m(-10,-10).right(this.width).addTo(this),this.label&&new p("text",{x:t,y:e-15,style:"text-anchor:start"},this.label).addTo(this),this}}n.Start=(...t)=>new I(...t);class N extends p{constructor({type:t="simple"}={}){super("path"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="end")}format(t,e){return"complex"===this.type?this.attrs.d="M "+t+" "+e+" h 20 m 0 -10 v 20":this.attrs.d="M "+t+" "+e+" h 20 m -10 -10 v 20 m 10 -20 v 20",this}}n.End=(...t)=>new N(...t);class q extends p{constructor(t,{href:e,title:i,cls:s}={}){super("g",{class:["terminal",s].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=s,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="terminal")}format(t,e,i){var s=P(i,this.width);new w(t,e).h(s[0]).addTo(this),new w(t+s[0]+this.width,e).h(s[1]).addTo(this),t+=s[0],new p("rect",{x:t,y:e-11,width:this.width,height:this.up+this.down,rx:10,ry:10}).addTo(this);var n=new p("text",{x:t+this.width/2,y:e+4},this.text);return this.href?new p("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new p("title",{},[this.title]).addTo(this),this}}n.Terminal=(...t)=>new q(...t);class E extends p{constructor(t,{href:e,title:i,cls:s=""}={}){super("g",{class:["non-terminal",s].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=s,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="nonterminal")}format(t,e,i){var s=P(i,this.width);new w(t,e).h(s[0]).addTo(this),new w(t+s[0]+this.width,e).h(s[1]).addTo(this),t+=s[0],new p("rect",{x:t,y:e-11,width:this.width,height:this.up+this.down}).addTo(this);var n=new p("text",{x:t+this.width/2,y:e+4},this.text);return this.href?new p("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new p("title",{},[this.title]).addTo(this),this}}n.NonTerminal=(...t)=>new E(...t);class _ extends p{constructor(t,{href:e,title:i,cls:s=""}={}){super("g",{class:["comment",s].join(" ")}),this.text=""+t,this.href=e,this.title=i,this.cls=s,this.width=this.text.length*m+10,this.height=0,this.up=8,this.down=8,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="comment")}format(t,e,i){var s=P(i,this.width);new w(t,e).h(s[0]).addTo(this),new w(t+s[0]+this.width,e+this.height).h(s[1]).addTo(this),t+=s[0];var n=new p("text",{x:t+this.width/2,y:e+5,class:"comment"},this.text);return this.href?new p("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new p("title",{},this.title).addTo(this),this}}n.Comment=(...t)=>new _(...t);class A extends p{constructor(){super("g"),this.width=0,this.height=0,this.up=0,this.down=0,this.needsSpace=!1,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="skip")}format(t,e,i){return new w(t,e).right(i).addTo(this),this}}n.Skip=(...t)=>new A(...t);class R extends p{constructor({width:t=50,up:e=15,height:i=25,down:s=15,needsSpace:n=!0}={}){super("g"),this.width=t,this.height=i,this.up=e,this.down=s,this.needsSpace=!0,h&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="block")}format(t,e,i){var s=P(i,this.width);return new w(t,e).h(s[0]).addTo(this),new w(t+s[0]+this.width,e).h(s[1]).addTo(this),t+=s[0],new p("rect",{x:t,y:e-this.up,width:this.width,height:this.up+this.height+this.down}).addTo(this),this}}function L(...t){return t.reduce(function(t,e){return void 0!==t?t:e})}function P(t,e){var i=t-e;switch(l){case"left":return[0,i];case"right":return[i,0];default:return[i/2,i/2]}}function V(t){return t instanceof p?t:new q(""+t)}function F(t,e){return e||(e=function(t){return t}),t.map(e).reduce(function(t,e){return t+e},0)}function W(t,e){return e||(e=function(t){return t}),Math.max.apply(null,t.map(e))}n.Block=(...t)=>new R(...t);var D=i(74848);function Y({children:t}){const e=(0,s.useRef)(null),i=(0,s.useRef)(null),[n,h]=(0,s.useState)(!1),a=e=>{if(e.current)try{const s=(...t)=>new g(...t),n=(...t)=>new q(...t),h=(...t)=>new E(...t),a=(...t)=>new C(...t),r=(...t)=>new f(...t),o=(...t)=>new y(...t),d=(...t)=>new A(...t),l=(...t)=>new _(...t),c=(...t)=>new M(...t),m=(...t)=>new O(...t),p=t.replace(/ComplexDiagram\(/g,"Diagram(").replace(/Start\([^)]*\),?\s*/g,"").replace(/,?\s*End\([^)]*\)/g,"").trim();try{const t=new Function("Diagram","Terminal","NonTerminal","Optional","Sequence","Choice","Skip","Comment","OneOrMore","ZeroOrMore",`'use strict'; return ${p};`)(s,n,h,a,r,o,d,l,c,m);if(!t||"function"!=typeof t.toSVG)throw new Error("Diagram function did not return a valid diagram object");e.current.innerHTML="";const i=t.toSVG();i.querySelectorAll("a[*|href]").forEach(t=>{const e=t.getAttributeNS("http://www.w3.org/1999/xlink","href");e&&t.setAttribute("href",e)}),e.current.appendChild(i)}catch(i){throw console.error("Error in diagram generation:",i),i}}catch(s){console.error("Error rendering railroad diagram:",s),e.current.innerHTML='

                                                              Error rendering diagram. Check console for details.

                                                              '}};(0,s.useEffect)(()=>{a(e)},[t]),(0,s.useEffect)(()=>{if(n){a(i);const t=t=>{"Escape"===t.key&&h(!1)};return document.addEventListener("keydown",t),document.body.style.overflow="hidden",()=>{document.removeEventListener("keydown",t),document.body.style.overflow=""}}},[n,t]);return(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)("div",{className:"railroad-diagram-wrapper",children:[(0,D.jsx)("button",{className:"railroad-expand-button",onClick:()=>h(!0),"aria-label":"Expand diagram",title:"View full size",children:(0,D.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:(0,D.jsx)("path",{d:"M1.5 1a.5.5 0 0 0-.5.5v4a.5.5 0 0 1-1 0v-4A1.5 1.5 0 0 1 1.5 0h4a.5.5 0 0 1 0 1h-4zM10 .5a.5.5 0 0 1 .5-.5h4A1.5 1.5 0 0 1 16 1.5v4a.5.5 0 0 1-1 0v-4a.5.5 0 0 0-.5-.5h-4a.5.5 0 0 1-.5-.5zM.5 10a.5.5 0 0 1 .5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 1 0 1h-4A1.5 1.5 0 0 1 0 14.5v-4a.5.5 0 0 1 .5-.5zm15 0a.5.5 0 0 1 .5.5v4a1.5 1.5 0 0 1-1.5 1.5h-4a.5.5 0 0 1 0-1h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 1 .5-.5z"})})}),(0,D.jsx)("div",{ref:e,className:"railroad-diagram-container"})]}),n&&(0,D.jsx)("div",{className:"railroad-modal-overlay",onClick:t=>{t.target===t.currentTarget&&h(!1)},children:(0,D.jsxs)("div",{className:"railroad-modal-content",children:[(0,D.jsx)("button",{className:"railroad-modal-close",onClick:()=>h(!1),"aria-label":"Close",title:"Close (ESC)",children:"\xd7"}),(0,D.jsx)("div",{ref:i,className:"railroad-diagram-container railroad-diagram-modal"})]})})]})}},80839:(t,e,i)=>{i.r(e),i.d(e,{assets:()=>d,contentTitle:()=>o,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"sql/reference/data-types-and-functions/operational-commands","title":"Operational Commands","description":"SELECT","source":"@site/docs/sql/reference/data-types-and-functions/operational-commands.mdx","sourceDirName":"sql/reference/data-types-and-functions","slug":"/sql/reference/data-types-and-functions/operational-commands","permalink":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"operational-commands","title":"Operational Commands"},"sidebar":"tutorialSidebar","previous":{"title":"Operators and Functions","permalink":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions"},"next":{"title":"SQL Conformance","permalink":"/docs/ignite3/3.1.0/sql/reference/sql-conformance/"}}');var n=i(74848),h=i(28453),a=i(63367);const r={id:"operational-commands",title:"Operational Commands"},o="Operational Commands",d={},l=[{value:"SELECT",id:"select",level:2},{value:"Parameters",id:"parameters",level:3},{value:"JOINs",id:"joins",level:3},{value:"COPY INTO",id:"copy-into",level:2},{value:"Description",id:"description",level:3},{value:"Parameters",id:"parameters-1",level:3},{value:"Examples",id:"examples",level:3},{value:"KILL QUERY",id:"kill-query",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"KILL TRANSACTION",id:"kill-transaction",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"KILL COMPUTE",id:"kill-compute",level:2},{value:"Parameters",id:"parameters-4",level:3}];function c(t){const e={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,h.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"operational-commands",children:"Operational Commands"})}),"\n",(0,n.jsx)(e.h2,{id:"select",children:"SELECT"}),"\n",(0,n.jsx)(e.p,{children:"Retrieves data from a table or multiple tables."}),"\n",(0,n.jsx)(a.A,{children:"\nDiagram(\nTerminal('SELECT'),\nOptional(NonTerminal('hint_comment')),\nOptional(Sequence(\nChoice(1,\nTerminal('ALL'),\nTerminal('DISTINCT')\n))),\nSequence(\nOneOrMore(Sequence(Terminal('project_item', {href:'../language-definition/grammar-reference#project_item'})\n),\nTerminal(',')\n),\n),\nTerminal('FROM'),\nNonTerminal('table_expression', {href:'../language-definition/grammar-reference#table_expression'}),\nOptional(\nSequence(\nNonTerminal('WHERE'),\nTerminal('where_boolean_expression')\n)\n),\nEnd({type:'complex'}))\n"}),"\n",(0,n.jsx)(a.A,{children:"\nDiagram(\nStart({type:'complex'}),\nOptional(\nSequence(\nNonTerminal('GROUP BY'),\nOptional(Choice(1,\nTerminal('ALL'),\nTerminal('DISTINCT')\n)),\nOneOrMore(Sequence(Terminal('group_item', {href:'../language-definition/grammar-reference#group_item'})\n),\nTerminal(',')\n),\n)\n),\nOptional(\nSequence(\nNonTerminal('HAVING'),\nTerminal('having_boolean_expression')\n)))\n"}),"\n",(0,n.jsx)(e.h3,{id:"parameters",children:"Parameters"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"hint_comment"})," - an sql ",(0,n.jsx)(e.a,{href:"/3.1.0/sql/advanced/performance-tuning#optimizer-hints",children:"optimizer hint"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"where_boolean_expression"})," - an SQL expression that is run against table records and returns a boolean value. Only the records for which ",(0,n.jsx)(e.code,{children:"TRUE"})," was returned will be returned. If not specified, all matching records are returned."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"having_boolean_expression"})," - an SQL expression that is run against groups and returns a boolean value. Can use ",(0,n.jsx)(e.a,{href:"/3.1.0/sql/reference/data-types-and-functions/operators-and-functions#aggregate-functions",children:"aggregate functions"}),". Only the groups for which ",(0,n.jsx)(e.code,{children:"TRUE"})," was returned will be returned. If not specified, all matching groups are returned."]}),"\n"]}),"\n",(0,n.jsx)(e.h3,{id:"joins",children:"JOINs"}),"\n",(0,n.jsx)(e.p,{children:"Apache Ignite supports colocated and non-colocated distributed SQL joins. Furthermore, if the data resides in different tables, Apache Ignite allows for cross-table joins as well."}),"\n",(0,n.jsx)(e.h2,{id:"copy-into",children:"COPY INTO"}),"\n",(0,n.jsx)(e.h3,{id:"description",children:"Description"}),"\n",(0,n.jsx)(e.p,{children:"Imports data from an external source into a table or exports data to a file from the table. The table the data is imported into must exist."}),"\n",(0,n.jsx)(a.A,{children:"\nDiagram(\nTerminal('COPY'),\nTerminal('FROM'),\nNonTerminal('source'),\nTerminal('INTO'),\nNonTerminal('target'),\nTerminal('FORMAT'),\nNonTerminal('formatType'),\nOptional(\nSequence(\nTerminal('WITH'),\nOneOrMore (NonTerminal('parameter', {href:'../language-definition/grammar-reference#parameter'}), Terminal(','))\n)\n)\n)\n"}),"\n",(0,n.jsx)(e.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"source"})," - the full path to the file to import the data data from (if ",(0,n.jsx)(e.code,{children:"target"})," is a table). Then name of the table and the list of columns to export the data from (if ",(0,n.jsx)(e.code,{children:"target"})," is a file). If the source is a table, you can further narrow down the selection by using a query."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"target"})," - the table and table columns when importing data to the table. The path to the file when exporting data."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"formatType"})," - the format of the file to work with:","\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.code,{children:"CSV"})}),"\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.code,{children:"PARQUET"})}),"\n",(0,n.jsx)(e.li,{children:(0,n.jsx)(e.code,{children:"ICEBERG"})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"WITH"})," - accepts additional parameters. All properties are case-sensitive:","\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"delimiter"})," - for CSV files only; default delimiter is ",(0,n.jsx)(e.code,{children:","}),". Delimiter syntax is ",(0,n.jsx)(e.code,{children:"'char'"}),". Any alphanumeric character can be a delimiter."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"pattern"})," - the file pattern used when importing partitioned Parquet tables in the regular expression format. The regular expression must be enclosed in ",(0,n.jsx)(e.code,{children:"'"})," signs. For example, ",(0,n.jsx)(e.code,{children:"'.*'"})," imports all files. Partitioned column will not be imported."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"header"})," - for CSV files only; if set to ",(0,n.jsx)(e.code,{children:"true"}),", specifies that the created file should contain a header line with column names. Column names of the table are used to create the header line."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"quoteChar"})," - for CSV files only; the character to use for quoted elements. Default quote character is ",(0,n.jsx)(e.code,{children:'"'}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"escapeChar"})," - for CSV files only; the character to use for escaping a separator or quote. Default escape character is ",(0,n.jsx)(e.code,{children:"\\"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"ignoreLeadingWhiteSpace"})," - for CSV files only; if ",(0,n.jsx)(e.code,{children:"true"}),", ignore leading whitespace, keep them otherwise. Default value is ",(0,n.jsx)(e.code,{children:"true"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"ignoreQuotations"})," - for CSV files only; if ",(0,n.jsx)(e.code,{children:"true"}),", quoted elements are ignored, otherwise they are kept. Default value is ",(0,n.jsx)(e.code,{children:"false"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"strictQuotes"})," - for CSV files only; if ",(0,n.jsx)(e.code,{children:"true"}),", characters outside the quoted elements are ignored, otherwise they are kept. Default value is ",(0,n.jsx)(e.code,{children:"false"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"batchSize"})," - the number of entries loaded in each batch. Default value is ",(0,n.jsx)(e.code,{children:"1024"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"null"})," - what value empty values are mapped to on import, and ",(0,n.jsx)(e.code,{children:"null"})," values are mapped to on export. By default, empty values are mapped to ",(0,n.jsx)(e.code,{children:"null"})," on import, and ",(0,n.jsx)(e.code,{children:"null"})," values are mapped to an empty string (",(0,n.jsx)(e.code,{children:'""'}),") on export."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"S3"}),":","\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"s3.client-region"})," - when using S3 storage, the region to store the data in."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"s3.access-key-id"})," - when using S3 storage, the AWS access key."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"s3.secret-access-key"})," - when using S3 storage, the AWS secret key."]}),"\n",(0,n.jsxs)(e.li,{children:["Iceberg-specific:","\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:["The ",(0,n.jsx)(e.a,{href:"https://iceberg.apache.org/docs/latest/configuration#catalog-properties",children:"catalog properties"})," are supported."]}),"\n",(0,n.jsxs)(e.li,{children:["The ",(0,n.jsx)(e.code,{children:"table-identifier"})," property describes Apache Iceberg TableIdentifier names. The names can be dot-separated. For example, ",(0,n.jsx)(e.code,{children:"db_name.table_name"})," or ",(0,n.jsx)(e.code,{children:"table"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:["The ",(0,n.jsx)(e.code,{children:"warehouse"})," path can be defined explicitly as a ",(0,n.jsx)(e.code,{children:"'warehouse'='path'"})," property, or implicitly as a source or target ",(0,n.jsx)(e.code,{children:"COPY FROM source INTO target"}),". If both ways are defined, the explicit property is used."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(e.h3,{id:"examples",children:"Examples"}),"\n",(0,n.jsxs)(e.p,{children:["Imports data from columns ",(0,n.jsx)(e.code,{children:"name"})," and ",(0,n.jsx)(e.code,{children:"age"})," of a CSV file with header into Table1 columns ",(0,n.jsx)(e.code,{children:"name"})," and ",(0,n.jsx)(e.code,{children:"age"}),":"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"/* Import data from CSV with column headers */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age)\r\nFORMAT CSV\n"})}),"\n",(0,n.jsxs)(e.p,{children:["Imports data from the first two columns of a CSV file without header into Table1 columns ",(0,n.jsx)(e.code,{children:"name"})," and ",(0,n.jsx)(e.code,{children:"age"}),":"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"/* Import data from CSV without column headers */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age)\n"})}),"\n",(0,n.jsxs)(e.p,{children:["Imports data from columns ",(0,n.jsx)(e.code,{children:"name"})," and ",(0,n.jsx)(e.code,{children:"age"})," of a CSV file that uses the ",(0,n.jsx)(e.code,{children:"~"})," symbol as quotation character:"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"/* Import data from CSV with custom quotation character */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age)\r\nFORMAT CSV\r\nWITH 'quoteChar'='~'\n"})}),"\n",(0,n.jsxs)(e.p,{children:["Imports data from columns ",(0,n.jsx)(e.code,{children:"name"}),", ",(0,n.jsx)(e.code,{children:"age"})," and ",(0,n.jsx)(e.code,{children:"empty"})," of a CSV file and maps all empty values to ",(0,n.jsx)(e.code,{children:"no data"}),":"]}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"/* Import data from CSV with custom quotation character */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age, empty)\r\nFORMAT CSV\r\nWITH 'null'='no data'\n"})}),"\n",(0,n.jsx)(e.p,{children:"Imports data from CSV table in batches of 2048 entries:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"/* Import data from CSV without column headers */\r\nCOPY FROM '/path/to/dir/data.csv'\r\nINTO Table1 (name, age)\r\nWITH 'batchSize'='2048'\n"})}),"\n",(0,n.jsx)(e.p,{children:"Exports data from Table1 to a CSV file:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"/* Export data to CSV */\r\nCOPY FROM (SELECT name, age FROM Table1)\r\nINTO '/path/to/dir/data.csv'\r\nFORMAT CSV\n"})}),"\n",(0,n.jsx)(e.p,{children:"Imports CSV file from AWS S3 into Table1:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"/* Import CSV file from s3 */\r\nCOPY FROM 's3://mybucket/data.csv'\r\nINTO Table1 (name, age)\r\nFORMAT CSV\r\nWITH 'delimiter'= '|', 's3.access-key-id' = 'keyid', 's3.secret-access-key' = 'secretkey'\n"})}),"\n",(0,n.jsx)(e.p,{children:"A simple example of exporting data to Iceberg. For working with local file system you can use HadoopCatalog that does not need to connect to a Hive MetaStore."}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"COPY FROM Table1 (id,name,height)\r\nINTO '/tmp/person.i/'\r\nFORMAT ICEBERG\r\nWITH 'table-identifier'='person', 'catalog-impl'='org.apache.iceberg.hadoop.HadoopCatalog'\n"})}),"\n",(0,n.jsx)(e.p,{children:"Exports data into Iceberg on AWS S3:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"COPY FROM person (id,name,height)\r\nINTO 's3://iceberg-warehouse/glue-catalog'\r\nFORMAT ICEBERG\r\nWITH\r\n 'table-identifier'='iceberg_db_1.person',\r\n 'io-impl'='org.apache.iceberg.aws.s3.S3FileIO',\r\n 'catalog-impl'='org.apache.iceberg.aws.glue.GlueCatalog',\r\n 's3.client-region'='eu-central-1',\r\n 's3.access-key-id'='YOUR_KEY',\r\n 's3.secret-access-key'='YOUR_SECRET'\n"})}),"\n",(0,n.jsx)(e.admonition,{type:"warning",children:(0,n.jsxs)(e.p,{children:["Glue catalog requires the table identifier pattern ",(0,n.jsx)(e.code,{children:"db_name.table_name - [a-z0-9_]"})," (all letters must be in low case with underscores and no spaces). It can be disabled by setting the ",(0,n.jsx)(e.code,{children:"glue.skip-name-validation"})," property to ",(0,n.jsx)(e.code,{children:"true"})," to skip validation. When database name and table name validation are skipped, there is no guarantee that downstream systems would all support the names."]})}),"\n",(0,n.jsx)(e.p,{children:"Imports data from partitioned Parquet database:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{className:"language-sql",children:"COPY FROM '/tmp/partitioned_table_dir'\r\nINTO city (id, name, population)\r\nFORMAT PARQUET\r\nWITH 'pattern' = '.*'\n"})}),"\n",(0,n.jsx)(e.p,{children:"Where the Parquet table looks like this:"}),"\n",(0,n.jsx)(e.pre,{children:(0,n.jsx)(e.code,{children:"partitioned_table_dir/\r\n\u251c\u2500 CountryCode=USA/\r\n\u2502 \u251c\u2500 000000_0.parquet\r\n\u251c\u2500 CountryCode=FR/\r\n\u2502 \u251c\u2500 000000_0.parquet\n"})}),"\n",(0,n.jsx)(e.h2,{id:"kill-query",children:"KILL QUERY"}),"\n",(0,n.jsxs)(e.p,{children:["Cancels a running query. When a query is canceled with the ",(0,n.jsx)(e.code,{children:"KILL"})," command, all parts of the query running on all other nodes are canceled too."]}),"\n",(0,n.jsx)(a.A,{children:"\nDiagram(\nTerminal('KILL'),\nTerminal('QUERY'),\nNonTerminal('query_id'),\nOptional(Terminal('NO WAIT'))\n)\n"}),"\n",(0,n.jsx)(e.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"query_id"})," - query identifier that can be retrieved via the ",(0,n.jsx)(e.code,{children:"SQL_QUERIES"})," ",(0,n.jsx)(e.a,{href:"/3.1.0/configure-and-operate/monitoring/metrics-system-views",children:"system view"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"NO WAIT"})," - if specified, the command will return control immediately, without waiting for the query to be cancelled. You can monitor query status through the ",(0,n.jsx)(e.code,{children:"SQL_QUERIES"})," ",(0,n.jsx)(e.a,{href:"/3.1.0/configure-and-operate/monitoring/metrics-system-views",children:"system view"})," to make sure it was cancelled."]}),"\n"]}),"\n",(0,n.jsx)(e.h2,{id:"kill-transaction",children:"KILL TRANSACTION"}),"\n",(0,n.jsx)(e.p,{children:"Cancels an active transaction."}),"\n",(0,n.jsx)(a.A,{children:"\nDiagram(\nTerminal('KILL'),\nTerminal('TRANSACTION'),\nNonTerminal('transaction_id'),\nOptional(Terminal('NO WAIT'))\n)\n"}),"\n",(0,n.jsx)(e.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"transaction_id"})," - transaction identifier that can be retrieved via the ",(0,n.jsx)(e.code,{children:"TRANSACTIONS"})," ",(0,n.jsx)(e.a,{href:"/3.1.0/configure-and-operate/monitoring/metrics-system-views",children:"system view"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"NO WAIT"})," - if specified, the command will return control immediately, without waiting for the transaction to be cancelled. You can monitor transaction status through the ",(0,n.jsx)(e.code,{children:"TRANSACTIONS"})," ",(0,n.jsx)(e.a,{href:"/3.1.0/configure-and-operate/monitoring/metrics-system-views",children:"system view"})," to make sure it was cancelled."]}),"\n"]}),"\n",(0,n.jsx)(e.h2,{id:"kill-compute",children:"KILL COMPUTE"}),"\n",(0,n.jsxs)(e.p,{children:["Cancels a running compute job. When a job is canceled with the ",(0,n.jsx)(e.code,{children:"KILL"})," command, all parts of the job running on all other nodes are canceled too."]}),"\n",(0,n.jsx)(a.A,{children:"\nDiagram(\nTerminal('KILL'),\nTerminal('COMPUTE'),\nNonTerminal('job_id'),\nOptional(Terminal('NO WAIT'))\n)\n"}),"\n",(0,n.jsx)(e.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"job_id"})," - job identifier that can be retrieved via the ",(0,n.jsx)(e.code,{children:"COMPUTE_JOBS"})," ",(0,n.jsx)(e.a,{href:"/3.1.0/configure-and-operate/monitoring/metrics-system-views",children:"system view"}),"."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.code,{children:"NO WAIT"})," - if specified, the command will return control immediately, without waiting for the job to be cancelled. You can monitor job status through the ",(0,n.jsx)(e.code,{children:"COMPUTE_JOBS"})," ",(0,n.jsx)(e.a,{href:"/3.1.0/configure-and-operate/monitoring/metrics-system-views",children:"system view"})," to make sure it was cancelled."]}),"\n"]})]})}function m(t={}){const{wrapper:e}={...(0,h.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(c,{...t})}):c(t)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/60b12218.1c0eb269.js b/docs/ignite3/assets/js/60b12218.1c0eb269.js deleted file mode 100644 index 6a11bb4105..0000000000 --- a/docs/ignite3/assets/js/60b12218.1c0eb269.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2569],{28453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>a});var s=r(96540);const i={},c=s.createContext(i);function t(e){const n=s.useContext(c);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(c.Provider,{value:n},e.children)}},62863:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"sql/reference/index","title":"SQL Reference","description":"Complete SQL language reference for Apache Ignite 3.","source":"@site/docs/sql/reference/index.mdx","sourceDirName":"sql/reference","slug":"/sql/reference/","permalink":"/docs/ignite3/3.1.0/sql/reference/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"SQL Reference"},"sidebar":"tutorialSidebar","previous":{"title":"System Views","permalink":"/docs/ignite3/3.1.0/sql/working-with-sql/system-views"},"next":{"title":"Language Definition","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/"}}');var i=r(74848),c=r(28453);const t={title:"SQL Reference"},a="SQL Reference",d={},o=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,c.R)(),...e.components},{IIcon:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"sql-reference",children:"SQL Reference"})}),"\n",(0,i.jsx)(n.p,{children:"Complete SQL language reference for Apache Ignite 3."}),"\n",(0,i.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,i.jsxs)("div",{className:"card-container",children:[(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(r,{icon:"mdi:script-text-outline",height:"24"})," Language Definition"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"DDL, DML, distribution zones, transactions, and grammar reference."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./reference/language-definition/",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(r,{icon:"mdi:function-variant",height:"24"})," Data Types and Functions"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Supported data types, operators, functions, and operational commands."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./reference/data-types-and-functions/",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(r,{icon:"mdi:check-decagram-outline",height:"24"})," SQL Conformance"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"SQL standards compliance, keywords, and reserved words."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./reference/sql-conformance/",children:"Learn more \u2192"})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"fundamentals",children:"SQL Fundamentals"})," - SQL engine architecture"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"working-with-sql",children:"SQL Operations"})," - Execute queries"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"advanced",children:"Advanced SQL"})," - Performance tuning"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6105dffd.26b1ce9a.js b/docs/ignite3/assets/js/6105dffd.26b1ce9a.js deleted file mode 100644 index a07682a36b..0000000000 --- a/docs/ignite3/assets/js/6105dffd.26b1ce9a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7901],{28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(96540);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}},66261:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"administrators-guide/storage/engines/rocksdb","title":"RocksDB Storage","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/storage/engines/rocksdb.md","sourceDirName":"administrators-guide/storage/engines","slug":"/administrators-guide/storage/engines/rocksdb","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"RocksDB Storage","sidebar_label":"RocksDB Storage"},"sidebar":"tutorialSidebar","previous":{"title":"Persistent Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist"},"next":{"title":"Volatile Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem"}}');var r=t(74848),s=t(28453);const o={title:"RocksDB Storage",sidebar_label:"RocksDB Storage"},a=void 0,c={},d=[{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Configuration Example",id:"configuration-example",level:2}];function l(e){const n={admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsx)(n.p,{children:"RocksDB support is experimental."})}),"\n",(0,r.jsx)(n.p,{children:"RocksDB is a persistent storage engine based on LSM tree. It is best used in environments with a large number of write requests."}),"\n",(0,r.jsx)(n.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Each Apache Ignite storage engine can have several storage profiles. Each profile has the following properties:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"engine"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"The name of the storage engine."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"sizeBytes"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"256 * 1024 * 1024"})}),(0,r.jsx)(n.td,{children:"Sets the space allocated to the storage profile, in bytes."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"writeBufferSizeBytes"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"64 * 1024 * 1024"})}),(0,r.jsx)(n.td,{children:"Size of rocksdb write buffer."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"configuration-example",children:"Configuration Example"}),"\n",(0,r.jsxs)(n.p,{children:['In Apache Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,r.jsx)(n.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node. The example below shows how to configure a storage profile with RocksDB storage:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "storage" : {\r\n "profiles" : [\r\n {\r\n "name" : "rocks_profile",\r\n "engine" : "rocksDb",\r\n "sizeBytes" : 2560000\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["You can then use the profile (in this case, ",(0,r.jsx)(n.code,{children:"rocks_profile"}),") in your distribution zone configuration."]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/61eaa059.7c0fe16f.js b/docs/ignite3/assets/js/61eaa059.7c0fe16f.js deleted file mode 100644 index 3cd7a3dee7..0000000000 --- a/docs/ignite3/assets/js/61eaa059.7c0fe16f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4091],{28453:(e,n,i)=>{i.d(n,{R:()=>d,x:()=>c});var r=i(96540);const l={},s=r.createContext(l);function d(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:d(e.components),r.createElement(s.Provider,{value:n},e.children)}},36804:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>t,contentTitle:()=>c,default:()=>o,frontMatter:()=>d,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"sql-reference/grammar-reference","title":"Grammar Reference","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-reference/grammar-reference.md","sourceDirName":"sql-reference","slug":"/sql-reference/grammar-reference","permalink":"/docs/ignite3/3.0.0/sql-reference/grammar-reference","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Grammar Reference","sidebar_label":"Grammar Reference"},"sidebar":"tutorialSidebar","previous":{"title":"Operational Commands","permalink":"/docs/ignite3/3.0.0/sql-reference/operational-commands"},"next":{"title":"Keywords","permalink":"/docs/ignite3/3.0.0/sql-reference/keywords"}}');var l=i(74848),s=i(28453);const d={title:"Grammar Reference",sidebar_label:"Grammar Reference"},c=void 0,t={},a=[{value:"assign",id:"assign",level:2},{value:"Parameters",id:"parameters",level:3},{value:"column_definition",id:"column_definition",level:2},{value:"column_definition_or_list",id:"column_definition_or_list",level:2},{value:"column_list",id:"column_list",level:2},{value:"column_name_or_list",id:"column_name_or_list",level:2},{value:"constraint",id:"constraint",level:2},{value:"group_item",id:"group_item",level:2},{value:"Parameters",id:"parameters-1",level:3},{value:"join_condition",id:"join_condition",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"order_item",id:"order_item",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"parameter",id:"parameter",level:2},{value:"project_item",id:"project_item",level:2},{value:"Parameters",id:"parameters-4",level:3},{value:"qualified_table_name",id:"qualified_table_name",level:2},{value:"query",id:"query",level:2},{value:"Parameters",id:"parameters-5",level:3},{value:"select_without_from",id:"select_without_from",level:2},{value:"sorted_column_list",id:"sorted_column_list",level:2},{value:"table_expression",id:"table_expression",level:2},{value:"Parameters",id:"parameters-6",level:3},{value:"table_primary",id:"table_primary",level:2},{value:"Parameters",id:"parameters-7",level:3},{value:"table_reference",id:"table_reference",level:2},{value:"Parameters",id:"parameters-8",level:3},{value:"with_item",id:"with_item",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:["\n",(0,l.jsxs)(n.p,{children:["This section describes grammar elements that are common to multiple SQL functions (",(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl",children:"DDL"}),", ",(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"Distribution Zones"}),", etc.)."]}),"\n",(0,l.jsx)(n.h2,{id:"assign",children:"assign"}),"\n","\n",(0,l.jsx)(n.h3,{id:"parameters",children:"Parameters"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"identifier"})," - the name of table, column or other element that will be updated by the operation."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"expression"})," - a valid SQL expression that returns the values that must be assigned to the ",(0,l.jsx)(n.code,{children:"identifier"}),"."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"MERGE"}),"\n",(0,l.jsx)(n.li,{children:"UPDATE"}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"column_definition",children:"column_definition"}),"\n","\n","\n",(0,l.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"column_name"})," - a column name."]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"DATA TYPE"})," - the ",(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/data-types",children:"data type"})," allowed in the column."]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"identifier"})," - the random identifier for the row. Can be generated by using the ",(0,l.jsx)(n.code,{children:"RAND_UUID"})," function."]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"literal_value"})," - a value to be assigned as default."]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"CURRENT_TIMESTAMP"})," - the function that returns current time. Can only be used for ",(0,l.jsx)(n.code,{children:"TIMESTAMP WITH LOCAL TIME ZONE"})," columns."]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.code,{children:"interval"})," - the time interval by which the timestamp will be offset. Required if ",(0,l.jsx)(n.code,{children:"CURRENT_TIMESTAMP"})," is used. The interval can be specified in:"]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:"SECONDS"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:"MINUTES"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:"HOURS"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:"DAYS"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:"MONTHS"})}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:["If the interval is ",(0,l.jsx)(n.code,{children:"0"}),", current time is used."]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#create-table",children:"CREATE TABLE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#alter-table",children:"ALTER TABLE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#project_item",children:"project_item"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#join_condition",children:"join_condition"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"column_definition_or_list",children:"column_definition_or_list"}),"\n","\n",(0,l.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"column_name"})," - a column name."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"data_type"})," - a valid ",(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/data-types",children:"data type"}),"."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#alter-table",children:"ALTER TABLE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#with_item",children:"with_item"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"column_list",children:"column_list"}),"\n","\n",(0,l.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"column_name"})," - a column name."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/dml#insert",children:"INSERT"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#join_condition",children:"join_condition "})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"column_name_or_list",children:"column_name_or_list"}),"\n","\n",(0,l.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"column_name"})," - a column name."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#alter-table",children:"ALTER TABLE"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"constraint",children:"constraint"}),"\n","\n",(0,l.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"constraint_name"})," - a name of the constraint."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#create-table",children:"CREATE TABLE"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"group_item",children:"group_item"}),"\n","\n",(0,l.jsx)(n.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"expression"})," - a valid SQL expression that returns the values that must be assigned to the ",(0,l.jsx)(n.code,{children:"identifier"}),"."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/operational-commands#select",children:"SELECT"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"join_condition",children:"join_condition"}),"\n","\n",(0,l.jsx)(n.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"boolean_expression"})," - an SQL expression that returns a boolean value. Only the records for which ",(0,l.jsx)(n.code,{children:"TRUE"})," was returned will be returned. If not specified, all matching records are returned."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#table_expression",children:"table_expression"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"order_item",children:"order_item"}),"\n","\n",(0,l.jsx)(n.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"expression"})," - a valid SQL expression that denotes the specific item in the SELECT clause."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#query",children:"query"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"parameter",children:"parameter"}),"\n","\n",(0,l.jsx)(n.p,{children:"Parameters:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"parameter_name"})," - the name of the parameter."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"parameter_value"})," - the value of the parameter."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"When a parameter is specified, you can provide it as a literal value or as an identifier. For example:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"CREATE ZONE test_zone;\r\nCREATE TABLE test_table (id INT PRIMARY KEY, val INT) WITH PRIMARY_ZONE=test_zone;\n"})}),"\n",(0,l.jsxs)(n.p,{children:["In this case, ",(0,l.jsx)(n.code,{children:"test_zone"})," is the identifier, and is used as an identifier. When used like this, the parameters are not case-sensitive."]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"CREATE ZONE \"test_zone\";\r\nCREATE TABLE test_table (id INT PRIMARY KEY, val INT) WITH PRIMARY_ZONE='test_zone';\n"})}),"\n",(0,l.jsxs)(n.p,{children:["In this case, ",(0,l.jsx)(n.code,{children:"test_zone"})," is created as a literal value, and is used as a literal. When used like this, the parameter is case-sensitive."]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"CREATE ZONE test_zone;\r\nCREATE TABLE test_table (id INT PRIMARY KEY, val INT) WITH PRIMARY_ZONE=`TEST_ZONE`;\n"})}),"\n",(0,l.jsxs)(n.p,{children:["In this case, ",(0,l.jsx)(n.code,{children:"test_zone"})," is created as an identifier, and is case-insensitive. As such, when ",(0,l.jsx)(n.code,{children:"TEST_ZONE"})," is used as a literal, it still matches the identifier."]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones#create-zone",children:"CREATE ZONE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones#alter-zone",children:"ALTER ZONE"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"project_item",children:"project_item"}),"\n","\n",(0,l.jsx)(n.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"expression"})," - a valid SQL expression that denotes the specific item in the SELECT clause."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"table_alias"})," - a qualified table alias to use."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/operational-commands#select",children:"SELECT"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#select_without_from",children:"select_without_from"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"qualified_table_name",children:"qualified_table_name"}),"\n","\n",(0,l.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"schema"})," - a name of the table schema."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"table_name"})," - a name of the table."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#create-table",children:"CREATE TABLE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#alter-table",children:"ALTER TABLE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#drop-table",children:"DROP TABLE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#create-index",children:"CREATE INDEX"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/dml#delete",children:"DELETE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/dml#insert",children:"INSERT"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/dml#merge",children:"MERGE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/dml#update",children:"UPDATE"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#table_primary",children:"table_primary"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"query",children:"query"}),"\n","\n",(0,l.jsx)(n.h3,{id:"parameters-5",children:"Parameters"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"expression"})," - a valid SQL expression."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"start"})," - the number of result to start the query from."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"count"})," - the number of values to fetch."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/dml#insert",children:"INSERT"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#with_item",children:"with_item"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#table_primary",children:"table_primary"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"select_without_from",children:"select_without_from"}),"\n","\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#query",children:"query"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"sorted_column_list",children:"sorted_column_list"}),"\n","\n",(0,l.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"column_name"})," - a column name."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"NULLS FIRST"})," - if specified, places any NULL values before all non-NULL in that column's ordering."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"NULLS LAST"})," - if specified, places NULLs after all non-NULLs in that column's ordering."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl#create-index",children:"CREATE INDEX"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#constraint",children:"constraint"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"table_expression",children:"table_expression"}),"\n","\n",(0,l.jsx)(n.h3,{id:"parameters-6",children:"Parameters"}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/operational-commands#select",children:"SELECT"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"table_primary",children:"table_primary"}),"\n","\n","\n",(0,l.jsx)(n.h3,{id:"parameters-7",children:"Parameters"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"hint_comment"})," - an sql ",(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-tuning/#optimizer-hints",children:"optimizer hint"}),"."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"expression"})," - a valid SQL expression."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"function_name"})," - the name of the ",(0,l.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/operators-and-functions",children:"SQL function"})," to use."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#table_reference",children:"table_reference"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"table_reference",children:"table_reference"}),"\n","\n",(0,l.jsx)(n.h3,{id:"parameters-8",children:"Parameters"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"alias"})," - the alias that will be used for the table."]}),"\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.code,{children:"column_alias"})," - the alias used for column."]}),"\n"]}),"\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#table_expression",children:"table_expression"})}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"with_item",children:"with_item"}),"\n","\n",(0,l.jsx)(n.p,{children:"Referenced by:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"#query",children:"query"})}),"\n"]})]})}function o(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/630993fc.fec91443.js b/docs/ignite3/assets/js/630993fc.fec91443.js deleted file mode 100644 index a257473973..0000000000 --- a/docs/ignite3/assets/js/630993fc.fec91443.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[398],{28453:(e,r,n)=>{n.d(r,{R:()=>a,x:()=>o});var i=n(96540);const t={},s=i.createContext(t);function a(e){const r=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(s.Provider,{value:r},e.children)}},43125:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"understand/architecture/storage-architecture","title":"Storage Architecture","description":"Apache Ignite 3 separates logical data organization from physical storage implementation through a layered architecture. Tables define your data model, distribution zones control partitioning and replication, storage profiles configure engine parameters, and storage engines handle the physical read/write operations.","source":"@site/docs/understand/architecture/storage-architecture.md","sourceDirName":"understand/architecture","slug":"/understand/architecture/storage-architecture","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-architecture","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"id":"storage-architecture","title":"Storage Architecture","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Architecture Overview","permalink":"/docs/ignite3/3.1.0/understand/architecture/architecture-overview"},"next":{"title":"Storage Engines","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/"}}');var t=n(74848),s=n(28453);const a={id:"storage-architecture",title:"Storage Architecture",sidebar_position:1},o="Storage Architecture",l={},c=[{value:"Storage Engines",id:"storage-engines",level:2},{value:"AIMemory (aimem)",id:"aimemory-aimem",level:3},{value:"AIPersist (aipersist)",id:"aipersist-aipersist",level:3},{value:"RocksDB (rocksdb)",id:"rocksdb-rocksdb",level:3},{value:"Engine Configuration",id:"engine-configuration",level:2},{value:"Storage Profiles",id:"storage-profiles",level:2},{value:"Default Profile",id:"default-profile",level:3},{value:"Creating Profiles",id:"creating-profiles",level:3},{value:"Using Profiles with Tables",id:"using-profiles-with-tables",level:2}];function d(e){const r={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",mermaid:"mermaid",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"storage-architecture",children:"Storage Architecture"})}),"\n",(0,t.jsx)(r.p,{children:"Apache Ignite 3 separates logical data organization from physical storage implementation through a layered architecture. Tables define your data model, distribution zones control partitioning and replication, storage profiles configure engine parameters, and storage engines handle the physical read/write operations."}),"\n",(0,t.jsx)(r.mermaid,{value:'flowchart TB\r\n subgraph "Cluster-Wide Configuration"\r\n T1[Table: accounts]\r\n T2[Table: transactions]\r\n T3[Table: audit_log]\r\n\r\n Z1[Zone: financial
                                                              partitions: 25, replicas: 3]\r\n Z2[Zone: logging
                                                              partitions: 10, replicas: 2]\r\n end\r\n\r\n subgraph "Zone Storage Profiles"\r\n SP1[Profile: default]\r\n SP2[Profile: fast_storage]\r\n SP3[Profile: large_storage]\r\n end\r\n\r\n subgraph "Node-Local Implementation"\r\n direction LR\r\n subgraph "Node 1"\r\n E1A[aipersist
                                                              256 MB]\r\n E1B[aimem
                                                              512 MB]\r\n E1C[rocksdb
                                                              4 GB]\r\n end\r\n subgraph "Node 2"\r\n E2A[aipersist
                                                              512 MB]\r\n E2B[aimem
                                                              1 GB]\r\n E2C[rocksdb
                                                              8 GB]\r\n end\r\n end\r\n\r\n T1 --\x3e Z1\r\n T2 --\x3e Z1\r\n T3 --\x3e Z2\r\n Z1 --\x3e SP1 & SP2\r\n Z2 --\x3e SP3\r\n SP1 --\x3e E1A & E2A\r\n SP2 --\x3e E1B & E2B\r\n SP3 --\x3e E1C & E2C'}),"\n",(0,t.jsx)(r.p,{children:"This architecture separates concerns across two scopes:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Cluster-wide"}),": Table schemas, distribution zone configurations, and storage profile names are consistent across all nodes"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Node-local"}),": Storage profile implementations (memory sizes, file paths) are configured on each node independently"]}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"The separation allows heterogeneous clusters where nodes with different hardware capabilities can participate in the same distribution zone with appropriately sized storage allocations."}),"\n",(0,t.jsx)(r.h2,{id:"storage-engines",children:"Storage Engines"}),"\n",(0,t.jsx)(r.p,{children:"Storage engines implement the physical data operations: reading pages from storage, writing modified pages, and managing memory buffers. Each engine uses different data structures optimized for specific access patterns."}),"\n",(0,t.jsx)(r.mermaid,{value:'flowchart LR\r\n subgraph "Storage Engine Interface"\r\n SE[StorageEngine]\r\n end\r\n\r\n subgraph "Implementations"\r\n AI[aimem
                                                              Volatile B+ Tree]\r\n AP[aipersist
                                                              Persistent B+ Tree]\r\n RD[rocksdb
                                                              LSM Tree]\r\n end\r\n\r\n subgraph "Storage Medium"\r\n RAM[(RAM Only)]\r\n DISK[(Disk + RAM Cache)]\r\n end\r\n\r\n SE --\x3e AI & AP & RD\r\n AI --\x3e RAM\r\n AP --\x3e DISK\r\n RD --\x3e DISK'}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Engine"}),(0,t.jsx)(r.th,{children:"Data Structure"}),(0,t.jsx)(r.th,{children:"Persistence"}),(0,t.jsx)(r.th,{children:"Use Case"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"aimem"})}),(0,t.jsx)(r.td,{children:"B+ Tree"}),(0,t.jsx)(r.td,{children:"None (volatile)"}),(0,t.jsx)(r.td,{children:"Caching, temporary data, lowest latency"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"aipersist"})}),(0,t.jsx)(r.td,{children:"B+ Tree"}),(0,t.jsx)(r.td,{children:"Checkpoint-based"}),(0,t.jsx)(r.td,{children:"General purpose, balanced read/write"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"rocksdb"})}),(0,t.jsx)(r.td,{children:"LSM Tree"}),(0,t.jsx)(r.td,{children:"Write-ahead log"}),(0,t.jsx)(r.td,{children:"Write-heavy workloads"})]})]})]}),"\n",(0,t.jsx)(r.h3,{id:"aimemory-aimem",children:"AIMemory (aimem)"}),"\n",(0,t.jsx)(r.p,{children:"Stores all data in off-heap memory using B+ tree structures. Data is lost on node shutdown. Memory is allocated in segments (up to 16 segments per region) with on-demand expansion."}),"\n",(0,t.jsxs)(r.p,{children:["See ",(0,t.jsx)(r.a,{href:"./storage-engines/aimem",children:"AIMemory Storage Engine"})," for configuration details."]}),"\n",(0,t.jsx)(r.h3,{id:"aipersist-aipersist",children:"AIPersist (aipersist)"}),"\n",(0,t.jsx)(r.p,{children:"Stores data in partition files on disk with an in-memory page cache. Uses B+ trees for data and index storage. A checkpoint process periodically flushes dirty pages to disk for durability."}),"\n",(0,t.jsxs)(r.p,{children:["See ",(0,t.jsx)(r.a,{href:"./storage-engines/aipersist",children:"AIPersist Storage Engine"})," for configuration details."]}),"\n",(0,t.jsx)(r.h3,{id:"rocksdb-rocksdb",children:"RocksDB (rocksdb)"}),"\n",(0,t.jsx)(r.admonition,{type:"warning",children:(0,t.jsx)(r.p,{children:"RocksDB support is experimental."})}),"\n",(0,t.jsx)(r.p,{children:"Uses the RocksDB library with Log-Structured Merge (LSM) tree storage. Optimized for write-heavy workloads where sequential disk writes improve throughput."}),"\n",(0,t.jsxs)(r.p,{children:["See ",(0,t.jsx)(r.a,{href:"./storage-engines/rocksdb",children:"RocksDB Storage Engine"})," for configuration details."]}),"\n",(0,t.jsx)(r.h2,{id:"engine-configuration",children:"Engine Configuration"}),"\n",(0,t.jsx)(r.p,{children:"Engine-level configuration applies to all profiles using that engine. These settings control engine-wide behavior such as checkpoint intervals or flush delays."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"# View current engine configuration\r\nnode config show ignite.storage.engines\r\n\r\n# Configure checkpoint interval for aipersist (default: 180000ms)\r\nnode config update ignite.storage.engines.aipersist.checkpoint.intervalMillis=180000\n"})}),"\n",(0,t.jsx)(r.p,{children:"Restart the node after updating engine configuration."}),"\n",(0,t.jsx)(r.h2,{id:"storage-profiles",children:"Storage Profiles"}),"\n",(0,t.jsx)(r.p,{children:"A storage profile binds a storage engine to specific configuration parameters. Distribution zones reference profiles by name, and each table in a zone uses the zone's assigned profile."}),"\n",(0,t.jsx)(r.mermaid,{value:'flowchart LR\r\n subgraph "Profile Configuration"\r\n P[Profile: fast_cache]\r\n E[engine: aimem]\r\n S[maxSizeBytes: 1073741824]\r\n end\r\n\r\n subgraph "Usage"\r\n Z[Zone: hot_data]\r\n T[Table: sessions]\r\n end\r\n\r\n P --\x3e E\r\n P --\x3e S\r\n Z --\x3e P\r\n T --\x3e Z'}),"\n",(0,t.jsx)(r.p,{children:"Profile properties:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"engine"}),": The storage engine name (",(0,t.jsx)(r.code,{children:"aimem"}),", ",(0,t.jsx)(r.code,{children:"aipersist"}),", or ",(0,t.jsx)(r.code,{children:"rocksdb"}),")"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.strong,{children:"Engine-specific settings"}),": Memory sizes, buffer sizes, and other parameters"]}),"\n"]}),"\n",(0,t.jsx)(r.h3,{id:"default-profile",children:"Default Profile"}),"\n",(0,t.jsxs)(r.p,{children:["Apache Ignite creates a ",(0,t.jsx)(r.code,{children:"default"})," profile using ",(0,t.jsx)(r.code,{children:"aipersist"})," on every node. Distribution zones use this profile unless configured otherwise."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"# View configured profiles\r\nnode config show ignite.storage.profiles\n"})}),"\n",(0,t.jsx)(r.h3,{id:"creating-profiles",children:"Creating Profiles"}),"\n",(0,t.jsx)(r.p,{children:"Create profiles through node configuration. Each node must have matching profile names with the same engine type, though sizes can differ."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:'# Create an in-memory profile\r\nnode config update "ignite.storage.profiles:{cache_profile{engine:aimem,maxSizeBytes:536870912}}"\r\n\r\n# Create a RocksDB profile\r\nnode config update "ignite.storage.profiles:{rocks_profile{engine:rocksdb,sizeBytes:1073741824}}"\n'})}),"\n",(0,t.jsx)(r.p,{children:"Restart the node after adding profiles."}),"\n",(0,t.jsx)(r.h2,{id:"using-profiles-with-tables",children:"Using Profiles with Tables"}),"\n",(0,t.jsx)(r.p,{children:"Create distribution zones with one or more storage profiles, then assign tables to those zones."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-sql",children:"-- Create a zone with multiple storage profiles\r\nCREATE ZONE financial_zone\r\n WITH PARTITIONS=25, REPLICAS=3,\r\n STORAGE PROFILES ['default', 'fast_cache'];\r\n\r\n-- Create a table using a specific profile\r\nCREATE TABLE accounts (\r\n id INT PRIMARY KEY,\r\n balance DECIMAL(15,2)\r\n) ZONE financial_zone STORAGE PROFILE 'default';\r\n\r\n-- Create a table using the in-memory profile\r\nCREATE TABLE rate_limits (\r\n client_id INT PRIMARY KEY,\r\n requests INT\r\n) ZONE financial_zone STORAGE PROFILE 'fast_cache';\n"})}),"\n",(0,t.jsx)(r.p,{children:"Tables cannot change their zone or storage profile after creation. If a node lacks the required profile, it will not store partitions for tables using that profile."})]})}function h(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6449194f.e36caf49.js b/docs/ignite3/assets/js/6449194f.e36caf49.js deleted file mode 100644 index 8f85685545..0000000000 --- a/docs/ignite3/assets/js/6449194f.e36caf49.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6824],{28453:(e,i,n)=>{n.d(i,{R:()=>c,x:()=>o});var s=n(96540);const t={},r=s.createContext(t);function c(e){const i=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),s.createElement(r.Provider,{value:i},e.children)}},51068:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"sql/working-with-sql/index","title":"SQL Operations","description":"Execute SQL queries and work with system views in Apache Ignite 3.","source":"@site/docs/sql/working-with-sql/index.mdx","sourceDirName":"sql/working-with-sql","slug":"/sql/working-with-sql/","permalink":"/docs/ignite3/3.1.0/sql/working-with-sql/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"SQL Operations"},"sidebar":"tutorialSidebar","previous":{"title":"Engine Architecture","permalink":"/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture"},"next":{"title":"Execute Queries","permalink":"/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries"}}');var t=n(74848),r=n(28453);const c={title:"SQL Operations"},o="SQL Operations",a={},l=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const i={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components},{IIcon:n}=i;return n||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"sql-operations",children:"SQL Operations"})}),"\n",(0,t.jsx)(i.p,{children:"Execute SQL queries and work with system views in Apache Ignite 3."}),"\n",(0,t.jsx)(i.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,t.jsxs)("div",{className:"card-container",children:[(0,t.jsxs)("div",{className:"card",children:[(0,t.jsx)("div",{className:"card__header",children:(0,t.jsxs)("h3",{children:[(0,t.jsx)(n,{icon:"mdi:play-circle-outline",height:"24"})," Execute Queries"]})}),(0,t.jsx)("div",{className:"card__body",children:(0,t.jsx)("p",{children:"Run SQL from applications using prepared statements, parameter binding, and result processing."})}),(0,t.jsx)("div",{className:"card__footer",children:(0,t.jsx)("a",{href:"./working-with-sql/execute-queries",children:"Learn more \u2192"})})]}),(0,t.jsxs)("div",{className:"card",children:[(0,t.jsx)("div",{className:"card__header",children:(0,t.jsxs)("h3",{children:[(0,t.jsx)(n,{icon:"mdi:view-list-outline",height:"24"})," System Views"]})}),(0,t.jsx)("div",{className:"card__body",children:(0,t.jsx)("p",{children:"Query cluster metadata, metrics, and system information through SQL views."})}),(0,t.jsx)("div",{className:"card__footer",children:(0,t.jsx)("a",{href:"./working-with-sql/system-views",children:"Learn more \u2192"})})]})]}),"\n",(0,t.jsx)(i.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"reference",children:"SQL Reference"})," - Complete SQL language reference"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"advanced",children:"Advanced SQL"})," - Performance optimization"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"../develop",children:"Develop"})," - Build applications with SQL"]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6453b56c.98e7cfdc.js b/docs/ignite3/assets/js/6453b56c.98e7cfdc.js deleted file mode 100644 index 0512c3f48d..0000000000 --- a/docs/ignite3/assets/js/6453b56c.98e7cfdc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6891],{28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}},99491:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"developers-guide/clients/python","title":"Python Database API Driver","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/clients/python.md","sourceDirName":"developers-guide/clients","slug":"/developers-guide/clients/python","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/python","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Python Database API Driver","sidebar_label":"Python"},"sidebar":"tutorialSidebar","previous":{"title":"C++","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/cpp"},"next":{"title":"ADO.NET","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/ado"}}');var i=t(74848),o=t(28453);const s={title:"Python Database API Driver",sidebar_label:"Python"},c=void 0,a={},l=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Limitations",id:"limitations",level:3},{value:"Installation",id:"installation",level:3},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Configuring SSL for Connection",id:"configuring-ssl-for-connection",level:3},{value:"Configuring Authorization",id:"configuring-authorization",level:3},{value:"Configuring Data Access",id:"configuring-data-access",level:3},{value:"Getting Cursor Object",id:"getting-cursor-object",level:2},{value:"Executing Single Query",id:"executing-single-query",level:2},{value:"Executing a Batched Query",id:"executing-a-batched-query",level:2},{value:"Getting Query Results",id:"getting-query-results",level:2},{value:"Working with Transactions",id:"working-with-transactions",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(n.p,{children:"Apache Ignite 3 clients connect to the cluster via a standard socket connection. Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations."}),"\n",(0,i.jsxs)(n.p,{children:["Apache Ignite DB API driver uses the ",(0,i.jsx)(n.a,{href:"https://peps.python.org/pep-0249/",children:"Python Database API"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,i.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsx)(n.p,{children:"To run the Python driver, the following is required:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"CMake 3.18 or newer to build the driver"}),"\n",(0,i.jsx)(n.li,{children:"Python 3.9 or newer (3.9, 3.10, 3.11 and 3.12 are tested)"}),"\n",(0,i.jsx)(n.li,{children:"Access to a running Ignite 3 node"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,i.jsx)(n.p,{children:"Script execution of SQL statements is not supported in current release."}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"To install Python DB API driver, download it from pip."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"pip install pyignite3_dbapi\n"})}),"\n",(0,i.jsxs)(n.p,{children:["After this, you can import ",(0,i.jsx)(n.code,{children:"pyignite3_dbapi"})," into your project and use it."]}),"\n",(0,i.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,i.jsxs)(n.p,{children:["To connect to the cluster, use the ",(0,i.jsx)(n.code,{children:"connect()"})," method:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"addr = ['127.0.0.1:10800']\r\nreturn pyignite_dbapi.connect(address=addr, timeout=10)\n"})}),"\n",(0,i.jsx)(n.p,{children:"After you are done working with the cluster, remember to always close the connection to it."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"conn.close()\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, you can use the ",(0,i.jsx)(n.code,{children:"with"})," statement to automatically close the connection when no longer necessary:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"with pyignite_dbapi.connect(address=addr, timeout=10) as conn:\r\n conn.cursor()\n"})}),"\n",(0,i.jsx)(n.h3,{id:"configuring-ssl-for-connection",children:"Configuring SSL for Connection"}),"\n",(0,i.jsx)(n.p,{children:"To ensure secure connection to the cluster, you can enable SSL for it by providing the key file and certificate, for example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"def create_ssl_connection():\r\n \"\"\"Create SSL-enabled connection to GridGain cluster.\"\"\"\r\n addr = ['127.0.0.1:10800']\r\n return pyignite_dbapi.connect(\r\n address=addr,\r\n timeout=10,\r\n use_ssl=True,\r\n ssl_keyfile='',\r\n ssl_certfile='',\r\n # Optional: ssl_ca_certfile=''\r\n )\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"All paths to certificate file and keys should be provided in string format appropriate for the system."})}),"\n",(0,i.jsx)(n.h3,{id:"configuring-authorization",children:"Configuring Authorization"}),"\n",(0,i.jsxs)(n.p,{children:["If the cluster uses ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/security/authentication#basic-authentication",children:"basic authorization"}),", you need to provide user ",(0,i.jsx)(n.code,{children:"identity"})," and ",(0,i.jsx)(n.code,{children:"secret"})," to authorize on it, for example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"def create_authenticated_connection():\r\n \"\"\"Create authenticated connection to GridGain cluster.\"\"\"\r\n addr = ['127.0.0.1:10800']\r\n return pyignite_dbapi.connect(\r\n address=addr,\r\n timeout=10,\r\n identity='user',\r\n secret='password'\r\n )\n"})}),"\n",(0,i.jsx)(n.h3,{id:"configuring-data-access",children:"Configuring Data Access"}),"\n",(0,i.jsx)(n.p,{children:"You can configure optional properties to fine-tune how data is accessed."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Configuration name"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"schema"}),(0,i.jsx)(n.td,{children:"A schema name to be used by default. Default value: 'PUBLIC'."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"page_size"}),(0,i.jsx)(n.td,{children:"Maximum number of rows that can be received or sent in a single request. Default value: 1024"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"The example below shows how to set these properties:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'def create_configured_connection():\r\n """Create authenticated connection to GridGain cluster."""\r\n addr = [\'127.0.0.1:10800\']\r\n return conn = pyignite_dbapi.connect(\r\n address=addr,\r\n timeout=10,\r\n schema=\'CUSTOM\',\r\n page_size=2048\r\n )\n'})}),"\n",(0,i.jsx)(n.h2,{id:"getting-cursor-object",children:"Getting Cursor Object"}),"\n",(0,i.jsxs)(n.p,{children:["To work with tables from Python client, you use the ",(0,i.jsx)(n.code,{children:"cursor"})," object that can be retrieved from the connection object:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"conn.cursor()\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Similar to the connection, you can use the ",(0,i.jsx)(n.code,{children:"with"})," statement when getting the cursor:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"with conn.cursor() as cursor:\n"})}),"\n",(0,i.jsx)(n.h2,{id:"executing-single-query",children:"Executing Single Query"}),"\n",(0,i.jsxs)(n.p,{children:["The cursor object can be used to execute SQL statements with the ",(0,i.jsx)(n.code,{children:"execute"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"# Create table\r\ncursor.execute('''\r\n CREATE TABLE Person(\r\n id INT PRIMARY KEY,\r\n name VARCHAR,\r\n age INT\r\n )\r\n ''')\n"})}),"\n",(0,i.jsx)(n.h2,{id:"executing-a-batched-query",children:"Executing a Batched Query"}),"\n",(0,i.jsxs)(n.p,{children:["You can use the ",(0,i.jsx)(n.code,{children:"executemany"})," command to execute SQL queries with a batch of parameters. This kind of operation offers much higher performance than executing individual queries. The example below inserts two rows into the Person table:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Sample data\r\nsample_data = [\r\n [1, "John", 30],\r\n [2, "Jane", 32],\r\n [3, "Bob", 28]\r\n]\r\n\r\n# Insert data (fixed table name)\r\ncursor.executemany(\'INSERT INTO Person VALUES(?, ?, ?)\', sample_data)\n'})}),"\n",(0,i.jsx)(n.h2,{id:"getting-query-results",children:"Getting Query Results"}),"\n",(0,i.jsxs)(n.p,{children:["The cursor retains a reference to the operation. If the operation returns results (for example, a ",(0,i.jsx)(n.code,{children:"SELECT"}),"), they will also be stored in the cursor. You can then use the ",(0,i.jsx)(n.code,{children:"fetchone()"})," method to retrieve query results from the cursor:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Query data\r\ncursor.execute(\'SELECT * FROM Person ORDER BY id\')\r\nresults = cursor.fetchall()\r\n\r\nprint("All persons in database:")\r\nfor row in results:\r\n print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}")\n'})}),"\n",(0,i.jsx)(n.h2,{id:"working-with-transactions",children:"Working with Transactions"}),"\n",(0,i.jsx)(n.p,{children:"By default, transactions required for database operations are handled implicitly. However, you can disable automatic transaction handling and manually handle commits."}),"\n",(0,i.jsx)(n.p,{children:"To do this, first, disable autocommit:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"conn.autocommit = False\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once autocommit is disabled, you need to commit your operations manually:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Insert valid records\r\ncursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [4, "Alice", 29])\r\ncursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [5, "Charlie", 31])\r\n\r\ncursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [6, "Invalid", new_age])\r\n\r\nconn.commit()\r\nprint("Transaction committed successfully")\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Operations that are not committed are sent to the cluster, but not yet written to the table. The table is only updated when the ",(0,i.jsx)(n.code,{children:"commit"})," method is called. You can roll back all uncommitted operations with the ",(0,i.jsx)(n.code,{children:"rollback"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'with conn.cursor() as cursor:\r\n try:\r\n # Insert valid records\r\n cursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [4, "Alice", 29])\r\n cursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [5, "Charlie", 31])\r\n\r\n cursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [6, "Invalid", new_age])\r\n\r\n conn.commit()\r\n print("Transaction committed successfully")\r\n\r\n except Exception as e:\r\n # Rollback on any error\r\n conn.rollback()\r\n print(f"Transaction rolled back due to error: {e}")\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"rollback"})," command rolls back all uncommitted data."]})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/654e3e67.ccbfafe1.js b/docs/ignite3/assets/js/654e3e67.ccbfafe1.js deleted file mode 100644 index 31e81af227..0000000000 --- a/docs/ignite3/assets/js/654e3e67.ccbfafe1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3144],{28453:(e,r,n)=>{n.d(r,{R:()=>s,x:()=>o});var i=n(96540);const t={},a=i.createContext(t);function s(e){const r=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(a.Provider,{value:r},e.children)}},78827:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"develop/integrate/spring-data","title":"Spring Data Integration","description":"Apache Ignite 3 provides a Spring Data JDBC dialect that enables repository-based data access. Combined with Spring Boot\'s JDBC starter, this allows standard Spring Data repositories to work with Ignite tables through familiar patterns like CrudRepository and derived query methods.","source":"@site/docs/develop/integrate/spring-data.md","sourceDirName":"develop/integrate","slug":"/develop/integrate/spring-data","permalink":"/docs/ignite3/3.1.0/develop/integrate/spring-data","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"spring-data","title":"Spring Data Integration"},"sidebar":"tutorialSidebar","previous":{"title":"Spring Boot Integration","permalink":"/docs/ignite3/3.1.0/develop/integrate/spring-boot"},"next":{"title":"SQL","permalink":"/docs/ignite3/3.1.0/sql/"}}');var t=n(74848),a=n(28453);const s={id:"spring-data",title:"Spring Data Integration"},o=void 0,d={},l=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Datasource Properties",id:"datasource-properties",level:3},{value:"SQL Dialect Registration",id:"sql-dialect-registration",level:3},{value:"Application Setup",id:"application-setup",level:2},{value:"Defining Entities",id:"defining-entities",level:2},{value:"Repository Definition",id:"repository-definition",level:2},{value:"CRUD Operations",id:"crud-operations",level:2},{value:"Derived Query Methods",id:"derived-query-methods",level:2},{value:"Custom Queries",id:"custom-queries",level:2},{value:"Pagination",id:"pagination",level:2},{value:"Query by Example",id:"query-by-example",level:2},{value:"Handling Entity State",id:"handling-entity-state",level:2},{value:"Supported Features",id:"supported-features",level:2},{value:"Limitations",id:"limitations",level:2},{value:"Next Steps",id:"next-steps",level:2}];function c(e){const r={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(r.p,{children:["Apache Ignite 3 provides a Spring Data JDBC dialect that enables repository-based data access. Combined with Spring Boot's JDBC starter, this allows standard Spring Data repositories to work with Ignite tables through familiar patterns like ",(0,t.jsx)(r.code,{children:"CrudRepository"})," and derived query methods."]}),"\n",(0,t.jsx)(r.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"Java 17 or later"}),"\n",(0,t.jsx)(r.li,{children:"Spring Boot 3.x with Spring Data JDBC"}),"\n",(0,t.jsx)(r.li,{children:"Running Ignite 3 cluster"}),"\n",(0,t.jsx)(r.li,{children:"Tables created in Ignite before repository operations"}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(r.p,{children:"Spring Data integration requires three dependencies:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"spring-boot-starter-data-jdbc"})," (from Spring) provides the Spring Data JDBC framework"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"spring-data-ignite"})," (from Apache Ignite) provides the SQL dialect for Ignite-compatible query generation"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"ignite-jdbc"})," (from Apache Ignite) provides the JDBC driver for database connectivity"]}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"The Ignite artifact versions must match your Apache Ignite cluster version."}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsx)(r.strong,{children:"Maven:"})}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-xml",children:"\r\n 3.1.0\r\n\r\n\r\n\x3c!-- Spring Data JDBC framework --\x3e\r\n\r\n org.springframework.boot\r\n spring-boot-starter-data-jdbc\r\n\r\n\r\n\x3c!-- Ignite SQL dialect for Spring Data --\x3e\r\n\r\n org.apache.ignite\r\n spring-data-ignite\r\n ${ignite.version}\r\n\r\n\r\n\x3c!-- Ignite JDBC driver --\x3e\r\n\r\n org.apache.ignite\r\n ignite-jdbc\r\n ${ignite.version}\r\n\n"})}),"\n",(0,t.jsx)(r.p,{children:(0,t.jsx)(r.strong,{children:"Gradle:"})}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-groovy",children:"ext {\r\n igniteVersion = '3.1.0'\r\n}\r\n\r\n// Spring Data JDBC framework\r\nimplementation 'org.springframework.boot:spring-boot-starter-data-jdbc'\r\n\r\n// Ignite SQL dialect for Spring Data\r\nimplementation \"org.apache.ignite:spring-data-ignite:${igniteVersion}\"\r\n\r\n// Ignite JDBC driver\r\nimplementation \"org.apache.ignite:ignite-jdbc:${igniteVersion}\"\n"})}),"\n",(0,t.jsx)(r.admonition,{title:"Version Matching",type:"note",children:(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"spring-data-ignite"})," and ",(0,t.jsx)(r.code,{children:"ignite-jdbc"})," artifacts are released as part of Apache Ignite, so their versions match the Ignite release version. For Ignite 3.1.0, use version ",(0,t.jsx)(r.code,{children:"3.1.0"})," for both artifacts."]})}),"\n",(0,t.jsx)(r.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(r.h3,{id:"datasource-properties",children:"Datasource Properties"}),"\n",(0,t.jsxs)(r.p,{children:["Configure the JDBC datasource in ",(0,t.jsx)(r.code,{children:"application.properties"}),":"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-properties",children:"spring.datasource.url=jdbc:ignite:thin://localhost:10800\r\nspring.datasource.driver-class-name=org.apache.ignite.jdbc.IgniteJdbcDriver\n"})}),"\n",(0,t.jsx)(r.p,{children:"For multiple nodes:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-properties",children:"spring.datasource.url=jdbc:ignite:thin://node1:10800,node2:10800,node3:10800\n"})}),"\n",(0,t.jsx)(r.h3,{id:"sql-dialect-registration",children:"SQL Dialect Registration"}),"\n",(0,t.jsxs)(r.p,{children:["Spring Data JDBC needs to generate database-specific SQL for operations like pagination, identity columns, and certain functions. The ",(0,t.jsx)(r.code,{children:"spring-data-ignite"})," artifact includes an ",(0,t.jsx)(r.code,{children:"IgniteDialectProvider"})," that teaches Spring Data how to generate Ignite-compatible SQL."]}),"\n",(0,t.jsxs)(r.p,{children:["The dialect provider is registered via Spring's SPI mechanism. Create the file ",(0,t.jsx)(r.code,{children:"src/main/resources/META-INF/spring.factories"})," with the following content:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-properties",children:"org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=org.apache.ignite.data.IgniteDialectProvider\n"})}),"\n",(0,t.jsx)(r.p,{children:"Without this configuration, Spring Data falls back to generic ANSI SQL, which works for basic queries but may fail for database-specific operations."}),"\n",(0,t.jsx)(r.h2,{id:"application-setup",children:"Application Setup"}),"\n",(0,t.jsx)(r.p,{children:"Enable JDBC repositories in your Spring Boot application:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:"@EnableJdbcRepositories\r\n@SpringBootApplication\r\npublic class MyApplication {\r\n\r\n public static void main(String[] args) {\r\n SpringApplication.run(MyApplication.class, args);\r\n }\r\n}\n"})}),"\n",(0,t.jsx)(r.h2,{id:"defining-entities",children:"Defining Entities"}),"\n",(0,t.jsx)(r.p,{children:"Entities map to Ignite tables. Use Spring Data annotations to define the mapping:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'import org.springframework.data.annotation.Id;\r\nimport org.springframework.data.relational.core.mapping.Column;\r\nimport org.springframework.data.relational.core.mapping.Table;\r\n\r\n@Table("PERSON")\r\npublic class Person {\r\n\r\n @Id\r\n private Long id;\r\n private String name;\r\n private String email;\r\n\r\n @Column("COUNTRYCODE")\r\n private String countryCode; // Maps to COUNTRYCODE column\r\n\r\n public Person() {}\r\n\r\n public Person(Long id, String name, String email, String countryCode) {\r\n this.id = id;\r\n this.name = name;\r\n this.email = email;\r\n this.countryCode = countryCode;\r\n }\r\n\r\n // Getters and setters\r\n public Long getId() { return id; }\r\n public void setId(Long id) { this.id = id; }\r\n public String getName() { return name; }\r\n public void setName(String name) { this.name = name; }\r\n public String getEmail() { return email; }\r\n public void setEmail(String email) { this.email = email; }\r\n public String getCountryCode() { return countryCode; }\r\n public void setCountryCode(String countryCode) { this.countryCode = countryCode; }\r\n}\n'})}),"\n",(0,t.jsx)(r.p,{children:"Create the corresponding table in Ignite before using the repository:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-sql",children:"CREATE TABLE PERSON (\r\n id BIGINT PRIMARY KEY,\r\n name VARCHAR,\r\n email VARCHAR,\r\n COUNTRYCODE VARCHAR\r\n);\n"})}),"\n",(0,t.jsx)(r.p,{children:"Key annotations:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"@Table"})," maps the class to a specific table name"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"@Id"})," marks the primary key field"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"@Column"})," maps a field to a column when names differ (Java's ",(0,t.jsx)(r.code,{children:"countryCode"})," to SQL's ",(0,t.jsx)(r.code,{children:"COUNTRYCODE"}),"). Fields without ",(0,t.jsx)(r.code,{children:"@Column"})," map by convention based on field name."]}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"repository-definition",children:"Repository Definition"}),"\n",(0,t.jsxs)(r.p,{children:["Define a repository interface extending ",(0,t.jsx)(r.code,{children:"CrudRepository"}),":"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:"import org.springframework.data.repository.CrudRepository;\r\nimport org.springframework.stereotype.Repository;\r\n\r\n@Repository\r\npublic interface PersonRepository extends CrudRepository {\r\n}\n"})}),"\n",(0,t.jsx)(r.h2,{id:"crud-operations",children:"CRUD Operations"}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"CrudRepository"})," interface provides standard data access methods:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:"@Service\r\npublic class PersonService {\r\n\r\n private final PersonRepository repository;\r\n\r\n public PersonService(PersonRepository repository) {\r\n this.repository = repository;\r\n }\r\n\r\n public Person save(Person person) {\r\n return repository.save(person);\r\n }\r\n\r\n public Optional findById(Long id) {\r\n return repository.findById(id);\r\n }\r\n\r\n public Iterable findAll() {\r\n return repository.findAll();\r\n }\r\n\r\n public void deleteById(Long id) {\r\n repository.deleteById(id);\r\n }\r\n\r\n public long count() {\r\n return repository.count();\r\n }\r\n\r\n public boolean existsById(Long id) {\r\n return repository.existsById(id);\r\n }\r\n}\n"})}),"\n",(0,t.jsx)(r.h2,{id:"derived-query-methods",children:"Derived Query Methods"}),"\n",(0,t.jsx)(r.p,{children:"Spring Data generates queries from method names:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:"@Repository\r\npublic interface PersonRepository extends CrudRepository {\r\n\r\n // SELECT * FROM PERSON WHERE name = ?\r\n List findByName(String name);\r\n\r\n // SELECT * FROM PERSON WHERE name LIKE '%value%'\r\n List findByNameContains(String namePart);\r\n\r\n // SELECT * FROM PERSON WHERE email = ?\r\n Optional findByEmail(String email);\r\n\r\n // SELECT COUNT(*) FROM PERSON WHERE name = ?\r\n int countByName(String name);\r\n\r\n // SELECT CASE WHEN COUNT(*) > 0 THEN true ELSE false END FROM PERSON WHERE name = ?\r\n boolean existsByName(String name);\r\n\r\n // SELECT * FROM PERSON WHERE name IN (?, ?, ...)\r\n List findByNameIn(Collection names);\r\n}\n"})}),"\n",(0,t.jsx)(r.h2,{id:"custom-queries",children:"Custom Queries"}),"\n",(0,t.jsxs)(r.p,{children:["Use ",(0,t.jsx)(r.code,{children:"@Query"})," for explicit SQL:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'import org.springframework.data.jdbc.repository.query.Query;\r\nimport org.springframework.data.repository.query.Param;\r\n\r\n@Repository\r\npublic interface PersonRepository extends CrudRepository {\r\n\r\n @Query("SELECT * FROM PERSON WHERE name = :name AND email = :email")\r\n Optional findByNameAndEmail(@Param("name") String name, @Param("email") String email);\r\n\r\n @Query("SELECT * FROM PERSON WHERE name IN (:names)")\r\n List findByNames(@Param("names") Set names);\r\n}\n'})}),"\n",(0,t.jsx)(r.h2,{id:"pagination",children:"Pagination"}),"\n",(0,t.jsx)(r.p,{children:"Spring Data supports paginated queries:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:"import org.springframework.data.domain.Page;\r\nimport org.springframework.data.domain.Pageable;\r\nimport org.springframework.data.domain.Slice;\r\n\r\n@Repository\r\npublic interface PersonRepository extends CrudRepository {\r\n\r\n // Returns Page with total count\r\n Page findByNameContains(String namePart, Pageable pageable);\r\n\r\n // Returns Slice without total count (more efficient for large datasets)\r\n Slice findSliceByNameContains(String namePart, Pageable pageable);\r\n}\n"})}),"\n",(0,t.jsx)(r.p,{children:"Usage:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'@Service\r\npublic class PersonService {\r\n\r\n private final PersonRepository repository;\r\n\r\n public PersonService(PersonRepository repository) {\r\n this.repository = repository;\r\n }\r\n\r\n public Page getPage(String namePart, int page, int size) {\r\n PageRequest pageRequest = PageRequest.of(page, size, Sort.by("name"));\r\n return repository.findByNameContains(namePart, pageRequest);\r\n }\r\n\r\n public void processAllPersons(String namePart) {\r\n Pageable pageable = PageRequest.of(0, 100);\r\n Slice slice;\r\n\r\n do {\r\n slice = repository.findSliceByNameContains(namePart, pageable);\r\n slice.getContent().forEach(this::process);\r\n pageable = slice.nextPageable();\r\n } while (slice.hasNext());\r\n }\r\n\r\n private void process(Person person) {\r\n // Process person\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.h2,{id:"query-by-example",children:"Query by Example"}),"\n",(0,t.jsxs)(r.p,{children:["For dynamic queries based on entity instances, extend ",(0,t.jsx)(r.code,{children:"QueryByExampleExecutor"}),":"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:"import org.springframework.data.repository.query.QueryByExampleExecutor;\r\n\r\n@Repository\r\npublic interface PersonRepository extends CrudRepository, QueryByExampleExecutor {\r\n}\n"})}),"\n",(0,t.jsx)(r.p,{children:"Usage:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'import org.springframework.data.domain.Example;\r\nimport org.springframework.data.domain.ExampleMatcher;\r\n\r\n@Service\r\npublic class PersonService {\r\n\r\n private final PersonRepository repository;\r\n\r\n public PersonService(PersonRepository repository) {\r\n this.repository = repository;\r\n }\r\n\r\n public List findByExample(String name, String email) {\r\n Person probe = new Person();\r\n probe.setName(name);\r\n probe.setEmail(email);\r\n\r\n // Match non-null properties\r\n Example example = Example.of(probe);\r\n return (List) repository.findAll(example);\r\n }\r\n\r\n public List findByNameStartsWith(String prefix) {\r\n Person probe = new Person();\r\n probe.setName(prefix);\r\n\r\n ExampleMatcher matcher = ExampleMatcher.matching()\r\n .withMatcher("name", ExampleMatcher.GenericPropertyMatchers.startsWith())\r\n .withIgnorePaths("id", "email");\r\n\r\n Example example = Example.of(probe, matcher);\r\n return (List) repository.findAll(example);\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.h2,{id:"handling-entity-state",children:"Handling Entity State"}),"\n",(0,t.jsxs)(r.p,{children:["Ignite tables do not auto-generate IDs. Implement ",(0,t.jsx)(r.code,{children:"Persistable"})," to control insert vs update behavior:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:"import org.springframework.data.annotation.Id;\r\nimport org.springframework.data.annotation.Transient;\r\nimport org.springframework.data.domain.Persistable;\r\n\r\npublic class Person implements Persistable {\r\n\r\n @Id\r\n private Long id;\r\n private String name;\r\n\r\n @Transient\r\n private boolean isNew = true;\r\n\r\n @Override\r\n public Long getId() {\r\n return id;\r\n }\r\n\r\n @Override\r\n public boolean isNew() {\r\n return isNew;\r\n }\r\n\r\n public void setNew(boolean newValue) {\r\n this.isNew = newValue;\r\n }\r\n\r\n // After loading from database, mark as not new\r\n public void markNotNew() {\r\n this.isNew = false;\r\n }\r\n\r\n // Other getters and setters\r\n}\n"})}),"\n",(0,t.jsx)(r.p,{children:"When updating an existing entity:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'Person person = repository.findById(1L).orElseThrow();\r\nperson.setName("Updated Name");\r\nperson.setNew(false); // Prevents INSERT, performs UPDATE\r\nrepository.save(person);\n'})}),"\n",(0,t.jsx)(r.h2,{id:"supported-features",children:"Supported Features"}),"\n",(0,t.jsx)(r.p,{children:"The Ignite dialect supports:"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Feature"}),(0,t.jsx)(r.th,{children:"Status"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"CrudRepository"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"PagingAndSortingRepository"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"QueryByExampleExecutor"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Derived query methods"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"@Query annotations"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Page and Slice"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Sort"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Limit"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Enum types"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Array columns"}),(0,t.jsx)(r.td,{children:"Supported"})]})]})]}),"\n",(0,t.jsx)(r.h2,{id:"limitations",children:"Limitations"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"Ignite does not auto-generate primary keys. Provide ID values explicitly."}),"\n",(0,t.jsxs)(r.li,{children:["Locking clauses (",(0,t.jsx)(r.code,{children:"@Lock"}),") are not supported. The dialect returns empty lock clauses."]}),"\n",(0,t.jsx)(r.li,{children:"Single query loading for related entities is not supported. Related entities require separate queries."}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.a,{href:"./spring-boot",children:"Spring Boot Integration"})," - Auto-configured IgniteClient"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.a,{href:"../connect-to-ignite/jdbc",children:"JDBC Driver"})," - JDBC connection details"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.a,{href:"../../sql",children:"SQL Reference"})," - SQL syntax for table creation"]}),"\n"]})]})}function p(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6686d628.4981666f.js b/docs/ignite3/assets/js/6686d628.4981666f.js deleted file mode 100644 index bdd12c0e67..0000000000 --- a/docs/ignite3/assets/js/6686d628.4981666f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2233],{28453:(e,r,t)=>{t.d(r,{R:()=>o,x:()=>c});var n=t(96540);const s={},i=n.createContext(s);function o(e){const r=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(i.Provider,{value:r},e.children)}},92188:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"configure-and-operate/configuration/metrics-configuration","title":"Configuring Metrics","description":"Metric management is performed through the Ignite CLI tool.","source":"@site/docs/configure-and-operate/configuration/metrics.md","sourceDirName":"configure-and-operate/configuration","slug":"/configure-and-operate/configuration/metrics-configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"metrics-configuration","title":"Configuring Metrics","sidebar_label":"Metrics"},"sidebar":"tutorialSidebar","previous":{"title":"SSL/TLS","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls"},"next":{"title":"Cluster Security","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security"}}');var s=t(74848),i=t(28453);const o={id:"metrics-configuration",title:"Configuring Metrics",sidebar_label:"Metrics"},c=void 0,l={},d=[{value:"Listing Metric Sources",id:"listing-metric-sources",level:2},{value:"Listing Metrics",id:"listing-metrics",level:2},{value:"Enabling Metric Sources",id:"enabling-metric-sources",level:2},{value:"Disabling Metric Sources",id:"disabling-metric-sources",level:2},{value:"Configuring Metrics Exporters",id:"configuring-metrics-exporters",level:2},{value:"JMX",id:"jmx",level:3},{value:"Log Exporter",id:"log-exporter",level:3},{value:"OpenTelemetry",id:"opentelemetry",level:3},{value:"Connection to Grafana",id:"connection-to-grafana",level:4},{value:"Connection to Prometheus",id:"connection-to-prometheus",level:4}];function a(e){const r={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(r.p,{children:["Metric management is performed through the ",(0,s.jsx)(r.a,{href:"/3.1.0/tools/cli-commands",children:"Ignite CLI tool"}),"."]}),"\n",(0,s.jsx)(r.h2,{id:"listing-metric-sources",children:"Listing Metric Sources"}),"\n",(0,s.jsx)(r.p,{children:"You can list all available metric sources for a node or for the entire cluster."}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"node metric source list\r\ncluster metric source list\n"})}),"\n",(0,s.jsx)(r.h2,{id:"listing-metrics",children:"Listing Metrics"}),"\n",(0,s.jsx)(r.p,{children:"You can list all metrics for a node."}),"\n",(0,s.jsx)(r.admonition,{type:"note",children:(0,s.jsxs)(r.p,{children:["To see the list of metrics, you need to enable the relevant metric sources, see ",(0,s.jsx)(r.a,{href:"#enabling-metric-sources",children:"Enabling Metric Sources"}),"."]})}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"node metric list\n"})}),"\n",(0,s.jsx)(r.p,{children:"The above command returns the list of all currently available metrics organized with their exporters."}),"\n",(0,s.jsx)(r.h2,{id:"enabling-metric-sources",children:"Enabling Metric Sources"}),"\n",(0,s.jsx)(r.p,{children:"Metric collection might affect the performance of an application. Therefore, by default, all metric sources are disabled."}),"\n",(0,s.jsx)(r.p,{children:"Metric sources can be enabled:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:["On per-node basis: you can specify the node to interact with by using the ",(0,s.jsx)(r.code,{children:"-u"})," parameter to specify node URL or ",(0,s.jsx)(r.code,{children:"-n"})," parameter to specify node name."]}),"\n",(0,s.jsx)(r.li,{children:"For the entire cluster."}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"For example:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"node metric source enable -n=defaultNode jvm\r\ncluster metric source enable jvm\n"})}),"\n",(0,s.jsx)(r.h2,{id:"disabling-metric-sources",children:"Disabling Metric Sources"}),"\n",(0,s.jsx)(r.p,{children:"Metric sources can be disabled:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:["On per-node basis: you can specify the node to interact with by using the ",(0,s.jsx)(r.code,{children:"-u"})," parameter to specify node URL or ",(0,s.jsx)(r.code,{children:"-n"})," parameter to specify node name."]}),"\n",(0,s.jsx)(r.li,{children:"For the entire cluster."}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"For example:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"node metric source disable -n=defaultNode jvm\r\ncluster metric source disable jvm\n"})}),"\n",(0,s.jsx)(r.h2,{id:"configuring-metrics-exporters",children:"Configuring Metrics Exporters"}),"\n",(0,s.jsx)(r.p,{children:"To access the collected metrics with external tools, you need to configure metrics exporters."}),"\n",(0,s.jsx)(r.h3,{id:"jmx",children:"JMX"}),"\n",(0,s.jsx)(r.p,{children:"The JMX exporter provides information about Ignite nodes in JMX(Java Management Extensions) format. When the exporter is enabled, the node exposes the metrics to monitoring tools."}),"\n",(0,s.jsx)(r.p,{children:"You can enable the JMX exporter in the following way:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"cluster config update ignite.metrics.exporters.myJmxExporter.exporterName=jmx\n"})}),"\n",(0,s.jsx)(r.p,{children:"After you do, JMX monitoring tools will be able to collect enabled metrics from the specified nodes."}),"\n",(0,s.jsx)(r.p,{children:"You can also open internal JDK modules required for JMX, enable the remote JMX agent, configure the connection port, authentication, and SSL. Add the following JVM options to your Ignite node configuration:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED\r\n\r\n-Dcom.sun.management.jmxremote\r\n-Dcom.sun.management.jmxremote.port=\r\n-Dcom.sun.management.jmxremote.authenticate=true|false\r\n-Dcom.sun.management.jmxremote.ssl=true|false\n"})}),"\n",(0,s.jsx)(r.h3,{id:"log-exporter",children:"Log Exporter"}),"\n",(0,s.jsx)(r.p,{children:"Log exporter writes metrics data to the application log, so they can be consumed by log collectors or inspected manually. To configure it, use the following parameters:"}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Description"}),(0,s.jsx)(r.th,{children:"Default value"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"periodMillis"}),(0,s.jsx)(r.td,{children:"Export interval for the metrics, in milliseconds."}),(0,s.jsx)(r.td,{children:"30000"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"oneLinePerMetricSource"}),(0,s.jsx)(r.td,{children:"Define whether to print all metrics from one metric source on a single log line."}),(0,s.jsx)(r.td,{children:"true"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"enabledMetrics"}),(0,s.jsxs)(r.td,{children:["List of enabled metric sources. If this list is non-empty, only the listed metric sources will be printed, all others will be skipped. A wildcard can be used to match a prefix (for example, ",(0,s.jsx)(r.code,{children:"jvm.*"}),"). By default, the metrics of some background activities are printed."]}),(0,s.jsx)(r.td,{children:'"metastorage", "placement-driver", "resource.vacuum"'})]})]})]}),"\n",(0,s.jsxs)(r.p,{children:["To add log exporter to cluster exporters list, run the following command and define all the metrics to print in ",(0,s.jsx)(r.code,{children:"enabledMetrics"})," list:"]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:'cluster config update ignite.metrics.exporters.logPush \'{"exporterName":"logPush","periodMillis":30000,"oneLinePerMetricSource":true,"enabledMetrics":[]}\'\n'})}),"\n",(0,s.jsx)(r.p,{children:"Updated exporters configuration should look like this:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-hocon",children:"exporters=[\r\n {\r\n enabledMetrics=[]\r\n exporterName=logPush\r\n name=logPush\r\n oneLinePerMetricSource=true\r\n periodMillis=30000\r\n }\r\n]\n"})}),"\n",(0,s.jsx)(r.h3,{id:"opentelemetry",children:"OpenTelemetry"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.a,{href:"https://opentelemetry.io/",children:"OpenTelemetry"})," exporter connects to an OpenTelemetry service that is provided in configuration and sends cluster information to it. Each node sends metrics independently, and requires access to the specified endpoint."]}),"\n",(0,s.jsx)(r.p,{children:"The example below shows the basic OpenTelemetry configuration. As OpenTelemetry services require different URL formats and may require headers, this example may not work for your environment."}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:'cluster config update ignite.metrics.exporters.test: {exporterName:otlp, endpoint:"http://localhost:9090/api/v1/otlp/v1/metrics", protocol:"http/protobuf"}\n'})}),"\n",(0,s.jsx)(r.p,{children:"OpenTelemetry exporter created by this command will look like this:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-hocon",children:'{\r\n compression=gzip\r\n endpoint="http://localhost:9090/api/v1/otlp/v1/metrics"\r\n exporterName=otlp\r\n headers=[]\r\n name=test\r\n periodMillis=30000\r\n protocol="http/protobuf"\r\n ssl {\r\n ciphers=""\r\n clientAuth=none\r\n enabled=false\r\n keyStore {\r\n password="********"\r\n path=""\r\n type=PKCS12\r\n }\r\n trustStore {\r\n password="********"\r\n path=""\r\n type=PKCS12\r\n }\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(r.p,{children:"Below are the descriptions of configuration parameters:"}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Description"}),(0,s.jsx)(r.th,{children:"Default value"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"compression"}),(0,s.jsxs)(r.td,{children:["How the payload is compressed. Possible values: ",(0,s.jsx)(r.code,{children:"none"}),", ",(0,s.jsx)(r.code,{children:"gzip"}),"."]}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"gzip"})})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"endpoint"}),(0,s.jsx)(r.td,{children:"The OpenTelemetry endpoint. Each node resolves the endpoint individually."}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"exporterName"}),(0,s.jsxs)(r.td,{children:["Exporter name. Must be ",(0,s.jsx)(r.code,{children:"otlp"})," to use OpenTelemetry."]}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"headers"}),(0,s.jsx)(r.td,{children:"Request headers, if any."}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"name"}),(0,s.jsx)(r.td,{children:"User-defined exporter name, used to refer to it in Ignite."}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"periodMillis"}),(0,s.jsx)(r.td,{children:"Export interval for the metrics, in milliseconds."}),(0,s.jsx)(r.td,{children:"30000"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"protocol"}),(0,s.jsxs)(r.td,{children:["The protocol that is used to send OpenTelemetry data. Possible values: ",(0,s.jsx)(r.code,{children:"grpc"}),", ",(0,s.jsx)(r.code,{children:"http/protobuf"}),"."]}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"grpc"})})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ssl.ciphers"}),(0,s.jsx)(r.td,{children:"List of ciphers to enable, comma-separated. Empty for automatic cipher selection."}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ssl.clientAuth"}),(0,s.jsx)(r.td,{children:"Whether the SSL client authentication is enabled and whether it is mandatory."}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ssl.enabled"}),(0,s.jsx)(r.td,{children:"Defines if SSL is enabled."}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"false"})})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ssl.keyStore.password"}),(0,s.jsx)(r.td,{children:"SSL keystore password."}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ssl.keyStore.path"}),(0,s.jsx)(r.td,{children:"Path to the SSL keystore."}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ssl.keyStore.type"}),(0,s.jsx)(r.td,{children:"Keystore type."}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"PKCS12"})})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ssl.trustStore.password"}),(0,s.jsx)(r.td,{children:"Truststore password."}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ssl.trustStore.path"}),(0,s.jsx)(r.td,{children:"Path to the truststore."}),(0,s.jsx)(r.td,{})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ssl.trustStore.type"}),(0,s.jsx)(r.td,{children:"Truststore type."}),(0,s.jsx)(r.td,{children:(0,s.jsx)(r.code,{children:"PKCS12"})})]})]})]}),"\n",(0,s.jsx)(r.h4,{id:"connection-to-grafana",children:"Connection to Grafana"}),"\n",(0,s.jsx)(r.p,{children:"When connecting to Grafana Cloud, you need to use the protobuf protocol and pass the authorization header in the configuration:"}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-shell",children:'cluster config update ignite.metrics.exporters.test: {exporterName:otlp, endpoint:"https://otlp-gateway-prod-eu-west-2.grafana.net/otlp", protocol:"http/protobuf", headers {Authorization.header="Basic myBasicAuthKey"}}\n'})}),"\n",(0,s.jsx)(r.h4,{id:"connection-to-prometheus",children:"Connection to Prometheus"}),"\n",(0,s.jsxs)(r.p,{children:["When connecting to Prometheus, you need to use the protobuf protocol and send metrics to the ",(0,s.jsx)(r.code,{children:"/api/v1/otlp/v1/metrics"})," after the OTLP metrics receiver is enabled as described in ",(0,s.jsx)(r.a,{href:"https://prometheus.io/docs/guides/opentelemetry/",children:"Prometheus documentation"}),":"]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-shell",children:'cluster config update ignite.metrics.exporters.test: {exporterName:otlp, endpoint:"http://localhost:9090/api/v1/otlp/v1/metrics", protocol:"http/protobuf"}\n'})})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/66b63dfc.26600d95.js b/docs/ignite3/assets/js/66b63dfc.26600d95.js deleted file mode 100644 index db28faae15..0000000000 --- a/docs/ignite3/assets/js/66b63dfc.26600d95.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5083],{28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>s});var i=t(96540);const o={},r=i.createContext(o);function a(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(r.Provider,{value:n},e.children)}},29292:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>g,frontMatter:()=>a,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"getting-started/best-practices","title":"Configuration Tips","description":"Configuring Default Cluster Storage","source":"@site/docs/getting-started/best-practices.md","sourceDirName":"getting-started","slug":"/getting-started/best-practices","permalink":"/docs/ignite3/3.1.0/getting-started/best-practices","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Configuration Tips"},"sidebar":"tutorialSidebar","previous":{"title":"Embedded Mode","permalink":"/docs/ignite3/3.1.0/getting-started/embedded-mode"},"next":{"title":"Migrating from Ignite 2","permalink":"/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2"}}');var o=t(74848),r=t(28453);const a={title:"Configuration Tips"},s=void 0,l={},d=[{value:"Configuring Default Cluster Storage",id:"configuring-default-cluster-storage",level:2},{value:"Configuring Local Paths",id:"configuring-local-paths",level:2},{value:"Configuring Heap Usage",id:"configuring-heap-usage",level:2},{value:"Configuring Server Logging",id:"configuring-server-logging",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"configuring-default-cluster-storage",children:"Configuring Default Cluster Storage"}),"\n",(0,o.jsx)(n.p,{children:"When a cluster is created, the default distribution zone is used for storage configuration. While we recommend creating distribution zones for your clusters, you can still use the default zone and configure it to suit your needs."}),"\n",(0,o.jsxs)(n.p,{children:["To get default storage configuration, use the ",(0,o.jsx)(n.code,{children:"cluster config show ignite.zone"})," command. Below is an example of the default configuration in the JSON format."]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsx)(n.p,{children:"In Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "zone" : {\r\n "defaultDataStorage" : "aipersist",\r\n "defaultDistributionZone" : {\r\n "dataNodesAutoAdjustScaleDown" : 2147483647,\r\n "dataNodesAutoAdjustScaleUp" : 0,\r\n "dataStorage" : {\r\n "dataRegion" : "default",\r\n "name" : "aipersist"\r\n },\r\n "filter" : "$..*",\r\n "partitions" : 25,\r\n "replicas" : 1,\r\n "zoneId" : 0\r\n },\r\n "distributionZones" : [ ],\r\n "globalIdCounter" : 0\r\n }\r\n }\r\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["To change the type of storage used for new distribution zones, change the ",(0,o.jsx)(n.code,{children:"zone.defaultDataStorage"})," value to ",(0,o.jsx)(n.code,{children:"aimem"})," or ",(0,o.jsx)(n.code,{children:"rocksDb"}),". You can also change the default data region used for new distribution zones by setting the ",(0,o.jsx)(n.code,{children:"zone.defaultDistributionZone.dataStorage.dataRegion"})," parameter. You will need to restart the cluster after changing the data region parameters."]}),"\n",(0,o.jsxs)(n.p,{children:["You can also change these properties for ",(0,o.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"distribution zones"})," you have created for yourself."]}),"\n",(0,o.jsxs)(n.p,{children:["You can get information about the data region by using the ",(0,o.jsx)(n.code,{children:"cluster config show ignite.aipersist"})," CLI command. Here is how the default data region may look like:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "checkpoint" : {\r\n "checkpointDelayMillis" : 200,\r\n "checkpointThreads" : 4,\r\n "compactionThreads" : 4,\r\n "frequency" : 180000,\r\n "frequencyDeviation" : 40,\r\n "logReadLockThresholdTimeoutMillis" : 0,\r\n "readLockTimeoutMillis" : 10000,\r\n "useAsyncFileIoFactory" : true\r\n },\r\n "defaultRegion" : {\r\n "memoryAllocator" : {\r\n "type" : "unsafe"\r\n },\r\n "replacementMode" : "CLOCK",\r\n "size" : 268435456\r\n },\r\n "pageSizeBytes" : 16384,\r\n "regions" : [ ]\r\n }\r\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["To change the size of the default region, use the ",(0,o.jsx)(n.code,{children:"cluster config update"})," command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-shell",children:"cluster config update --url http://localhost:10300 ignite.aipersist.defaultRegion.size:9999999\n"})}),"\n",(0,o.jsx)(n.h2,{id:"configuring-local-paths",children:"Configuring Local Paths"}),"\n",(0,o.jsxs)(n.p,{children:["By default, all files generated by Ignite are stored in the installation folder. However, depending on your environment, you may need to change the path to your files. You can use the ",(0,o.jsx)(n.code,{children:"{IGNITE_HOME}\\etc\\vars.env"})," file to change the storage paths of your files. You can change paths to the following:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Work directory, where data is stored."}),"\n",(0,o.jsx)(n.li,{children:"Log folder, where logs are placed."}),"\n",(0,o.jsx)(n.li,{children:"The folder from which libraries are loaded."}),"\n",(0,o.jsx)(n.li,{children:"The configuration file that is used to set up the default node."}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Additionally, in the node configuration you can set:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["The location CMG information is stored to by setting the ",(0,o.jsx)(n.code,{children:"ignite.system.cmgPath"})," property."]}),"\n",(0,o.jsxs)(n.li,{children:["The location metastorage information is stored to by setting the ",(0,o.jsx)(n.code,{children:"ignite.system.metastoragePath"})," property."]}),"\n",(0,o.jsxs)(n.li,{children:["The location data partitions are stored in by setting the ",(0,o.jsx)(n.code,{children:"ignite.system.partitionsBasePath"})," property."]}),"\n",(0,o.jsxs)(n.li,{children:["The location RAFT logs are stored in by setting the ",(0,o.jsx)(n.code,{children:"ignite.system.partitionsLogPath"})," property. These logs are separate from node logs."]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"configuring-heap-usage",children:"Configuring Heap Usage"}),"\n",(0,o.jsxs)(n.p,{children:["Ignite stores data in off-heap memory, reserved individually for each ",(0,o.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-storage-overview",children:"storage engine"})," as required. However, Java Heap memory is still used to handle intermediary objects generated by workloads. For example:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Cluster and node metadata. This includes information about what nodes are part of the cluster, internal logs, table ",(0,o.jsx)(n.a,{href:"/3.1.0/understand/core-concepts/data-partitioning#version-storage",children:"version chains"}),", what keys are locked for transactions, and all other information required for Ignite to operate normally."]}),"\n",(0,o.jsx)(n.li,{children:"Intermediary query results. This may lead to needing more heap memory when executing queries on especially large data sets."}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/compute",children:"Compute"})," operations are likely to use heap memory to store data. Specific requirements for compute jobs vary depending on what job is being performed."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"By default, Ignite allocates 16GB to heap storage. Depending on your environment and workload, you may want to change this value. Smaller heap would mean faster garbage collection, and less resources allocated to Ignite. Larger heap allows to handle more objects, but garbage collection may take longer."}),"\n",(0,o.jsxs)(n.p,{children:["To configure allocated heap, you can use the ",(0,o.jsx)(n.code,{children:"JVM_MAX_MEM"})," and ",(0,o.jsx)(n.code,{children:"JVM_MIN_MEM"})," variables stored in the ",(0,o.jsx)(n.code,{children:"{IGNITE_HOME}\\etc\\vars.env"})," file. These variables are the equivalent of setting the ",(0,o.jsx)(n.code,{children:"Xmx"})," and ",(0,o.jsx)(n.code,{children:"Xms"})," variables in JVM."]}),"\n",(0,o.jsx)(n.h2,{id:"configuring-server-logging",children:"Configuring Server Logging"}),"\n",(0,o.jsxs)(n.p,{children:["By default, Ignite 3 uses the ",(0,o.jsx)(n.code,{children:"java.util.logging"})," (JUL) logging framework. It utilizes the ",(0,o.jsx)(n.code,{children:"etc/ignite.java.util.logging.properties"})," configuration and outputs logs to the folder the ",(0,o.jsx)(n.code,{children:"LOG_DIR"})," variable points to (can be configured in the ",(0,o.jsx)(n.code,{children:"etc/vars.env"})," file). By default, logs are stored in the ",(0,o.jsx)(n.code,{children:"{IGNITE_HOME}/log"})," folder. You can provide a custom configuration file using the ",(0,o.jsx)(n.code,{children:"java.util.logging.config.file"})," property."]}),"\n",(0,o.jsxs)(n.p,{children:["For more information on configuring JUL logging, see the ",(0,o.jsx)(n.a,{href:"https://docs.oracle.com/en/java/javase/11/core/java-logging-overview.html",children:"Java Logging Overview"})," in Oracle documentation."]}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["You can also configure client logging for the ",(0,o.jsx)(n.a,{href:"/3.1.0/develop/ignite-clients/java-client",children:"Java client"}),"."]})})]})}function g(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/66cd9110.b71aa02d.js b/docs/ignite3/assets/js/66cd9110.b71aa02d.js deleted file mode 100644 index 3b75a2e1b1..0000000000 --- a/docs/ignite3/assets/js/66cd9110.b71aa02d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8275],{28453:(e,d,s)=>{s.d(d,{R:()=>r,x:()=>h});var t=s(96540);const i={},n=t.createContext(i);function r(e){const d=t.useContext(n);return t.useMemo(function(){return"function"==typeof e?e(d):{...d,...e}},[d,e])}function h(e){let d;return d=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(n.Provider,{value:d},e.children)}},45100:(e,d,s)=>{s.r(d),s.d(d,{assets:()=>l,contentTitle:()=>h,default:()=>j,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"configure-and-operate/monitoring/metrics-system-views","title":"System Views","description":"Ignite provides a number of built-in SQL views that provide information on the cluster\'s state and provide real-time insight into the status of its components. These views are available in the SYSTEM schema.","source":"@site/docs/configure-and-operate/monitoring/metrics-system-views.md","sourceDirName":"configure-and-operate/monitoring","slug":"/configure-and-operate/monitoring/metrics-system-views","permalink":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"metrics-system-views","title":"System Views","sidebar_label":"System Views"},"sidebar":"tutorialSidebar","previous":{"title":"Available Metrics","permalink":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics"},"next":{"title":"Configuration Reference","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/"}}');var i=s(74848),n=s(28453);const r={id:"metrics-system-views",title:"System Views",sidebar_label:"System Views"},h=void 0,l={},c=[{value:"Getting Data",id:"getting-data",level:2},{value:"Available Views",id:"available-views",level:2},{value:"COMPUTE_TASKS",id:"compute_tasks",level:3},{value:"GLOBAL_PARTITION_STATES",id:"global_partition_states",level:3},{value:"GLOBAL_ZONE_PARTITION_STATES",id:"global_zone_partition_states",level:3},{value:"INDEXES",id:"indexes",level:3},{value:"INDEX_COLUMNS",id:"index_columns",level:3},{value:"LOCAL_ZONE_PARTITION_STATES",id:"local_zone_partition_states",level:3},{value:"LOCKS",id:"locks",level:3},{value:"LOCAL_PARTITION_STATES",id:"local_partition_states",level:3},{value:"SCHEMAS",id:"schemas",level:3},{value:"SQL_QUERIES",id:"sql_queries",level:3},{value:"SQL_CACHED_QUERY_PLANS",id:"sql_cached_query_plans",level:3},{value:"SYSTEM_VIEWS",id:"system_views",level:3},{value:"SYSTEM_VIEW_COLUMNS",id:"system_view_columns",level:3},{value:"TABLES",id:"tables",level:3},{value:"TABLE_COLUMNS",id:"table_columns",level:3},{value:"TRANSACTIONS",id:"transactions",level:3},{value:"ZONES",id:"zones",level:3},{value:"ZONE_STORAGE_PROFILES",id:"zone_storage_profiles",level:3}];function x(e){const d={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(d.p,{children:"Ignite provides a number of built-in SQL views that provide information on the cluster's state and provide real-time insight into the status of its components. These views are available in the SYSTEM schema."}),"\n",(0,i.jsx)(d.h2,{id:"getting-data",children:"Getting Data"}),"\n",(0,i.jsx)(d.p,{children:"You access system views in Ignite by using SQL and selecting data from the system view like you would from any other table. For example, you can get a list of all available system views in the following way:"}),"\n",(0,i.jsx)(d.pre,{children:(0,i.jsx)(d.code,{className:"language-sql",children:"SELECT * FROM system.system_views\n"})}),"\n",(0,i.jsxs)(d.p,{children:["You can also use joins to combine data from multiple views. The example below returns all columns of a view that was found in the ",(0,i.jsx)(d.code,{children:"SYSTEM_VIEWS"})," view:"]}),"\n",(0,i.jsx)(d.pre,{children:(0,i.jsx)(d.code,{className:"language-sql",children:"SELECT svc.*\r\n FROM system.system_view_columns svc\r\n JOIN system.system_views sv ON svc.view_id = sv.id\r\n WHERE sv.name = 'SYSTEM_VIEWS'\n"})}),"\n",(0,i.jsx)(d.h2,{id:"available-views",children:"Available Views"}),"\n",(0,i.jsx)(d.h3,{id:"compute_tasks",children:"COMPUTE_TASKS"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COORDINATOR_NODE_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The task's coordinator node ID."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COMPUTE_TASK_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The compute task ID."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COMPUTE_TASK_STATUS"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The task status."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COMPUTE_TASK_CREATE_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,i.jsx)(d.td,{children:"The task creation timestamp."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COMPUTE_TASK_START_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,i.jsx)(d.td,{children:"The task start timestamp."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COMPUTE_TASK_FINISH_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,i.jsx)(d.td,{children:"The task finish timestamp."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The compute task ID."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"STATUS"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The task status."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"CREATE_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The task creation timestamp."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"START_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The task start timestamp."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"FINISH_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The task finish timestamp."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"global_partition_states",children:"GLOBAL_PARTITION_STATES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the distribution zone the partition belongs to."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The ID of the table stored in the partition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the schema the table belongs to."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the table stored in the partition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARTITION_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The unique identifier of the partition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARTITION_STATE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["Partition status. Possible values: ",(0,i.jsx)(d.code,{children:"AVAILABLE"}),", ",(0,i.jsx)(d.code,{children:"DEGRADED"}),", ",(0,i.jsx)(d.code,{children:"READ_ONLY"}),", ",(0,i.jsx)(d.code,{children:"UNAVAILABLE"}),". See ",(0,i.jsx)(d.a,{href:"/3.1.0/configure-and-operate/operations/disaster-recovery-partitions",children:"Disaster Recovery"})," documentation for more information."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique zone identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique schema identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"STATE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Partition status. Possible values: ",(0,i.jsx)(d.code,{children:"AVAILABLE"}),", ",(0,i.jsx)(d.code,{children:"DEGRADED"}),", ",(0,i.jsx)(d.code,{children:"READ_ONLY"}),", ",(0,i.jsx)(d.code,{children:"UNAVAILABLE"}),"."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"global_zone_partition_states",children:"GLOBAL_ZONE_PARTITION_STATES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Name of the zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Internal identifier of the zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARTITION_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Identifier of the partition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARTITION_STATE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["Current state of the partition. Possible values: ",(0,i.jsx)(d.code,{children:"AVAILABLE"})," (All replicas are healthy), ",(0,i.jsx)(d.code,{children:"DEGRADED"})," (There are healthy replicas, and they form a majority), ",(0,i.jsx)(d.code,{children:"READ_ONLY"})," (There are healthy replicas, but they don't form a majority), ",(0,i.jsx)(d.code,{children:"UNAVAILABLE"})," (There are no healthy replicas)."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"indexes",children:"INDEXES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"INDEX_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique index identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"INDEX_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the index."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique table identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the table."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique schema identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the schema."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"INDEX_TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["The type of the index. Possible values: ",(0,i.jsx)(d.code,{children:"HASH"}),", ",(0,i.jsx)(d.code,{children:"SORTED"}),"."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"IS_UNIQUE_INDEX"}),(0,i.jsx)(d.td,{children:"BOOLEAN"}),(0,i.jsx)(d.td,{children:"If the index is unique."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"INDEX_COLUMNS"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The list of indexed columns."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"INDEX_STATE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["Current status of the index. Possible values: ",(0,i.jsx)(d.code,{children:"REGISTERED"})," (Index has been registered and is awaiting the start of building), ",(0,i.jsx)(d.code,{children:"BUILDING"})," (Index is being built), ",(0,i.jsx)(d.code,{children:"AVAILABLE"})," (Index is built and is ready to use), ",(0,i.jsx)(d.code,{children:"STOPPING"})," (DROP INDEX command has been executed, index is waiting for running transactions to finish)."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The type of the index. Possible values: ",(0,i.jsx)(d.code,{children:"HASH"}),", ",(0,i.jsx)(d.code,{children:"SORTED"}),"."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"IS_UNIQUE"}),(0,i.jsx)(d.td,{children:"BOOLEAN"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". If the index is unique."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMNS"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The list of indexed columns."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"STATUS"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Current status of the index."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"index_columns",children:"INDEX_COLUMNS"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique schema identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the schema."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique table identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the table."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"INDEX_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique index identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"INDEX_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the index."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Column name."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_ORDINAL"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The ordinal number of the column in the index definition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_COLLATION"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Collation rules for the column."})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"local_zone_partition_states",children:"LOCAL_ZONE_PARTITION_STATES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"NODE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Name of the node reporting the partition state."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Name of the zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Internal identifier of the zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ESTIMATED_ROWS"}),(0,i.jsx)(d.td,{children:"INT64"}),(0,i.jsx)(d.td,{children:"Approximate number of rows stored in this partition on the local node."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARTITION_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Identifier of the partition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARTITION_STATE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["Current state of the local partition. Possible values: ",(0,i.jsx)(d.code,{children:"UNAVAILABLE"})," (Partition is not yet started or is stopping), ",(0,i.jsx)(d.code,{children:"HEALTHY"})," (Alive partition with a healthy state machine), ",(0,i.jsx)(d.code,{children:"INITIALIZING"})," (Partition is starting right now), ",(0,i.jsx)(d.code,{children:"INSTALLING_SNAPSHOT"})," (Partition is installing a Raft snapshot from the leader), ",(0,i.jsx)(d.code,{children:"CATCHING_UP"})," (Partition is catching up, meaning that it's not replicated part of the log yet), ",(0,i.jsx)(d.code,{children:"BROKEN"})," (Partition is in broken state, usually it means that its state machine threw an exception)."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"locks",children:"LOCKS"}),"\n",(0,i.jsx)(d.p,{children:"A node system view that lists the currently active locks."}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"OWNING_NODE_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The ID of the node that owns the lock."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TRANSACTION_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The ID of the transaction that created the lock."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"OBJECT_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The ID of the locked object."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"LOCK_MODE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["The ",(0,i.jsx)(d.a,{href:"https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=211885498#IEP91:Transactionprotocol-Lockingmodel",children:"lock mode"}),". Possible values are: IS (intention shared lock), S (shared lock), IX (intention exclusive lock), SIX (shared intention exclusive lock), X (exclusive lock)."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TX_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The ID of the transaction that created the lock."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"MODE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The lock mode."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"local_partition_states",children:"LOCAL_PARTITION_STATES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"NODE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the node the partition is stored on."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the distribution zone the partition belongs to."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The ID of the table stored in the partition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the schema the table belongs to."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the table stored in the partition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARTITION_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The unique identifier of the partition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARTITION_STATE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["Partition status. Possible values: ",(0,i.jsx)(d.code,{children:"HEALTHY"}),", ",(0,i.jsx)(d.code,{children:"INITIALIZING"}),", ",(0,i.jsx)(d.code,{children:"INSTALLING_SNAPSHOT"}),", ",(0,i.jsx)(d.code,{children:"CATCHING_UP"}),", ",(0,i.jsx)(d.code,{children:"UNAVAILABLE"}),", ",(0,i.jsx)(d.code,{children:"BROKEN"}),". See ",(0,i.jsx)(d.a,{href:"/3.1.0/configure-and-operate/operations/disaster-recovery-partitions#local-partition-states",children:"Disaster Recovery"})," documentation for more information."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ESTIMATED_ROWS"}),(0,i.jsx)(d.td,{children:"INT64"}),(0,i.jsx)(d.td,{children:"The estimated number of rows in a partition."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique zone identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique schema identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"STATE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Partition status."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"schemas",children:"SCHEMAS"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique schema identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the schema."})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"sql_queries",children:"SQL_QUERIES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"INITIATOR_NODE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the node that initiated the query."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The query ID."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"USERNAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the user who started the query."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_PHASE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The query phase: INITIALIZATION (query registration and parsing), OPTIMIZATION (query validation and plan optimization), EXECUTION (query plan execution)."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The query type: DDL, DML, QUERY, or SCRIPT."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_DEFAULT_SCHEMA"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the default schema that was used to execute the query."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SQL"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The SQL query's expression."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_START_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP"}),(0,i.jsx)(d.td,{children:"The date/time the query started."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TRANSACTION_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The ID of the transaction in which the query was executed."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARENT_QUERY_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"ID of the script that initiated the query (NULL if the query was not initiated by a script)."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_STATEMENT_ORDINAL"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The ordinal number of the query."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The query ID."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PHASE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The query phase."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The query type."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The name of the default schema that was used to execute the query."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"START_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The date/time the query started."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARENT_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". ID of the script that initiated the query."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"STATEMENT_NUM"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The ordinal number of the query."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"sql_cached_query_plans",children:"SQL_CACHED_QUERY_PLANS"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"NODE_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"ID of the node where the plan is cached."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PLAN_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Internal identifier of the prepared plan."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"CATALOG_VERSION"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Catalog version used when the query was prepared."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_DEFAULT_SCHEMA"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Default schema applied during query preparation."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SQL"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Normalized SQL text of the query."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Query type."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_PLAN"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Serialized or explain representation of the chosen query plan."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"QUERY_PREPARE_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,i.jsx)(d.td,{children:"Time the plan was prepared on the node."})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"system_views",children:"SYSTEM_VIEWS"}),"\n",(0,i.jsx)(d.p,{children:"Describes available system views."}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"VIEW_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"System view ID."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["Name of the schema used. Default is ",(0,i.jsx)(d.code,{children:"SYSTEM"}),"."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"VIEW_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"System view name."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"VIEW_TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"System view type. Possible values: NODE (The view provides node-specific information. Data will be collected from all nodes, and represented in the view.), CLUSTER (The view provides cluster-wide information. Data will be collected from one node, chosen to represent the cluster.)."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". System view ID."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Name of the schema used. Default is ",(0,i.jsx)(d.code,{children:"SYSTEM"}),"."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". System view name."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". System view type."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"system_view_columns",children:"SYSTEM_VIEW_COLUMNS"}),"\n",(0,i.jsx)(d.p,{children:"Describes available system view columns."}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"VIEW_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"System view ID."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"VIEW_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Column name."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["Column type. Can be any of the ",(0,i.jsx)(d.a,{href:"/3.1.0/sql/reference/data-types-and-functions/data-types",children:"supported types"}),"."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"IS_NULLABLE_COLUMN"}),(0,i.jsx)(d.td,{children:"BOOLEAN"}),(0,i.jsx)(d.td,{children:"Defines if the column can be empty."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_PRECISION"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Maximum number of digits."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_SCALE"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Maximum number of decimal places."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_LENGTH"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Maximum length of the value. Symbols for string values or bytes for binary values."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Column name."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Column type."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"NULLABLE"}),(0,i.jsx)(d.td,{children:"BOOLEAN"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Defines if the column can be empty."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PRECISION"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Maximum number of digits."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCALE"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Maximum number of decimal places."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"LENGTH"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Maximum length of the value."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"tables",children:"TABLES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The schema used by the table."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Table name."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique table identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_PK_INDEX_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The identifier of the primary key index."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The distribution zone the table belongs to."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"STORAGE_PROFILE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The storage profile the table uses."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_COLOCATION_COLUMNS"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the column that is used to colocate data."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The identifier of the schema used by the table."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The identifier of the zone the table belongs to."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"IS_CACHE"}),(0,i.jsx)(d.td,{children:"BOOLEAN"}),(0,i.jsx)(d.td,{children:"Defines if it is a cache."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The schema used by the table."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Table name."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Unique table identifier."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PK_INDEX_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The identifier of the primary key index."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLOCATION_KEY_INDEX"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The name of the column that is used to colocate data."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The distribution zone the table belongs to."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"table_columns",children:"TABLE_COLUMNS"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The schema used by the table."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Table name."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TABLE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique table identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Column name."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"Column data type."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"IS_NULLABLE_COLUMN"}),(0,i.jsx)(d.td,{children:"BOOLEAN"}),(0,i.jsxs)(d.td,{children:["If the column can be ",(0,i.jsx)(d.code,{children:"NULL"}),"."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_PRECISION"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Value precision. 0 if not applicable to data type."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_SCALE"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Value scale. 0 if not applicable to data type."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_LENGTH"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Value length, in bytes."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLUMN_ORDINAL"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The ordinal number of the column."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The id of the schema used by the sequence."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PK_COLUMN_ORDINAL"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:["Zero-based position of the column in the primary key. ",(0,i.jsx)(d.code,{children:"NULL"})," if the column is not part of the primary key."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COLOCATION_COLUMN_ORDINAL"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:["Zero-based position of the column in the colocation key. ",(0,i.jsx)(d.code,{children:"NULL"})," if the column is not part of the primary key."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCHEMA"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The schema used by the table."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Column data type."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"NULLABLE"}),(0,i.jsx)(d.td,{children:"BOOLEAN"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". If the column can be ",(0,i.jsx)(d.code,{children:"NULL"}),"."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PREC"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Value precision."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"SCALE"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Value scale."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"LENGTH"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". Value length, in bytes."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"transactions",children:"TRANSACTIONS"}),"\n",(0,i.jsx)(d.admonition,{type:"note",children:(0,i.jsx)(d.p,{children:"This view shows only the currently active transactions."})}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"COORDINATOR_NODE_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the transaction's coordinator node."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TRANSACTION_STATE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The transaction state. For read-only transactions, the value is always null (empty). For read-write transactions, the possible values are PENDING (the transaction is in progress) and FINISHING (the transaction is in the process of being finished)."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TRANSACTION_ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The transaction ID."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TRANSACTION_START_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP"}),(0,i.jsx)(d.td,{children:"The transaction's start time."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TRANSACTION_TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The transaction type: READ_ONLY or READ_WRITE."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TRANSACTION_PRIORITY"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The transaction priority, which is used to resolve conflicts between transactions. Currently, this value cannot be explicitly set by the user. Possible values are LOW and NORMAL (default)."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"STATE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The transaction state."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ID"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The transaction ID."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"START_TIME"}),(0,i.jsx)(d.td,{children:"TIMESTAMP"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The transaction's start time."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"TYPE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The transaction type."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PRIORITY"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The transaction priority."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"zones",children:"ZONES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the distribution zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_PARTITIONS"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The number of partitions in the distribution zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_REPLICAS"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The number of copies of each partition in the distribution zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"DATA_NODES_AUTO_ADJUST_SCALE_UP"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The delay in seconds between the new node joining and the start of data zone adjustment."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"DATA_NODES_AUTO_ADJUST_SCALE_DOWN"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"The delay in seconds between the node leaving the cluster and the start of data zone adjustment."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"DATA_NODES_FILTER"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The filter that specifies what nodes will be used by the distribution zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"IS_DEFAULT_ZONE"}),(0,i.jsx)(d.td,{children:"BOOLEAN"}),(0,i.jsx)(d.td,{children:"If the data zone is used by default."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_CONSISTENCY_MODE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:["The zone's consistency mode. Possible values: ",(0,i.jsx)(d.code,{children:"STRONG_CONSISTENCY"}),", ",(0,i.jsx)(d.code,{children:"HIGH_AVAILABILITY"}),"."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique zone identifier."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The name of the distribution zone."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"PARTITIONS"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The number of partitions in the distribution zone."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"REPLICAS"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The number of copies of each partition in the distribution zone."]})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"CONSISTENCY_MODE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsxs)(d.td,{children:[(0,i.jsx)(d.em,{children:"Deprecated"}),". The zone's consistency mode."]})]})]})]}),"\n",(0,i.jsx)(d.h3,{id:"zone_storage_profiles",children:"ZONE_STORAGE_PROFILES"}),"\n",(0,i.jsxs)(d.table,{children:[(0,i.jsx)(d.thead,{children:(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.th,{children:"Column"}),(0,i.jsx)(d.th,{children:"Data Type"}),(0,i.jsx)(d.th,{children:"Description"})]})}),(0,i.jsxs)(d.tbody,{children:[(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_NAME"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the distribution zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"STORAGE_PROFILE"}),(0,i.jsx)(d.td,{children:"STRING"}),(0,i.jsx)(d.td,{children:"The name of the storage profile used by the distribution zone."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"IS_DEFAULT_PROFILE"}),(0,i.jsx)(d.td,{children:"BOOLEAN"}),(0,i.jsx)(d.td,{children:"If the storage profile is used by default."})]}),(0,i.jsxs)(d.tr,{children:[(0,i.jsx)(d.td,{children:"ZONE_ID"}),(0,i.jsx)(d.td,{children:"INT32"}),(0,i.jsx)(d.td,{children:"Unique zone identifier."})]})]})]})]})}function j(e={}){const{wrapper:d}={...(0,n.R)(),...e.components};return d?(0,i.jsx)(d,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/68533010.cbba2513.js b/docs/ignite3/assets/js/68533010.cbba2513.js deleted file mode 100644 index 613ba62b41..0000000000 --- a/docs/ignite3/assets/js/68533010.cbba2513.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5291],{28453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>c});var i=s(96540);const r={},a=i.createContext(r);function t(e){const n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:n},e.children)}},46346:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"api-reference/sql-only-apis/index","title":"SQL-Only APIs","description":"SQL connectivity drivers for standard database tools and applications.","source":"@site/docs/api-reference/sql-only-apis/index.mdx","sourceDirName":"api-reference/sql-only-apis","slug":"/api-reference/sql-only-apis/","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"SQL-Only APIs"},"sidebar":"tutorialSidebar","previous":{"title":"Network API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api"},"next":{"title":"JDBC Driver","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc"}}');var r=s(74848),a=s(28453);const t={title:"SQL-Only APIs"},c="SQL-Only APIs",o={},l=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components},{IIcon:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"sql-only-apis",children:"SQL-Only APIs"})}),"\n",(0,r.jsx)(n.p,{children:"SQL connectivity drivers for standard database tools and applications."}),"\n",(0,r.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,r.jsxs)("div",{className:"card-container",children:[(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(s,{icon:"mdi:database-sync",height:"24"})," JDBC Driver"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Java Database Connectivity (JDBC 4.x) for SQL-only operations with standard database tools."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./sql-only-apis/jdbc",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(s,{icon:"mdi:connection",height:"24"})," ODBC Driver"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Open Database Connectivity (ODBC 3.8) for cross-platform SQL access from C/C++ applications."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./sql-only-apis/odbc",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(s,{icon:"simple-icons:python",height:"24"})," Python DB-API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Python Database API (PEP-249) for SQL connectivity from Python applications."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./sql-only-apis/python",children:"Learn more \u2192"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"native-clients",children:"Native Client APIs"})," - Full-featured clients"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"../sql",children:"SQL Reference"})," - Complete SQL documentation"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"../develop",children:"Develop"})," - Build applications"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6861f3ae.34cb2dcf.js b/docs/ignite3/assets/js/6861f3ae.34cb2dcf.js deleted file mode 100644 index b2d0bcb5de..0000000000 --- a/docs/ignite3/assets/js/6861f3ae.34cb2dcf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3425],{28453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>t});var l=s(96540);const i={},r=l.createContext(i);function a(e){const n=l.useContext(r);return l.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),l.createElement(r.Provider,{value:n},e.children)}},96161:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>o,frontMatter:()=>a,metadata:()=>l,toc:()=>d});const l=JSON.parse('{"id":"sql/reference/data-types-and-functions/operators-and-functions","title":"Operators and Functions","description":"For more information on functions supported by Apache Calcite, see the product documentation.","source":"@site/docs/sql/reference/data-types-and-functions/operators-and-functions.md","sourceDirName":"sql/reference/data-types-and-functions","slug":"/sql/reference/data-types-and-functions/operators-and-functions","permalink":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Operators and Functions"},"sidebar":"tutorialSidebar","previous":{"title":"Data Types","permalink":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types"},"next":{"title":"Operational Commands","permalink":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands"}}');var i=s(74848),r=s(28453);const a={title:"Operators and Functions"},t="Operators and Functions",c={},d=[{value:"Aggregate Functions",id:"aggregate-functions",level:2},{value:"AVG",id:"avg",level:3},{value:"COUNT",id:"count",level:3},{value:"MAX",id:"max",level:3},{value:"MIN",id:"min",level:3},{value:"SUM",id:"sum",level:3},{value:"ANY_VALUE",id:"any_value",level:3},{value:"EVERY",id:"every",level:3},{value:"SOME",id:"some",level:3},{value:"GROUPING",id:"grouping",level:3},{value:"JSON Functions",id:"json-functions",level:2},{value:"JSON_TYPE",id:"json_type",level:3},{value:"FORMAT JSON",id:"format-json",level:3},{value:"JSON_VALUE",id:"json_value",level:3},{value:"JSON_QUERY",id:"json_query",level:3},{value:"JSON_EXISTS",id:"json_exists",level:3},{value:"JSON_DEPTH",id:"json_depth",level:3},{value:"JSON_KEYS",id:"json_keys",level:3},{value:"JSON_PRETTY",id:"json_pretty",level:3},{value:"JSON_LENGTH",id:"json_length",level:3},{value:"JSON_REMOVE",id:"json_remove",level:3},{value:"JSON_STORAGE_SIZE",id:"json_storage_size",level:3},{value:"JSON_OBJECT",id:"json_object",level:3},{value:"JSON_ARRAY",id:"json_array",level:3},{value:"IS JSON VALUE",id:"is-json-value",level:3},{value:"IS JSON OBJECT",id:"is-json-object",level:3},{value:"IS JSON ARRAY",id:"is-json-array",level:3},{value:"IS JSON SCALAR",id:"is-json-scalar",level:3},{value:"Regular Expression Functions",id:"regular-expression-functions",level:2},{value:"POSIX REGEX CASE INSENSITIVE",id:"posix-regex-case-insensitive",level:3},{value:"POSIX REGEX CASE SENSITIVE",id:"posix-regex-case-sensitive",level:3},{value:"REGEXP_REPLACE",id:"regexp_replace",level:3},{value:"Numeric Functions",id:"numeric-functions",level:2},{value:"MOD",id:"mod",level:3},{value:"EXP",id:"exp",level:3},{value:"POWER",id:"power",level:3},{value:"LN",id:"ln",level:3},{value:"LOG10",id:"log10",level:3},{value:"ABS",id:"abs",level:3},{value:"RAND",id:"rand",level:3},{value:"RAND_INTEGER",id:"rand_integer",level:3},{value:"ACOS",id:"acos",level:3},{value:"ASIN",id:"asin",level:3},{value:"ATAN",id:"atan",level:3},{value:"ATAN2",id:"atan2",level:3},{value:"SQRT",id:"sqrt",level:3},{value:"CBRT",id:"cbrt",level:3},{value:"COS",id:"cos",level:3},{value:"COSH",id:"cosh",level:3},{value:"COT",id:"cot",level:3},{value:"DEGREES",id:"degrees",level:3},{value:"RADIANS",id:"radians",level:3},{value:"ROUND",id:"round",level:3},{value:"SIGN",id:"sign",level:3},{value:"SIN",id:"sin",level:3},{value:"SINH",id:"sinh",level:3},{value:"TAN",id:"tan",level:3},{value:"TANH",id:"tanh",level:3},{value:"TRUNCATE",id:"truncate",level:3},{value:"PI",id:"pi",level:3},{value:"String Functions",id:"string-functions",level:2},{value:"UPPER",id:"upper",level:3},{value:"LOWER",id:"lower",level:3},{value:"INITCAP",id:"initcap",level:3},{value:"TO_BASE64",id:"to_base64",level:3},{value:"FROM_BASE64",id:"from_base64",level:3},{value:"MD5",id:"md5",level:3},{value:"SHA1",id:"sha1",level:3},{value:"SUBSTRING",id:"substring",level:3},{value:"LEFT",id:"left",level:3},{value:"RIGHT",id:"right",level:3},{value:"REPLACE",id:"replace",level:3},{value:"TRANSLATE",id:"translate",level:3},{value:"CHR",id:"chr",level:3},{value:"CHAR_LENGTH",id:"char_length",level:3},{value:"CHARACTER_LENGTH",id:"character_length",level:3},{value:"||",id:"",level:3},{value:"CONCAT",id:"concat",level:3},{value:"OVERLAY",id:"overlay",level:3},{value:"POSITION",id:"position",level:3},{value:"ASCII",id:"ascii",level:3},{value:"REPEAT",id:"repeat",level:3},{value:"SPACE",id:"space",level:3},{value:"STRCMP",id:"strcmp",level:3},{value:"SOUNDEX",id:"soundex",level:3},{value:"DIFFERENCE",id:"difference",level:3},{value:"REVERSE",id:"reverse",level:3},{value:"TRIM",id:"trim",level:3},{value:"LTRIM",id:"ltrim",level:3},{value:"RTRIM",id:"rtrim",level:3},{value:"SUBSTR",id:"substr",level:3},{value:"LENGTH",id:"length",level:3},{value:"OCTET_LENGTH",id:"octet_length",level:3},{value:"LIKE",id:"like",level:3},{value:"SIMILAR TO",id:"similar-to",level:3},{value:"Date/Time Functions",id:"datetime-functions",level:2},{value:"EXTRACT",id:"extract",level:3},{value:"FLOOR",id:"floor",level:3},{value:"CEIL",id:"ceil",level:3},{value:"TIMESTAMPDIFF",id:"timestampdiff",level:3},{value:"LAST_DAY",id:"last_day",level:3},{value:"DAYNAME",id:"dayname",level:3},{value:"MONTHNAME",id:"monthname",level:3},{value:"DAYOFMONTH",id:"dayofmonth",level:3},{value:"DAYOFWEEK",id:"dayofweek",level:3},{value:"DAYOFYEAR",id:"dayofyear",level:3},{value:"YEAR",id:"year",level:3},{value:"QUARTER",id:"quarter",level:3},{value:"MONTH",id:"month",level:3},{value:"WEEK",id:"week",level:3},{value:"HOUR",id:"hour",level:3},{value:"MINUTE",id:"minute",level:3},{value:"SECOND",id:"second",level:3},{value:"TIMESTAMP_SECONDS",id:"timestamp_seconds",level:3},{value:"TIMESTAMP_MILLIS",id:"timestamp_millis",level:3},{value:"TIMESTAMP_MICROS",id:"timestamp_micros",level:3},{value:"UNIX_SECONDS",id:"unix_seconds",level:3},{value:"UNIX_MILLIS",id:"unix_millis",level:3},{value:"UNIX_MICROS",id:"unix_micros",level:3},{value:"UNIX_DATE",id:"unix_date",level:3},{value:"DATE_FROM_UNIX_DATE",id:"date_from_unix_date",level:3},{value:"DATE",id:"date",level:3},{value:"CURRENT_TIMESTAMP",id:"current_timestamp",level:3},{value:"CURRENT_DATE",id:"current_date",level:3},{value:"LOCALTIME",id:"localtime",level:3},{value:"LOCALTIMESTAMP",id:"localtimestamp",level:3},{value:"Other Functions",id:"other-functions",level:2},{value:"CAST",id:"cast",level:3},{value:"COALESCE",id:"coalesce",level:3},{value:"GREATEST",id:"greatest",level:3},{value:"NULLIF",id:"nullif",level:3},{value:"NVL",id:"nvl",level:3},{value:"CASE",id:"case",level:3},{value:"DECODE",id:"decode",level:3},{value:"LEAST",id:"least",level:3},{value:"COMPRESS",id:"compress",level:3},{value:"TYPEOF",id:"typeof",level:3},{value:"RAND_UUID",id:"rand_uuid",level:3},{value:"SYSTEM_RANGE",id:"system_range",level:3},{value:"Security Functions",id:"security-functions",level:2},{value:"CURRENT_USER",id:"current_user",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"operators-and-functions",children:"Operators and Functions"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["For more information on functions supported by Apache Calcite, see the ",(0,i.jsx)(n.a,{href:"https://calcite.apache.org/docs/reference.html#operators-and-functions",children:"product documentation"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"aggregate-functions",children:"Aggregate Functions"}),"\n",(0,i.jsx)(n.h3,{id:"avg",children:"AVG"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"AVG( [ ALL | DISTINCT ] numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the average (arithmetic mean) of numeric across all input values. When used, the type of data will be changed in the following way:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Input type"}),(0,i.jsx)(n.th,{children:"Result type"}),(0,i.jsx)(n.th,{children:"Minimum scale"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"DECIMAL"}),", ",(0,i.jsx)(n.code,{children:"BIGINT"}),", ",(0,i.jsx)(n.code,{children:"INTEGER"}),", ",(0,i.jsx)(n.code,{children:"SMALLINT"}),", ",(0,i.jsx)(n.code,{children:"TINYINT"})]}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"DECIMAL"})}),(0,i.jsx)(n.td,{children:"16"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"DOUBLE"}),", ",(0,i.jsx)(n.code,{children:"REAL"})]}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"DOUBLE"})}),(0,i.jsx)(n.td,{})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"count",children:"COUNT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COUNT( [ ALL | DISTINCT ] value [, value ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of input rows for which value is not null (wholly not null if value is composite)."}),"\n",(0,i.jsx)(n.h3,{id:"max",children:"MAX"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MAX( [ ALL | DISTINCT ] value)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the maximum value across all input values."}),"\n",(0,i.jsx)(n.h3,{id:"min",children:"MIN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MIN( [ ALL | DISTINCT ] value)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the minimum value across all input values."}),"\n",(0,i.jsx)(n.h3,{id:"sum",children:"SUM"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUM( [ ALL | DISTINCT ] numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the sum of numeric across all input values."}),"\n",(0,i.jsx)(n.h3,{id:"any_value",children:"ANY_VALUE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ANY_VALUE( [ ALL | DISTINCT ] value)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns one of the values of value across all input values; this is NOT specified in the SQL standard."}),"\n",(0,i.jsx)(n.h3,{id:"every",children:"EVERY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EVERY(condition)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns TRUE if all of the values of condition are TRUE."}),"\n",(0,i.jsx)(n.h3,{id:"some",children:"SOME"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SOME(condition)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns TRUE if one or more of the values of condition is TRUE."}),"\n",(0,i.jsx)(n.h3,{id:"grouping",children:"GROUPING"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"GROUPING(column_reference [,column_reference])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a bit vector of the given grouping expressions."}),"\n",(0,i.jsx)(n.h2,{id:"json-functions",children:"JSON Functions"}),"\n",(0,i.jsx)(n.h3,{id:"json_type",children:"JSON_TYPE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_TYPE(jsonValue)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a string value indicating the type of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"format-json",children:"FORMAT JSON"}),"\n",(0,i.jsx)(n.p,{children:"Indicates that the value is formatted as JSON."}),"\n",(0,i.jsx)(n.h3,{id:"json_value",children:"JSON_VALUE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_VALUE(jsonValue, path [ RETURNING type ] [ { ERROR | NULL | DEFAULT expr } ON EMPTY ] [ { ERROR | NULL | DEFAULT expr } ON ERROR ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extract an SQL scalar from a jsonValue using JSON path expression path."}),"\n",(0,i.jsx)(n.h3,{id:"json_query",children:"JSON_QUERY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_QUERY(jsonValue, path [ RETURNING type ] [ { WITHOUT [ ARRAY ] | WITH [ CONDITIONAL | UNCONDITIONAL ] [ ARRAY ] } WRAPPER ] [ { ERROR | NULL | EMPTY ARRAY | EMPTY OBJECT } ON EMPTY ] [ { ERROR | NULL | EMPTY ARRAY | EMPTY OBJECT } ON ERROR ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extract a JSON object or JSON array from jsonValue using the path JSON path expression."}),"\n",(0,i.jsx)(n.h3,{id:"json_exists",children:"JSON_EXISTS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_EXISTS(jsonValue, path [ { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether a jsonValue satisfies a search criterion described using JSON path expression path."}),"\n",(0,i.jsx)(n.h3,{id:"json_depth",children:"JSON_DEPTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_DEPTH(jsonValue)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns an integer value indicating the depth of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_keys",children:"JSON_KEYS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_KEYS(jsonValue [, path ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a string indicating the keys of a JSON jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_pretty",children:"JSON_PRETTY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_PRETTY(jsonValue)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a pretty-printing of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_length",children:"JSON_LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_LENGTH(jsonValue [, path ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a integer indicating the length of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_remove",children:"JSON_REMOVE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_REMOVE(jsonValue, path [, path ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Removes data from jsonValue using a series of path expressions and returns the result."}),"\n",(0,i.jsx)(n.h3,{id:"json_storage_size",children:"JSON_STORAGE_SIZE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_STORAGE_SIZE(jsonValue)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of bytes used to store the binary representation of jsonValue."}),"\n",(0,i.jsx)(n.h3,{id:"json_object",children:"JSON_OBJECT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_OBJECT( jsonKeyVal [, jsonKeyVal ]* [ nullBehavior ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Construct JSON object using a series of key-value pairs."}),"\n",(0,i.jsx)(n.h3,{id:"json_array",children:"JSON_ARRAY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"JSON_ARRAY( [ jsonVal [, jsonVal ]* ] [ nullBehavior ] )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Construct a JSON array using a series of values."}),"\n",(0,i.jsx)(n.h3,{id:"is-json-value",children:"IS JSON VALUE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"jsonValue IS JSON [ VALUE ]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether jsonValue is a JSON value."}),"\n",(0,i.jsx)(n.h3,{id:"is-json-object",children:"IS JSON OBJECT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"jsonValue IS JSON OBJECT\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether jsonValue is a JSON object."}),"\n",(0,i.jsx)(n.h3,{id:"is-json-array",children:"IS JSON ARRAY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"jsonValue IS JSON ARRAY\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether jsonValue is a JSON array."}),"\n",(0,i.jsx)(n.h3,{id:"is-json-scalar",children:"IS JSON SCALAR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"jsonValue IS JSON SCALAR\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether jsonValue is a JSON scalar value."}),"\n",(0,i.jsx)(n.h2,{id:"regular-expression-functions",children:"Regular Expression Functions"}),"\n",(0,i.jsx)(n.h3,{id:"posix-regex-case-insensitive",children:"POSIX REGEX CASE INSENSITIVE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"value 1 POSIX REGEX CASE INSENSITIVE value 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"Case-sensitive POSIX regular expression."}),"\n",(0,i.jsx)(n.h3,{id:"posix-regex-case-sensitive",children:"POSIX REGEX CASE SENSITIVE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"value 1 POSIX REGEX CASE SENSITIVE value 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"Case-sensitive POSIX regular expression."}),"\n",(0,i.jsx)(n.h3,{id:"regexp_replace",children:"REGEXP_REPLACE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REGEXP_REPLACE(string, regexp, rep [, pos [, occurrence [, matchType]]])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces all substrings of string that match regexp with rep at the starting pos in expr (if omitted, the default is 1), occurrence specifies which occurrence of a match to search for (if omitted, the default is 1), matchType specifies how to perform matching"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REGEXP_REPLACE(string, regexp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces all substrings of value that match regexp with an empty string and returns modified value."}),"\n",(0,i.jsx)(n.h2,{id:"numeric-functions",children:"Numeric Functions"}),"\n",(0,i.jsx)(n.h3,{id:"mod",children:"MOD"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MOD(numeric1, numeric2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the remainder (modulus) of numeric1 divided by numeric2. The result is negative only if numeric1 is negative."}),"\n",(0,i.jsx)(n.h3,{id:"exp",children:"EXP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXP(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns e raised to the power of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"power",children:"POWER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POWER(numeric1, numeric2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns numeric1 raised to the power of numeric2."}),"\n",(0,i.jsx)(n.h3,{id:"ln",children:"LN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the natural logarithm (base e) of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"log10",children:"LOG10"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOG10(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the base 10 logarithm of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"abs",children:"ABS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ABS(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the absolute value of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"rand",children:"RAND"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RAND([seed])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Generates a random double between 0 and 1 inclusive, optionally initializing the random number generator with seed."}),"\n",(0,i.jsx)(n.h3,{id:"rand_integer",children:"RAND_INTEGER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RAND_INTEGER([seed, ] numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Generates a random integer between 0 and numeric - 1 inclusive, optionally initializing the random number generator with seed."}),"\n",(0,i.jsx)(n.h3,{id:"acos",children:"ACOS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ACOS(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the arc cosine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"asin",children:"ASIN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ASIN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the arc sine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"atan",children:"ATAN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ATAN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the arc tangent of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"atan2",children:"ATAN2"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ATAN2(numeric, numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the arc tangent of the numeric coordinates."}),"\n",(0,i.jsx)(n.h3,{id:"sqrt",children:"SQRT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SQRT(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the square root of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"cbrt",children:"CBRT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CBRT(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the cube root of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"cos",children:"COS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COS(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the cosine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"cosh",children:"COSH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COSH(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the hyperbolic cosine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"cot",children:"COT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COT(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the cotangent of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"degrees",children:"DEGREES"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DEGREES(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Converts numeric from radians to degrees."}),"\n",(0,i.jsx)(n.h3,{id:"radians",children:"RADIANS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RADIANS(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Converts numeric from degrees to radians."}),"\n",(0,i.jsx)(n.h3,{id:"round",children:"ROUND"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ROUND(numeric1 [, integer2])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Rounds numeric1 to optionally integer2 (if not specified 0) places right to the decimal point."}),"\n",(0,i.jsx)(n.h3,{id:"sign",children:"SIGN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SIGN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the signum of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"sin",children:"SIN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SIN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the sine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"sinh",children:"SINH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SINH(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the hyperbolic sine of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"tan",children:"TAN"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TAN(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the tangent of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"tanh",children:"TANH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TANH(numeric)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the hyperbolic tangent of numeric."}),"\n",(0,i.jsx)(n.h3,{id:"truncate",children:"TRUNCATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TRUNCATE(numeric1 [, integer2])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Truncates numeric1 to optionally integer2 (if not specified 0) places right to the decimal point."}),"\n",(0,i.jsx)(n.h3,{id:"pi",children:"PI"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"PI()\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a value that is closer than any other value to Pi."}),"\n",(0,i.jsx)(n.h2,{id:"string-functions",children:"String Functions"}),"\n",(0,i.jsx)(n.h3,{id:"upper",children:"UPPER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UPPER(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a character string converted to upper case."}),"\n",(0,i.jsx)(n.h3,{id:"lower",children:"LOWER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOWER(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a character string converted to lower case."}),"\n",(0,i.jsx)(n.h3,{id:"initcap",children:"INITCAP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"INITCAP(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns string with the first letter of each word converter to upper case and the rest to lower case. Words are sequences of alphanumeric characters separated by non-alphanumeric characters."}),"\n",(0,i.jsx)(n.h3,{id:"to_base64",children:"TO_BASE64"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TO_BASE64(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Converts the string to base-64 encoded form and returns an encoded string"}),"\n",(0,i.jsx)(n.h3,{id:"from_base64",children:"FROM_BASE64"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"FROM_BASE64(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the decoded result of a base-64 string as a string."}),"\n",(0,i.jsx)(n.h3,{id:"md5",children:"MD5"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MD5(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Calculates an MD5 128-bit checksum of string and returns it as a hex string."}),"\n",(0,i.jsx)(n.h3,{id:"sha1",children:"SHA1"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SHA1(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Calculates a SHA-1 hash value of string and returns it as a hex string."}),"\n",(0,i.jsx)(n.h3,{id:"substring",children:"SUBSTRING"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTRING(string FROM integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a substring of a character string starting at a given point."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTRING(string FROM integer FOR integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a substring of a character string starting at a given point with a given length."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTRING(binary FROM integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a substring of binary starting at a given point."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTRING(binary FROM integer FOR integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a substring of binary starting at a given point with a given length."}),"\n",(0,i.jsx)(n.h3,{id:"left",children:"LEFT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LEFT(string, length)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the leftmost length characters from the string."}),"\n",(0,i.jsx)(n.h3,{id:"right",children:"RIGHT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RIGHT(string, length)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the rightmost length characters from the string."}),"\n",(0,i.jsx)(n.h3,{id:"replace",children:"REPLACE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REPLACE(char, search_string [, replace_string])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces search_string with replace_string."}),"\n",(0,i.jsx)(n.h3,{id:"translate",children:"TRANSLATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TRANSLATE(expr, fromString, toString)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns expr with all occurrences of each character in fromString replaced by its corresponding character in toString. Characters in expr that are not in fromString are not replaced."}),"\n",(0,i.jsx)(n.h3,{id:"chr",children:"CHR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CHR(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the character whose UTF-8 code is integer."}),"\n",(0,i.jsx)(n.h3,{id:"char_length",children:"CHAR_LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CHAR_LENGTH(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of characters in a character string."}),"\n",(0,i.jsx)(n.h3,{id:"character_length",children:"CHARACTER_LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CHARACTER_LENGTH(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of characters in a character string."}),"\n",(0,i.jsx)(n.h3,{id:"",children:"||"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"string || string\n"})}),"\n",(0,i.jsx)(n.p,{children:"Concatenates two character strings."}),"\n",(0,i.jsx)(n.h3,{id:"concat",children:"CONCAT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CONCAT(string, string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Concatenates two strings, returns null only when both string arguments are null, otherwise treats null as empty string."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CONCAT(string [, string ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Concatenates one or more strings, returns null if any of the arguments is null."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CONCAT(string [, string ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Concatenates one or more strings, null is treated as empty string."}),"\n",(0,i.jsx)(n.h3,{id:"overlay",children:"OVERLAY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"OVERLAY(string1 PLACING string2 FROM integer [ FOR integer2 ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces a substring of string1 with string2."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"OVERLAY(binary1 PLACING binary2 FROM integer [ FOR integer2 ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Replaces a substring of binary1 with binary2."}),"\n",(0,i.jsx)(n.h3,{id:"position",children:"POSITION"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POSITION(substring IN string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the position of the first occurrence of substring in string."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POSITION(substring IN string FROM integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the position of the first occurrence of substring in string starting at a given point (not standard SQL)."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POSITION(binary1 IN binary2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the position of the first occurrence of binary1 in binary2."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"POSITION(binary1 IN binary2 FROM integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the position of the first occurrence of binary1 in binary2 starting at a given point (not standard SQL)."}),"\n",(0,i.jsx)(n.h3,{id:"ascii",children:"ASCII"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"ASCII(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the ASCII code of the first character of string; if the first character is a non-ASCII character, returns its Unicode code point; returns 0 if string is empty."}),"\n",(0,i.jsx)(n.h3,{id:"repeat",children:"REPEAT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REPEAT(string, integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a string consisting of string repeated of integer times; returns an empty string if integer is less than 1."}),"\n",(0,i.jsx)(n.h3,{id:"space",children:"SPACE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SPACE(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a string with an integer number of spaces; returns an empty string if integer is less than 1."}),"\n",(0,i.jsx)(n.h3,{id:"strcmp",children:"STRCMP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"STRCMP(string, string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns 0 if both of the strings are same and returns -1 when the first argument is smaller than the second and 1 when the second one is smaller than the first one."}),"\n",(0,i.jsx)(n.h3,{id:"soundex",children:"SOUNDEX"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SOUNDEX(string)\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Returns the phonetic representation of string; throws if string is encoded with multi-byte encoding such as UTF-8; or"}),"\n",(0,i.jsx)(n.li,{children:"Returns the phonetic representation of string; return original string if string is encoded with multi-byte encoding such as UTF-8"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"difference",children:"DIFFERENCE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DIFFERENCE(string, string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a measure of the similarity of two strings, namely the number of character positions that their SOUNDEX values have in common: 4 if the SOUNDEX values are same and 0 if the SOUNDEX values are totally different."}),"\n",(0,i.jsx)(n.h3,{id:"reverse",children:"REVERSE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"REVERSE(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns string with the order of the characters reversed."}),"\n",(0,i.jsx)(n.h3,{id:"trim",children:"TRIM"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TRIM( { BOTH | LEADING | TRAILING } string1 FROM string2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Removes the longest string containing only the characters in string1 from the start/end/both ends of string1."}),"\n",(0,i.jsx)(n.h3,{id:"ltrim",children:"LTRIM"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LTRIM(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns string with all blanks removed from the start."}),"\n",(0,i.jsx)(n.h3,{id:"rtrim",children:"RTRIM"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RTRIM(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns string with all blanks removed from the end."}),"\n",(0,i.jsx)(n.h3,{id:"substr",children:"SUBSTR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SUBSTR(string, position [, substringLength ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a portion of string, beginning at character position, substringLength characters long. SUBSTR calculates lengths using characters as defined by the input character set."}),"\n",(0,i.jsx)(n.h3,{id:"length",children:"LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LENGTH(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to CHAR_LENGTH(string)."}),"\n",(0,i.jsx)(n.h3,{id:"octet_length",children:"OCTET_LENGTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"OCTET_LENGTH(binary)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of bytes in binary."}),"\n",(0,i.jsx)(n.h3,{id:"like",children:"LIKE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"string1 LIKE string2 [ ESCAPE string3 ]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether string1 matches pattern string2."}),"\n",(0,i.jsx)(n.h3,{id:"similar-to",children:"SIMILAR TO"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"string1 SIMILAR TO string2 [ ESCAPE string3 ]\n"})}),"\n",(0,i.jsx)(n.p,{children:"Whether string1 matches regular expression string2."}),"\n",(0,i.jsx)(n.h2,{id:"datetime-functions",children:"Date/Time Functions"}),"\n",(0,i.jsx)(n.h3,{id:"extract",children:"EXTRACT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXTRACT(timeUnit FROM datetime)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extracts and returns the value of a specified datetime field from a datetime value expression."}),"\n",(0,i.jsx)(n.h3,{id:"floor",children:"FLOOR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"FLOOR(datetime TO timeUnit)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Rounds datetime down to timeUnit."}),"\n",(0,i.jsx)(n.h3,{id:"ceil",children:"CEIL"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CEIL(datetime TO timeUnit)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Rounds datetime up to timeUnit."}),"\n",(0,i.jsx)(n.h3,{id:"timestampdiff",children:"TIMESTAMPDIFF"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TIMESTAMPDIFF(timeUnit, datetime, datetime2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the (signed) number of timeUnit intervals between datetime and datetime2. Equivalent to (datetime2 - datetime) timeUnit."}),"\n",(0,i.jsx)(n.h3,{id:"last_day",children:"LAST_DAY"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LAST_DAY(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the date of the last day of the month in a value of datatype DATE; For example, it returns DATE'2020-02-29' for both DATE'2020-02-10' and TIMESTAMP'2020-02-10 10:10:10'."}),"\n",(0,i.jsx)(n.h3,{id:"dayname",children:"DAYNAME"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DAYNAME(datetime)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the name of the day of the week based on the datetime value."}),"\n",(0,i.jsx)(n.h3,{id:"monthname",children:"MONTHNAME"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MONTHNAME(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the name, in the connection's locale, of the month in datetime; for example, it returns '\u4e8c\u6708' for both DATE '2020-02-10' and TIMESTAMP '2020-02-10 10:10:10'."}),"\n",(0,i.jsx)(n.h3,{id:"dayofmonth",children:"DAYOFMONTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DAYOFMONTH(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(DAY FROM date). Returns an integer between 1 and 31."}),"\n",(0,i.jsx)(n.h3,{id:"dayofweek",children:"DAYOFWEEK"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DAYOFWEEK(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(DOW FROM date). Returns an integer between 1 and 7."}),"\n",(0,i.jsx)(n.h3,{id:"dayofyear",children:"DAYOFYEAR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DAYOFYEAR(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(DOY FROM date). Returns an integer between 1 and 366."}),"\n",(0,i.jsx)(n.h3,{id:"year",children:"YEAR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"YEAR(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(YEAR FROM date). Returns an integer."}),"\n",(0,i.jsx)(n.h3,{id:"quarter",children:"QUARTER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"QUARTER(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(QUARTER FROM date). Returns an integer between 1 and 4."}),"\n",(0,i.jsx)(n.h3,{id:"month",children:"MONTH"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MONTH(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(MONTH FROM date). Returns an integer between 1 and 12."}),"\n",(0,i.jsx)(n.h3,{id:"week",children:"WEEK"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"WEEK(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(WEEK FROM date). Returns an integer between 1 and 53."}),"\n",(0,i.jsx)(n.h3,{id:"hour",children:"HOUR"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"HOUR(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(HOUR FROM date). Returns an integer between 0 and 23."}),"\n",(0,i.jsx)(n.h3,{id:"minute",children:"MINUTE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"MINUTE(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(MINUTE FROM date). Returns an integer between 0 and 59."}),"\n",(0,i.jsx)(n.h3,{id:"second",children:"SECOND"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SECOND(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to EXTRACT(SECOND FROM date). Returns an integer between 0 and 59."}),"\n",(0,i.jsx)(n.h3,{id:"timestamp_seconds",children:"TIMESTAMP_SECONDS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TIMESTAMP_SECONDS(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the TIMESTAMP that is integer seconds after 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"timestamp_millis",children:"TIMESTAMP_MILLIS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TIMESTAMP_MILLIS(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the TIMESTAMP that is integer milliseconds after 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"timestamp_micros",children:"TIMESTAMP_MICROS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TIMESTAMP_MICROS(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the TIMESTAMP that is integer microseconds after 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"unix_seconds",children:"UNIX_SECONDS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UNIX_SECONDS(timestamp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of seconds since 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"unix_millis",children:"UNIX_MILLIS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UNIX_MILLIS(timestamp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of milliseconds since 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"unix_micros",children:"UNIX_MICROS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UNIX_MICROS(timestamp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of microseconds since 1970-01-01 00:00:00."}),"\n",(0,i.jsx)(n.h3,{id:"unix_date",children:"UNIX_DATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"UNIX_DATE(date)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the number of days since 1970-01-01"}),"\n",(0,i.jsx)(n.h3,{id:"date_from_unix_date",children:"DATE_FROM_UNIX_DATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE_FROM_UNIX_DATE(integer)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the DATE that is integer days after 1970-01-01."}),"\n",(0,i.jsx)(n.h3,{id:"date",children:"DATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(timestamp)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extracts the DATE from a timestamp."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(timestampLtz)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extracts the DATE from timestampLtz (an instant; BigQuery's TIMESTAMP type), assuming UTC."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(timestampLtz, timeZone)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extracts the DATE from timestampLtz (an instant; BigQuery's TIMESTAMP type) in timeZone."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Equivalent to CAST(string AS DATE)."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DATE(year, month, day)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a DATE value for year, month, and day (all of type INTEGER)."}),"\n",(0,i.jsx)(n.h3,{id:"current_timestamp",children:"CURRENT_TIMESTAMP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CURRENT_TIMESTAMP\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone, in a value of datatype TIMESTAMP WITH LOCAL TIME ZONE."}),"\n",(0,i.jsx)(n.h3,{id:"current_date",children:"CURRENT_DATE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CURRENT_DATE\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date in the session time zone, in a value of datatype DATE."}),"\n",(0,i.jsx)(n.h3,{id:"localtime",children:"LOCALTIME"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOCALTIME\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone in a value of datatype TIME."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOCALTIME(precision)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone in a value of datatype TIME, with precision digits of precision."}),"\n",(0,i.jsx)(n.h3,{id:"localtimestamp",children:"LOCALTIMESTAMP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOCALTIMESTAMP\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone in a value of datatype TIMESTAMP."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LOCALTIMESTAMP(precision)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the current date and time in the session time zone in a value of datatype TIMESTAMP, with precision digits of precision."}),"\n",(0,i.jsx)(n.h2,{id:"other-functions",children:"Other Functions"}),"\n",(0,i.jsx)(n.h3,{id:"cast",children:"CAST"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CAST(value AS type)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Converts a value to a given type. Casts between integer types truncate towards 0."}),"\n",(0,i.jsx)(n.h3,{id:"coalesce",children:"COALESCE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COALESCE(value, value [, value ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Provides a value if the first value is null. For example, COALESCE(NULL, 5) returns 5."}),"\n",(0,i.jsx)(n.h3,{id:"greatest",children:"GREATEST"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"GREATEST(expr [, expr ]*)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the greatest of the expressions."}),"\n",(0,i.jsx)(n.h3,{id:"nullif",children:"NULLIF"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"NULLIF(value, value)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns NULL if the values are the same. For example, NULLIF(5, 5) returns NULL; NULLIF(5, 0) returns 5."}),"\n",(0,i.jsx)(n.h3,{id:"nvl",children:"NVL"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"NVL(value1, value2)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns value1 if value1 is not null, otherwise value2."}),"\n",(0,i.jsx)(n.h3,{id:"case",children:"CASE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CASE value\r\nWHEN value1 [, value11 ]* THEN result1\r\n[ WHEN valueN [, valueN1 ]* THEN resultN ]*\r\n[ ELSE resultZ ]\r\nEND\n"})}),"\n",(0,i.jsx)(n.p,{children:"Simple case."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CASE\r\nWHEN condition1 THEN result1\r\n[ WHEN conditionN THEN resultN ]*\r\n[ ELSE resultZ ]\r\nEND\n"})}),"\n",(0,i.jsx)(n.p,{children:"Searched case."}),"\n",(0,i.jsx)(n.h3,{id:"decode",children:"DECODE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"DECODE(value, value1, result1 [, valueN, resultN ]* [, default ])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Compares value to each valueN value one by one; if value is equal to a valueN, returns the corresponding resultN, else returns default, or NULL if default is not specified."}),"\n",(0,i.jsx)(n.h3,{id:"least",children:"LEAST"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"LEAST(expr [, expr ]* )\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the least of the expressions."}),"\n",(0,i.jsx)(n.h3,{id:"compress",children:"COMPRESS"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"COMPRESS(string)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Compresses a string using zlib compression and returns the result as a binary string."}),"\n",(0,i.jsx)(n.h3,{id:"typeof",children:"TYPEOF"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"TYPEOF value\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the type of the specified value."}),"\n",(0,i.jsx)(n.h3,{id:"rand_uuid",children:"RAND_UUID"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"RAND_UUID\n"})}),"\n",(0,i.jsx)(n.p,{children:"Generates a random UUID."}),"\n",(0,i.jsx)(n.h3,{id:"system_range",children:"SYSTEM_RANGE"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SYSTEM_RANGE(start, end[, increment])\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns a range from the table, with an optional increment."}),"\n",(0,i.jsx)(n.h2,{id:"security-functions",children:"Security Functions"}),"\n",(0,i.jsx)(n.h3,{id:"current_user",children:"CURRENT_USER"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CURRENT_USER\n"})}),"\n",(0,i.jsx)(n.p,{children:"Returns the name of the current database user. When security is disabled, returns the system user name instead."})]})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/696e0280.b2aed5b1.js b/docs/ignite3/assets/js/696e0280.b2aed5b1.js deleted file mode 100644 index 3abff9614f..0000000000 --- a/docs/ignite3/assets/js/696e0280.b2aed5b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3173],{28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}},65677:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"getting-started/start-cluster","title":"Start a Cluster in Docker","description":"This guide walks you through the process of setting up and running an Apache Ignite 3 cluster using Docker containers. Follow these steps to get a three-node cluster up and running quickly.","source":"@site/docs/getting-started/start-cluster.md","sourceDirName":"getting-started","slug":"/getting-started/start-cluster","permalink":"/docs/ignite3/3.1.0/getting-started/start-cluster","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Start a Cluster in Docker"},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/docs/ignite3/3.1.0/getting-started/quick-start"},"next":{"title":"Working with SQL","permalink":"/docs/ignite3/3.1.0/getting-started/work-with-sql"}}');var i=t(74848),o=t(28453);const s={title:"Start a Cluster in Docker"},c=void 0,l={},a=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Create a Docker Compose Configuration",id:"step-1-create-a-docker-compose-configuration",level:2},{value:"Step 2: Start the Ignite Cluster",id:"step-2-start-the-ignite-cluster",level:2},{value:"Step 3: Initialize the Cluster",id:"step-3-initialize-the-cluster",level:2},{value:"Step 4: Verify Your Cluster",id:"step-4-verify-your-cluster",level:2},{value:"Understanding Port Configuration",id:"understanding-port-configuration",level:2},{value:"Stopping the Cluster",id:"stopping-the-cluster",level:2},{value:"Removing the Cluster",id:"removing-the-cluster",level:2}];function d(e){const n={code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"This guide walks you through the process of setting up and running an Apache Ignite 3 cluster using Docker containers. Follow these steps to get a three-node cluster up and running quickly."}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Up-to-date Docker and Docker Compose installed on your system"}),"\n",(0,i.jsx)(n.li,{children:"Basic familiarity with command-line operations"}),"\n",(0,i.jsx)(n.li,{children:"The code editor of your choice (VS Code, IntelliJ IDEA, etc.)"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"step-1-create-a-docker-compose-configuration",children:"Step 1: Create a Docker Compose Configuration"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Create a file named ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})," in your project directory:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'name: ignite3\r\n\r\nx-ignite-def: &ignite-def\r\n image: apacheignite/ignite:3.0.0\r\n environment:\r\n JVM_MAX_MEM: "4g"\r\n JVM_MIN_MEM: "4g"\r\n configs:\r\n - source: node_config\r\n target: /opt/ignite/etc/ignite-config.conf\r\n mode: 0644\r\n\r\nservices:\r\n node1:\r\n <<: *ignite-def\r\n command: --node-name node1\r\n ports:\r\n - "10300:10300"\r\n - "10800:10800"\r\n node2:\r\n <<: *ignite-def\r\n command: --node-name node2\r\n ports:\r\n - "10301:10300"\r\n - "10801:10800"\r\n node3:\r\n <<: *ignite-def\r\n command: --node-name node3\r\n ports:\r\n - "10302:10300"\r\n - "10802:10800"\r\n\r\nconfigs:\r\n node_config:\r\n content: |\r\n ignite {\r\n network {\r\n port: 3344\r\n nodeFinder.netClusterNodes = ["node1:3344", "node2:3344", "node3:3344"]\r\n }\r\n }\n'})}),"\n",(0,i.jsx)(n.h2,{id:"step-2-start-the-ignite-cluster",children:"Step 2: Start the Ignite Cluster"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Open a terminal in the directory containing your ",(0,i.jsx)(n.code,{children:"docker-compose.yml"})," file"]}),"\n",(0,i.jsx)(n.li,{children:"Run the following command to start the cluster:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Verify that all containers are running:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose ps\n"})}),"\n",(0,i.jsx)(n.p,{children:"Here is how the command output may look:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:'NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS\r\nignite3-node1-1 apacheignite/ignite:3.0.0 "docker-entrypoint.s\u2026" node1 13 seconds ago Up 10 seconds 0.0.0.0:10300->10300/tcp, 3344/tcp, 0.0.0.0:10800->10800/tcp\r\nignite3-node2-1 apacheignite/ignite:3.0.0 "docker-entrypoint.s\u2026" node2 13 seconds ago Up 10 seconds 3344/tcp, 0.0.0.0:10301->10300/tcp, 0.0.0.0:10801->10800/tcp\r\nignite3-node3-1 apacheignite/ignite:3.0.0 "docker-entrypoint.s\u2026" node3 13 seconds ago Up 10 seconds 3344/tcp, 0.0.0.0:10302->10300/tcp, 0.0.0.0:10802->10800/tcp\n'})}),"\n",(0,i.jsx)(n.p,{children:"Your nodes are now running, but the cluster is not initialized."}),"\n",(0,i.jsx)(n.h2,{id:"step-3-initialize-the-cluster",children:"Step 3: Initialize the Cluster"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Start the Ignite CLI in Docker:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"docker run --rm -it --network=host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 apacheignite/ignite:3.0.0 cli\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Inside the CLI, connect to one of the nodes:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"connect http://localhost:10300\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Confirm the connection to the default node in the CLI tool."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Initialize the cluster with a name and the metastorage group of all nodes:"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster init --name=ignite3 --metastorage-group=node1,node2,node3\n"})}),"\n",(0,i.jsx)(n.p,{children:"The output from this step should be similar to this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:" # ___ __\r\n ### / | ____ ____ _ _____ / /_ ___\r\n # ##### / /| | / __ \\ / __ `// ___// __ \\ / _ \\\r\n ### ###### / ___ | / /_/ // /_/ // /__ / / / // ___/\r\n ##### ####### /_/ |_|/ .___/ \\__,_/ \\___//_/ /_/ \\___/\r\n ####### ###### /_/\r\n ######## #### ____ _ __ _____\r\n # ######## ## / _/____ _ ____ (_)/ /_ ___ |__ /\r\n #### ####### # / / / __ `// __ \\ / // __// _ \\ /_ <\r\n ##### ##### _/ / / /_/ // / / // // /_ / ___/ ___/ /\r\n #### ## /___/ \\__, //_/ /_//_/ \\__/ \\___/ /____/\r\n ## /____/\r\n\r\n Apache Ignite CLI version 3.0.0\r\n\r\n\r\nYou appear to have not connected to any node yet. Do you want to connect to the default node http://localhost:10300? [Y/n] y\r\nConnected to http://localhost:10300\r\nThe cluster is not initialized. Run cluster init command to initialize it.\r\n[node1]> cluster init --name=ignite3 --metastorage-group=node1,node2,node3\r\nCluster was initialized successfully\n"})}),"\n",(0,i.jsx)(n.h2,{id:"step-4-verify-your-cluster",children:"Step 4: Verify Your Cluster"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Use the ",(0,i.jsx)(n.code,{children:"cluster status"})," CLI command to verify your cluster is running correctly."]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster status\n"})}),"\n",(0,i.jsx)(n.p,{children:"The output should look similar to this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"[name: ignite3, nodes: 3, status: active, cmgNodes: [node1, node2, node3], msNodes: [node1, node2, node3]]\n"})}),"\n",(0,i.jsx)(n.p,{children:"This means that all 3 nodes found each other and formed an active cluster."}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Exit the CLI by typing ",(0,i.jsx)(n.code,{children:"exit"})," or pressing Ctrl+D. This will also stop the CLI container."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Congratulations! You have a local Apache Ignite 3 cluster running that you can use for development."}),"\n",(0,i.jsx)(n.h2,{id:"understanding-port-configuration",children:"Understanding Port Configuration"}),"\n",(0,i.jsx)(n.p,{children:"The Docker Compose file exposes two types of ports for each node:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"10300-10302"}),": REST API ports for administrative operations"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"10800-10802"}),": Client connection ports for your applications"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"stopping-the-cluster",children:"Stopping the Cluster"}),"\n",(0,i.jsx)(n.p,{children:"If you want to pause your cluster:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose stop\r\n\r\n[+] Stopping 3/3\r\n \u2714 Container ignite3-node1-1 Stopped\r\n \u2714 Container ignite3-node2-1 Stopped\r\n \u2714 Container ignite3-node3-1 Stopped\n"})}),"\n",(0,i.jsx)(n.p,{children:"This will stop the containers and retain your data."}),"\n",(0,i.jsx)(n.h2,{id:"removing-the-cluster",children:"Removing the Cluster"}),"\n",(0,i.jsx)(n.p,{children:"When you are done working with the cluster, you can remove it using:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose down\r\n\r\n[+] Running 4/4\r\n \u2714 Container ignite3-node3-1 Removed\r\n \u2714 Container ignite3-node2-1 Removed\r\n \u2714 Container ignite3-node1-1 Removed\r\n \u2714 Network ignite3_default Removed\n"})}),"\n",(0,i.jsx)(n.p,{children:"This will stop and remove all the containers. Your data will be lost unless you have configured persistent storage."})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/69dbdcb6.5d839540.js b/docs/ignite3/assets/js/69dbdcb6.5d839540.js deleted file mode 100644 index c5e63be87e..0000000000 --- a/docs/ignite3/assets/js/69dbdcb6.5d839540.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[581],{3916:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"develop/work-with-data/java-to-tables","title":"Creating Tables from Java Classes","description":"Overview","source":"@site/docs/develop/work-with-data/java-to-tables.md","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/java-to-tables","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"java-to-tables","title":"Creating Tables from Java Classes"},"sidebar":"tutorialSidebar","previous":{"title":"Available Events","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/events-list"},"next":{"title":"Java Client Logging","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging"}}');var r=t(74848),l=t(28453);const i={id:"java-to-tables",title:"Creating Tables from Java Classes"},o=void 0,s={},d=[{value:"Overview",id:"overview",level:2},{value:"Examples",id:"examples",level:2},{value:"Key-Value POJO Compatible with KeyValueView",id:"key-value-pojo-compatible-with-keyvalueview",level:3},{value:"Single POJO Compatible with RecordView",id:"single-pojo-compatible-with-recordview",level:3},{value:"The Builder Alternative to the @Table Annotation",id:"the-builder-alternative-to-the-table-annotation",level:3},{value:"Next Steps",id:"next-steps",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(n.p,{children:["While ",(0,r.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/ddl",children:"SQL DDL"})," supports a full set of table manipulation commands, you can also create tables and build indexes directly from a POJO using a simple Java API."]}),"\n",(0,r.jsxs)(n.p,{children:["This API supports custom annotations and simple builders; it works seamlessly with the Mapper interface, thus facilitating ",(0,r.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/table-api",children:"KeyValueView and RecordView"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"The Java API lets you perform the following operations:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"CREATE ZONE"}),"\n",(0,r.jsx)(n.li,{children:"CREATE TABLE"}),"\n",(0,r.jsx)(n.li,{children:"CREATE INDEX"}),"\n",(0,r.jsx)(n.li,{children:"DROP ZONE"}),"\n",(0,r.jsx)(n.li,{children:"DROP TABLE"}),"\n",(0,r.jsx)(n.li,{children:"DROP INDEX"}),"\n",(0,r.jsx)(n.li,{children:"CREATE SCHEMA"}),"\n",(0,r.jsx)(n.li,{children:"DROP SCHEMA"}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Use the @Table and other annotations located in the ",(0,r.jsx)(n.code,{children:"org.apache.ignite.catalog.annotations"})," package."]}),"\n",(0,r.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,r.jsx)(n.h3,{id:"key-value-pojo-compatible-with-keyvalueview",children:"Key-Value POJO Compatible with KeyValueView"}),"\n",(0,r.jsxs)(n.p,{children:["The example below creates a table called ",(0,r.jsx)(n.code,{children:"kv_pojo"})," by using the POJO compatible with ",(0,r.jsx)(n.code,{children:"KeyValueView"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table(value = "kv_pojo",\r\n zone = @Zone(value = "zone_test", replicas = 2, storageProfiles = "default"),\r\n colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},\r\n indexes = @Index(value = "ix", columns = {@ColumnRef("f_name"), @ColumnRef("l_name")}))\r\n\r\npublic static class PojoKey {\r\n @Id\r\n Integer id;\r\n\r\n @Id(SortOrder.DEFAULT)\r\n @Column(value = "id_str", length = 20)\r\n String idStr;\r\n\r\n public PojoKey(Integer id, String idStr) {\r\n this.id = id;\r\n this.idStr = idStr;\r\n }\r\n}\r\n\r\npublic static class PojoValue {\r\n @Column("f_name")\r\n private String firstName;\r\n\r\n @Column("l_name")\r\n private String lastName;\r\n\r\n public PojoValue(String firstName, String lastName) {\r\n this.firstName = firstName;\r\n this.lastName = lastName;\r\n }\r\n}\r\n\r\n\r\npublic static void main(String[] args) {\r\n\r\n System.out.println("\\nConnecting to server...");\r\n\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n ) {\r\n\r\n org.apache.ignite.table.Table myTable = client.catalog().createTable(PojoKey.class, PojoValue.class);\r\n\r\n KeyValueView kvView = myTable.keyValueView(PojoKey.class, PojoValue.class);\r\n PojoKey key = new PojoKey(1, "sample");\r\n PojoValue putValue = new PojoValue("John", "Smith");\r\n kvView.put(null, key, putValue);\r\n\r\n PojoValue getValue = kvView.get(null, key);\r\n System.out.println(\r\n "\\nRetrieved values:\\n"\r\n + " Account ID: " + key.id + \'\\n\'\r\n + " First name: " + getValue.firstName + \'\\n\'\r\n + " Last name" + getValue.lastName);\r\n\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["You need to create a ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-storage-overview",children:"storage profile"})," in node configuration by using the CLI tool."]})}),"\n",(0,r.jsx)(n.p,{children:"The result is equivalent to the following SQL multi-statement:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS zone_test WITH PARTITIONS=2, STORAGE_PROFILES='default';\r\n\r\nCREATE TABLE IF NOT EXISTS kv_pojo (\r\n\tid int,\r\n\tid_str varchar(20),\r\n\tf_name varchar,\r\n\tl_name varchar,\r\n\tstr varchar,\r\n\tPRIMARY KEY (id, id_str)\r\n)\r\nCOLOCATE BY (id, id_str)\r\nWITH PRIMARY_ZONE='ZONE';\r\n\r\nCREATE INDEX ix (f_name, l_name desc nulls last);\n"})}),"\n",(0,r.jsx)(n.h3,{id:"single-pojo-compatible-with-recordview",children:"Single POJO Compatible with RecordView"}),"\n",(0,r.jsxs)(n.p,{children:["The example below creates the ",(0,r.jsx)(n.code,{children:"pojo_sample"})," table by using the POJO compatible with ",(0,r.jsx)(n.code,{children:"RecordView"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table(value = "pojo_sample",\r\n zone = @Zone(value = "zone_test", replicas = 2, storageProfiles = "default"),\r\n colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},\r\n indexes = @Index(value = "ix_sample", columns = {@ColumnRef("f_name"), @ColumnRef("l_name")}))\r\n\r\npublic static class Pojo {\r\n @Id\r\n Integer id;\r\n\r\n @Id(SortOrder.DEFAULT)\r\n @Column(value = "id_str", length = 20)\r\n String idStr;\r\n\r\n @Column("f_name")\r\n String firstName;\r\n\r\n @Column("l_name")\r\n String lastName;\r\n\r\n String str;\r\n}\r\n\r\npublic static void main(String[] args) {\r\n\r\n System.out.println("\\nConnecting to server...");\r\n\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n ) {\r\n\r\n org.apache.ignite.table.Table myTable = client.catalog().createTable(Pojo.class);\r\n\r\n RecordView view = myTable.recordView();\r\n Tuple insertTuple = Tuple.create()\r\n .set("id", 1)\r\n .set("id_str", "sample")\r\n .set("f_name", "John")\r\n .set("l_name", "Smith");\r\n view.insert(null, insertTuple);\r\n\r\n Tuple getTuple = view.get(null, insertTuple);\r\n System.out.println(\r\n "\\nRetrieved record: " +\r\n getTuple.stringValue("f_name")\r\n );\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"the-builder-alternative-to-the-table-annotation",children:"The Builder Alternative to the @Table Annotation"}),"\n",(0,r.jsx)(n.p,{children:"The example below uses a builder to create a table instead on creating it from a Java class:"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["When using builders, only the ",(0,r.jsx)(n.code,{children:"@Id"})," and ",(0,r.jsx)(n.code,{children:"@Column"})," annotations on fields are supported."]})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteCatalog catalog = client.catalog();\r\n\r\ncatalog.createTable(\r\n TableDefinition.builder("sampleTable3")\r\n .primaryKey("myKey")\r\n .columns(\r\n column("myKey", ColumnType.INT32),\r\n column("myValue", ColumnType.VARCHAR)\r\n )\r\n .build()\r\n);\r\n\r\nTable myTable = client.tables().table("sampleTable3");\r\nmyTable.keyValueView().put(null, Tuple.create().set("myKey", 1), Tuple.create().set("myValue", "John"));\r\n\r\nTuple value = myTable.keyValueView().get(null, Tuple.create().set("myKey", 1));\r\nSystem.out.println(\r\n "\\nRetrieved value:\\n" +\r\n value.stringValue("myValue")\r\n);\n'})}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(n.p,{children:["Once you have created a table using the Java API, you can manipulate it using the ",(0,r.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/ddl",children:"SQL commands"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var a=t(96540);const r={},l=a.createContext(r);function i(e){const n=a.useContext(l);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6b5309c4.6ab228f7.js b/docs/ignite3/assets/js/6b5309c4.6ab228f7.js deleted file mode 100644 index c36df32026..0000000000 --- a/docs/ignite3/assets/js/6b5309c4.6ab228f7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8772],{28453:(e,n,t)=>{t.d(n,{R:()=>c,x:()=>s});var i=t(96540);const r={},a=i.createContext(r);function c(e){const n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),i.createElement(a.Provider,{value:n},e.children)}},59747:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"api-reference/native-clients/java/security-api","title":"Security API","description":"The Security API configures authentication for client connections. Applications provide credentials when establishing connections to secure Ignite clusters. The API supports basic username and password authentication with extensibility for custom authentication mechanisms.","source":"@site/docs/api-reference/native-clients/java/security-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/security-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":11,"frontMatter":{"title":"Security API","id":"security-api","sidebar_position":11},"sidebar":"tutorialSidebar","previous":{"title":"Network API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api"},"next":{"title":".NET API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/"}}');var r=t(74848),a=t(28453);const c={title:"Security API",id:"security-api",sidebar_position:11},s="Security API",l={},o=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Basic Authentication",id:"basic-authentication",level:2},{value:"Authentication Configuration",id:"authentication-configuration",level:2},{value:"Authentication Types",id:"authentication-types",level:2},{value:"Authentication Failure Handling",id:"authentication-failure-handling",level:2},{value:"No Authentication",id:"no-authentication",level:2},{value:"Authentication with TLS",id:"authentication-with-tls",level:2},{value:"Custom Authenticators",id:"custom-authenticators",level:2},{value:"Authentication Type Parsing",id:"authentication-type-parsing",level:2},{value:"Credential Management",id:"credential-management",level:2},{value:"Asynchronous Connection with Authentication",id:"asynchronous-connection-with-authentication",level:2},{value:"Connection Retry with Authentication",id:"connection-retry-with-authentication",level:2},{value:"Server-Side Authentication",id:"server-side-authentication",level:2},{value:"Authentication Interface",id:"authentication-interface",level:2},{value:"Identity and Secret Data",id:"identity-and-secret-data",level:2},{value:"Embedded Node Authentication",id:"embedded-node-authentication",level:2},{value:"Reference",id:"reference",level:2},{value:"IgniteClientAuthenticator Interface",id:"igniteclientauthenticator-interface",level:3},{value:"BasicAuthenticator",id:"basicauthenticator",level:3},{value:"AuthenticationType",id:"authenticationtype",level:3},{value:"Client Builder Authentication",id:"client-builder-authentication",level:3},{value:"Authentication Best Practices",id:"authentication-best-practices",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"security-api",children:"Security API"})}),"\n",(0,r.jsx)(n.p,{children:"The Security API configures authentication for client connections. Applications provide credentials when establishing connections to secure Ignite clusters. The API supports basic username and password authentication with extensibility for custom authentication mechanisms."}),"\n",(0,r.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,r.jsx)(n.p,{children:"Authentication occurs during client connection establishment. Clients configure authenticators through the builder pattern before creating connections. The authenticator provides identity and secret data to the server for validation."}),"\n",(0,r.jsx)(n.p,{children:"Basic authentication transmits username and password credentials. The client includes authentication type and credentials in connection requests. Servers validate credentials before accepting connections."}),"\n",(0,r.jsx)(n.h2,{id:"basic-authentication",children:"Basic Authentication"}),"\n",(0,r.jsx)(n.p,{children:"Configure basic authentication with username and password:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .authenticator(BasicAuthenticator.builder()\r\n .username("admin")\r\n .password("password")\r\n .build())\r\n .build();\r\n\r\ntry {\r\n String nodeName = client.name();\r\n System.out.println("Authenticated to: " + nodeName);\r\n} finally {\r\n client.close();\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"authentication-configuration",children:"Authentication Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Set authenticator during client building:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'BasicAuthenticator authenticator = BasicAuthenticator.builder()\r\n .username("myUsername")\r\n .password("myPassword")\r\n .build();\r\n\r\nIgniteClient client = IgniteClient.builder()\r\n .addresses("server1:10800", "server2:10800")\r\n .authenticator(authenticator)\r\n .build();\n'})}),"\n",(0,r.jsx)(n.p,{children:"The authenticator applies to all connections the client establishes."}),"\n",(0,r.jsx)(n.h2,{id:"authentication-types",children:"Authentication Types"}),"\n",(0,r.jsx)(n.p,{children:"Access authentication type information:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'BasicAuthenticator authenticator = BasicAuthenticator.builder()\r\n .username("user")\r\n .password("pass")\r\n .build();\r\n\r\nString type = authenticator.type();\r\nSystem.out.println("Authentication type: " + type);\n'})}),"\n",(0,r.jsx)(n.p,{children:"The BASIC type indicates username and password authentication."}),"\n",(0,r.jsx)(n.h2,{id:"authentication-failure-handling",children:"Authentication Failure Handling"}),"\n",(0,r.jsx)(n.p,{children:"Handle authentication errors:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try {\r\n IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .authenticator(BasicAuthenticator.builder()\r\n .username("user")\r\n .password("wrongpass")\r\n .build())\r\n .build();\r\n} catch (IgniteException e) {\r\n System.err.println("Authentication failed: " + e.getMessage());\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Connection failures due to invalid credentials throw exceptions during client creation."}),"\n",(0,r.jsx)(n.h2,{id:"no-authentication",children:"No Authentication"}),"\n",(0,r.jsx)(n.p,{children:"Omit the authenticator for unauthenticated connections:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .build();\n'})}),"\n",(0,r.jsx)(n.p,{children:"Clients without authenticators connect to clusters that do not require authentication."}),"\n",(0,r.jsx)(n.h2,{id:"authentication-with-tls",children:"Authentication with TLS"}),"\n",(0,r.jsx)(n.p,{children:"Combine authentication with TLS encryption:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'SslConfiguration ssl = SslConfiguration.builder()\r\n .enabled(true)\r\n .trustStorePath("/path/to/truststore.jks")\r\n .trustStorePassword("trustpass")\r\n .build();\r\n\r\nIgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .ssl(ssl)\r\n .authenticator(BasicAuthenticator.builder()\r\n .username("admin")\r\n .password("password")\r\n .build())\r\n .build();\n'})}),"\n",(0,r.jsx)(n.p,{children:"TLS encrypts the connection while authentication validates identity."}),"\n",(0,r.jsx)(n.h2,{id:"custom-authenticators",children:"Custom Authenticators"}),"\n",(0,r.jsx)(n.p,{children:"Implement custom authentication mechanisms:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public class TokenAuthenticator implements IgniteClientAuthenticator {\r\n private final String token;\r\n\r\n public TokenAuthenticator(String token) {\r\n this.token = token;\r\n }\r\n\r\n @Override\r\n public String type() {\r\n return "TOKEN";\r\n }\r\n\r\n @Override\r\n public Object identity() {\r\n return token;\r\n }\r\n\r\n @Override\r\n public Object secret() {\r\n return "";\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Custom authenticators provide identity and secret data in appropriate formats."}),"\n",(0,r.jsx)(n.h2,{id:"authentication-type-parsing",children:"Authentication Type Parsing"}),"\n",(0,r.jsx)(n.p,{children:"The type() method returns a string identifier:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'BasicAuthenticator authenticator = BasicAuthenticator.builder()\r\n .username("user")\r\n .password("pass")\r\n .build();\r\n\r\nString typeString = authenticator.type();\r\nSystem.out.println("Type: " + typeString);\n'})}),"\n",(0,r.jsx)(n.h2,{id:"credential-management",children:"Credential Management"}),"\n",(0,r.jsx)(n.p,{children:"Store credentials securely outside application code:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'String username = System.getenv("IGNITE_USERNAME");\r\nString password = System.getenv("IGNITE_PASSWORD");\r\n\r\nif (username == null || password == null) {\r\n throw new IllegalStateException("Credentials not configured");\r\n}\r\n\r\nIgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .authenticator(BasicAuthenticator.builder()\r\n .username(username)\r\n .password(password)\r\n .build())\r\n .build();\n'})}),"\n",(0,r.jsx)(n.p,{children:"Retrieve credentials from environment variables, configuration files, or credential managers."}),"\n",(0,r.jsx)(n.h2,{id:"asynchronous-connection-with-authentication",children:"Asynchronous Connection with Authentication"}),"\n",(0,r.jsx)(n.p,{children:"Build authenticated clients asynchronously:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'CompletableFuture clientFuture = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .authenticator(BasicAuthenticator.builder()\r\n .username("admin")\r\n .password("password")\r\n .build())\r\n .buildAsync();\r\n\r\nclientFuture.thenAccept(client -> {\r\n System.out.println("Authenticated to: " + client.name());\r\n}).exceptionally(ex -> {\r\n System.err.println("Authentication failed: " + ex.getMessage());\r\n return null;\r\n});\n'})}),"\n",(0,r.jsx)(n.h2,{id:"connection-retry-with-authentication",children:"Connection Retry with Authentication"}),"\n",(0,r.jsx)(n.p,{children:"Retry policies apply to authenticated connections:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .authenticator(BasicAuthenticator.builder()\r\n .username("user")\r\n .password("pass")\r\n .build())\r\n .retryPolicy(new RetryReadPolicy())\r\n .build();\n'})}),"\n",(0,r.jsx)(n.p,{children:"Failed operations retry according to the policy after successful authentication."}),"\n",(0,r.jsx)(n.h2,{id:"server-side-authentication",children:"Server-Side Authentication"}),"\n",(0,r.jsx)(n.p,{children:"Server configuration determines authentication requirements. Clients must match server authentication settings. Consult server configuration documentation for authentication setup."}),"\n",(0,r.jsx)(n.h2,{id:"authentication-interface",children:"Authentication Interface"}),"\n",(0,r.jsx)(n.p,{children:"The IgniteClientAuthenticator interface defines authentication contracts:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"public interface IgniteClientAuthenticator {\r\n String type();\r\n Object identity();\r\n Object secret();\r\n}\n"})}),"\n",(0,r.jsx)(n.p,{children:"Implementations provide authentication type and credential data."}),"\n",(0,r.jsx)(n.h2,{id:"identity-and-secret-data",children:"Identity and Secret Data"}),"\n",(0,r.jsx)(n.p,{children:"Authenticators separate identity and secret information:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'BasicAuthenticator auth = BasicAuthenticator.builder()\r\n .username("username")\r\n .password("password")\r\n .build();\r\n\r\nObject identity = auth.identity();\r\nObject secret = auth.secret();\n'})}),"\n",(0,r.jsx)(n.p,{children:"BasicAuthenticator returns username as identity and password as secret."}),"\n",(0,r.jsx)(n.h2,{id:"embedded-node-authentication",children:"Embedded Node Authentication"}),"\n",(0,r.jsx)(n.p,{children:"Embedded nodes use configuration files for authentication setup. Client authentication applies only to thin client connections."}),"\n",(0,r.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Authenticator interface: ",(0,r.jsx)(n.code,{children:"org.apache.ignite.client.IgniteClientAuthenticator"})]}),"\n",(0,r.jsxs)(n.li,{children:["Basic authentication: ",(0,r.jsx)(n.code,{children:"org.apache.ignite.client.BasicAuthenticator"})]}),"\n",(0,r.jsxs)(n.li,{children:["Authentication types: ",(0,r.jsx)(n.code,{children:"org.apache.ignite.security.AuthenticationType"})]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"igniteclientauthenticator-interface",children:"IgniteClientAuthenticator Interface"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"String type()"})," - Get authentication type"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"Object identity()"})," - Get identity data (username, token, etc.)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"Object secret()"})," - Get secret data (password, key, etc.)"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"basicauthenticator",children:"BasicAuthenticator"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"static Builder builder()"})," - Create builder for authenticator"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"Builder.username(String)"})," - Set username, returns Builder"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"Builder.password(String)"})," - Set password, returns Builder"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"Builder.build()"})," - Build BasicAuthenticator instance"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"String type()"}),' - Returns "BASIC"']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"Object identity()"})," - Returns username"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"Object secret()"})," - Returns password"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"authenticationtype",children:"AuthenticationType"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"static AuthenticationType parse(String)"})," - Parse from string"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"BASIC"})," - Basic username/password authentication"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"client-builder-authentication",children:"Client Builder Authentication"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"authenticator(IgniteClientAuthenticator)"})," - Set authenticator for connections"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"authentication-best-practices",children:"Authentication Best Practices"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Store credentials in secure configuration stores, not in code"}),"\n",(0,r.jsx)(n.li,{children:"Use environment variables or credential management systems"}),"\n",(0,r.jsx)(n.li,{children:"Combine authentication with TLS for complete security"}),"\n",(0,r.jsx)(n.li,{children:"Validate credentials before distributing applications"}),"\n",(0,r.jsx)(n.li,{children:"Rotate credentials periodically according to security policies"}),"\n",(0,r.jsx)(n.li,{children:"Handle authentication failures gracefully with appropriate error messages"}),"\n",(0,r.jsx)(n.li,{children:"Test authentication in development environments before production deployment"}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6b7ab3e3.34f748c3.js b/docs/ignite3/assets/js/6b7ab3e3.34f748c3.js deleted file mode 100644 index 8b9776a1db..0000000000 --- a/docs/ignite3/assets/js/6b7ab3e3.34f748c3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6346],{28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var i=t(96540);const c={},s=i.createContext(c);function o(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),i.createElement(s.Provider,{value:n},e.children)}},85104:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"develop/connect-to-ignite/index","title":"Connect to Ignite","description":"Multiple connectivity options for accessing Apache Ignite 3 clusters.","source":"@site/docs/develop/connect-to-ignite/index.mdx","sourceDirName":"develop/connect-to-ignite","slug":"/develop/connect-to-ignite/","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Connect to Ignite"},"sidebar":"tutorialSidebar","previous":{"title":"C++ Client","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client"},"next":{"title":"JDBC Driver","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc"}}');var c=t(74848),s=t(28453);const o={title:"Connect to Ignite"},r="Connect to Ignite",a={},d=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components},{IIcon:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"connect-to-ignite",children:"Connect to Ignite"})}),"\n",(0,c.jsx)(n.p,{children:"Multiple connectivity options for accessing Apache Ignite 3 clusters."}),"\n",(0,c.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,c.jsxs)("div",{className:"card-container",children:[(0,c.jsxs)("div",{className:"card",children:[(0,c.jsx)("div",{className:"card__header",children:(0,c.jsxs)("h3",{children:[(0,c.jsx)(t,{icon:"mdi:database-sync",height:"24"})," JDBC Driver"]})}),(0,c.jsx)("div",{className:"card__body",children:(0,c.jsx)("p",{children:"Java Database Connectivity (JDBC) driver for SQL operations with standard database tools."})}),(0,c.jsx)("div",{className:"card__footer",children:(0,c.jsx)("a",{href:"./connect-to-ignite/jdbc",children:"Learn more \u2192"})})]}),(0,c.jsxs)("div",{className:"card",children:[(0,c.jsx)("div",{className:"card__header",children:(0,c.jsxs)("h3",{children:[(0,c.jsx)(t,{icon:"mdi:connection",height:"24"})," ODBC Driver"]})}),(0,c.jsx)("div",{className:"card__body",children:(0,c.jsx)("p",{children:"Open Database Connectivity (ODBC) for cross-platform SQL access from C/C++ applications."})}),(0,c.jsx)("div",{className:"card__footer",children:(0,c.jsx)("a",{href:"./connect-to-ignite/odbc",children:"Learn more \u2192"})})]}),(0,c.jsxs)("div",{className:"card",children:[(0,c.jsx)("div",{className:"card__header",children:(0,c.jsxs)("h3",{children:[(0,c.jsx)(t,{icon:"simple-icons:python",height:"24"})," Python DB-API"]})}),(0,c.jsx)("div",{className:"card__body",children:(0,c.jsx)("p",{children:"Python Database API (PEP-249) for SQL connectivity from Python applications."})}),(0,c.jsx)("div",{className:"card__footer",children:(0,c.jsx)("a",{href:"./connect-to-ignite/python",children:"Learn more \u2192"})})]})]}),"\n",(0,c.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"work-with-data",children:"Work with Data"})," - Data manipulation and processing"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"../sql",children:"SQL Reference"})," - Complete SQL documentation"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"../api-reference",children:"API Reference"})," - Native client APIs"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6cc25ccb.988e4a2c.js b/docs/ignite3/assets/js/6cc25ccb.988e4a2c.js deleted file mode 100644 index b2d8de1747..0000000000 --- a/docs/ignite3/assets/js/6cc25ccb.988e4a2c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3614],{28453:(e,a,i)=>{i.d(a,{R:()=>d,x:()=>c});var s=i(96540);const r={},n=s.createContext(r);function d(e){const a=s.useContext(n);return s.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function c(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(n.Provider,{value:a},e.children)}},29508:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>t,contentTitle:()=>c,default:()=>h,frontMatter:()=>d,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"develop/index","title":"Develop","description":"Build applications with Apache Ignite 3 using native clients, SQL drivers, and framework integrations.","source":"@site/docs/develop/index.mdx","sourceDirName":"develop","slug":"/develop/","permalink":"/docs/ignite3/3.1.0/develop/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Migrate from 3.0 to 3.1","permalink":"/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1"},"next":{"title":"Ignite Clients","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/"}}');var r=i(74848),n=i(28453);const d={},c="Develop",t={},o=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const a={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components},{IIcon:i}=a;return i||function(e,a){throw new Error("Expected "+(a?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.header,{children:(0,r.jsx)(a.h1,{id:"develop",children:"Develop"})}),"\n",(0,r.jsx)(a.p,{children:"Build applications with Apache Ignite 3 using native clients, SQL drivers, and framework integrations."}),"\n",(0,r.jsx)(a.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,r.jsxs)("div",{className:"card-container",children:[(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:code-braces",height:"24"})," Ignite Clients"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Full-featured native clients for Java, .NET, and C++ with support for all Ignite APIs including tables, SQL, transactions, and compute."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/ignite-clients/",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:database-sync",height:"24"})," Connect to Ignite"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"SQL-only connectivity through standard database drivers including JDBC, ODBC, and Python DB-API."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/connect-to-ignite/jdbc",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:table",height:"24"})," Use the Table API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Key-value and record-based data access with typed views for direct table operations."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/work-with-data/table-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:console-line",height:"24"})," Execute SQL Queries"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Programmatic SQL execution with prepared statements, parameter binding, and result processing."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/work-with-data/table-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:shield-check-outline",height:"24"})," Work with Transactions"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"ACID transaction support with explicit transaction control and closure-based patterns."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/work-with-data/transactions",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:upload-network-outline",height:"24"})," Stream Data"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"High-throughput data streaming for bulk loading with reactive stream patterns."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/work-with-data/streaming",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:package-variant-closed",height:"24"})," Deploy Code"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Deploy compute jobs to the cluster for colocated data processing and distributed execution."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/work-with-data/code-deployment",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:bell-alert-outline",height:"24"})," Handle Events"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"React to cluster events including node join/leave, data changes, and system notifications."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/work-with-data/events",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:class",height:"24"})," Map Java Objects to Tables"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Object-relational mapping with annotations for automatic schema generation and type conversion."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/work-with-data/java-to-tables",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"simple-icons:spring",height:"24"})," Spring Boot Integration"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Auto-configuration and starters for Spring Boot applications with dependency injection support."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/integrate/spring-boot",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(i,{icon:"mdi:database-cog-outline",height:"24"})," Spring Data Integration"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Repository pattern support with Spring Data abstractions for simplified data access."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./develop/integrate/spring-data",children:"Learn more \u2192"})})]})]}),"\n",(0,r.jsx)(a.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(a.ul,{children:["\n",(0,r.jsxs)(a.li,{children:[(0,r.jsx)(a.a,{href:"sql",children:"SQL"})," - Learn about SQL capabilities and syntax"]}),"\n",(0,r.jsxs)(a.li,{children:[(0,r.jsx)(a.a,{href:"api-reference",children:"API Reference"})," - Detailed API documentation"]}),"\n",(0,r.jsxs)(a.li,{children:[(0,r.jsx)(a.a,{href:"configure-and-operate",children:"Configure and Operate"})," - Production deployment"]}),"\n"]})]})}function h(e={}){const{wrapper:a}={...(0,n.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6ce9454c.d3590cf7.js b/docs/ignite3/assets/js/6ce9454c.d3590cf7.js deleted file mode 100644 index d7f6ab5350..0000000000 --- a/docs/ignite3/assets/js/6ce9454c.d3590cf7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8134],{11470:(e,n,t)=>{t.d(n,{A:()=>w});var o=t(96540),r=t(34164),s=t(17559),i=t(23104),a=t(56347),l=t(205),c=t(57485),d=t(31682),u=t(70679);function h(e){return o.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,o.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:o}})=>({value:e,label:n,attributes:t,default:o}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function b({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const t=(0,a.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(r),(0,o.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=p(e),[i,a]=(0,o.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!b({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s})),[c,d]=m({queryString:t,groupId:r}),[h,x]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,u.Dv)(n);return[t,(0,o.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),j=(()=>{const e=c??h;return b({value:e,tabValues:s})?e:null})();(0,l.A)(()=>{j&&a(j)},[j]);return{selectedValue:i,selectValue:(0,o.useCallback)(e=>{if(!b({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);a(e),d(e),x(e)},[d,x,s]),tabValues:s}}var j=t(92303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=t(74848);function f({className:e,block:n,selectedValue:t,selectValue:o,tabValues:s}){const a=[],{blockElementScrollPositionUntilNextRender:l}=(0,i.a_)(),c=e=>{const n=e.currentTarget,r=a.indexOf(n),i=s[r].value;i!==t&&(l(n),o(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:o})=>(0,y.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{a.push(e)},onKeyDown:d,onClick:c,...o,className:(0,r.A)("tabs__item",g.tabItem,o?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function v({lazy:e,children:n,selectedValue:t}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===t);return e?(0,o.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function N(e){const n=x(e);return(0,y.jsxs)("div",{className:(0,r.A)(s.G.tabs.container,"tabs-container",g.tabList),children:[(0,y.jsx)(f,{...n,...e}),(0,y.jsx)(v,{...n,...e})]})}function w(e){const n=(0,j.A)();return(0,y.jsx)(N,{...e,children:h(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>i});t(96540);var o=t(34164);const r={tabItem:"tabItem_Ymn6"};var s=t(74848);function i({children:e,hidden:n,className:t}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(96540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}},29939:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"developers-guide/compute/compute","title":"Distributed Computing","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/compute/compute.md","sourceDirName":"developers-guide/compute","slug":"/developers-guide/compute/","permalink":"/docs/ignite3/3.0.0/developers-guide/compute/","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Distributed Computing","sidebar_label":"Distributed Computing"},"sidebar":"tutorialSidebar","previous":{"title":"Creating Tables from Java Classes","permalink":"/docs/ignite3/3.0.0/developers-guide/java-to-tables"},"next":{"title":"Distributed Computing","permalink":"/docs/ignite3/3.0.0/developers-guide/compute/"}}');var r=t(74848),s=t(28453),i=t(11470),a=t(19365);const l={title:"Distributed Computing",sidebar_label:"Distributed Computing"},c=void 0,d={},u=[{value:"Compute Job Code Deployment",id:"compute-job-code-deployment",level:2},{value:"Configuring Jobs",id:"configuring-jobs",level:2},{value:"Job Target",id:"job-target",level:3},{value:"Job Descriptor",id:"job-descriptor",level:3},{value:"Deployment Unit Information",id:"deployment-unit-information",level:3},{value:"Executing Jobs",id:"executing-jobs",level:2},{value:"Single Node Execution",id:"single-node-execution",level:3},{value:"Multiple Node Execution",id:"multiple-node-execution",level:3},{value:"Colocated Execution",id:"colocated-execution",level:3},{value:"Using Qualified Table Names",id:"using-qualified-table-names",level:2},{value:".NET Compute Jobs",id:"net-compute-jobs",level:2},{value:".NET Compute Requirements",id:"net-compute-requirements",level:4},{value:"Implementing .NET Compute Jobs",id:"implementing-net-compute-jobs",level:3},{value:"Running .NET Compute Jobs",id:"running-net-compute-jobs",level:3},{value:"Job Ownership",id:"job-ownership",level:2},{value:"Job Execution States",id:"job-execution-states",level:2},{value:"Possible States and Transitions",id:"possible-states-and-transitions",level:3},{value:"Cancelling Executing Jobs",id:"cancelling-executing-jobs",level:3},{value:"Job Priority",id:"job-priority",level:3},{value:"Job Retries",id:"job-retries",level:3},{value:"Job Failover",id:"job-failover",level:2},{value:"Worker Node Shutdown",id:"worker-node-shutdown",level:3},{value:"Coordinator Node Shutdown",id:"coordinator-node-shutdown",level:3},{value:"Client Disconnect",id:"client-disconnect",level:3},{value:"MapReduce Tasks",id:"mapreduce-tasks",level:2},{value:"Understanding MapReduce Tasks",id:"understanding-mapreduce-tasks",level:3},{value:"Creating a Mapper Class",id:"creating-a-mapper-class",level:3},{value:"Executing a MapReduce Task",id:"executing-a-mapreduce-task",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n","\n",(0,r.jsx)(n.p,{children:"Apache Ignite lets you run your own code on the cluster in a distributed, balanced, and fault-tolerant way."}),"\n",(0,r.jsx)(n.p,{children:"Tasks can run on a single node, multiple nodes, or across the entire cluster, and you can choose between synchronous and asynchronous execution."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Apache Ignite compute engine now supports jobs implemented both in Java and in .NET. As .NET compute jobs require a bit of extra setup, see the ",(0,r.jsx)(n.a,{href:"#net-compute-jobs",children:".NET Compute Jobs"})," subsection for details."]})}),"\n",(0,r.jsxs)(n.p,{children:["In addition to standard compute tasks, Apache Ignite supports ",(0,r.jsx)(n.a,{href:"#colocated-execution",children:"Colocated Execution"}),". This means your tasks can run directly on the nodes that store the required data, reducing network overhead and improving performance.\r\nThe cluster also supports ",(0,r.jsx)(n.a,{href:"#mapreduce-tasks",children:"MapReduce Tasks"}),", allowing for efficient processing of large datasets. In this case, tasks will be executed on nodes that hold the data required for them."]}),"\n",(0,r.jsxs)(n.p,{children:["When sending code and data between nodes, objects are converted into a transferable format so they can be accurately rebuilt. Apache Ignite automatically handles marshalling for common types like tuples, POJOs, and native types, but for more complex or custom objects, you may need to implement your own ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/compute/serialization",children:"marshalling"})," logic."]}),"\n",(0,r.jsx)(n.h2,{id:"compute-job-code-deployment",children:"Compute Job Code Deployment"}),"\n",(0,r.jsxs)(n.p,{children:["Before submitting your compute job, ensure that the required code is ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/code-deployment/",children:"deployed"})," to the nodes where it will execute."]}),"\n",(0,r.jsxs)(n.p,{children:["If you are using ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/quick-start/embedded-mode",children:"embedded nodes"}),", any code that is included in the project classpath will also be available to your compute jobs."]}),"\n",(0,r.jsx)(n.h2,{id:"configuring-jobs",children:"Configuring Jobs"}),"\n",(0,r.jsxs)(n.p,{children:["In Apache Ignite, compute job's execution is defined by two key components: ",(0,r.jsx)(n.code,{children:"JobTarget"})," and ",(0,r.jsx)(n.code,{children:"JobDescriptor"}),". These components determine on which nodes the job will run and how it will be structured, including input and output types, marshallers, and the deployed class that represents the job."]}),"\n",(0,r.jsx)(n.h3,{id:"job-target",children:"Job Target"}),"\n",(0,r.jsxs)(n.p,{children:["Before submitting a job, you must create a ",(0,r.jsx)(n.code,{children:"JobTarget"})," object that specifies which nodes will execute the job. Job target can point to a specific node, any node on the cluster, or start a ",(0,r.jsx)(n.a,{href:"#colocated-execution",children:"colocated"})," compute job, that will be executed on nodes that hold a specific key. The following methods are available:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"JobTarget.anyNode()"})," - the job will be executed on any of the specified nodes."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"JobTarget.node()"})," - the job will be executed on the specific node."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"JobTarget.colocated()"})," - the job will be executed on a node that holds the specified key."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Use the ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget"})," object instead in case you want to execute a job across ",(0,r.jsx)(n.a,{href:"#multiple-node-execution",children:"multiple nodes"}),"."]})}),"\n",(0,r.jsx)(n.h3,{id:"job-descriptor",children:"Job Descriptor"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"JobDescriptor"})," object contains all the details required for job execution. The following arguments must be provided:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"The job descriptor is created using a builder that specifies the input type for the job arguments, the expected output type, and the fully qualified name of the job class to execute."}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"units"})," takes your deployment unit. You create it with the unit's name and specify ",(0,r.jsx)(n.code,{children:"Version.LATEST"})," so that your job always runs the most recently deployed version."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"resultClass"})," sets the expected result type so the system can correctly process the job's output."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"argumentMarshaller"})," and ",(0,r.jsx)(n.code,{children:"resultMarshaller"})," defines how to serialize the job's input argument and output result. For common types, you can omit the marshallers and pass ",(0,r.jsx)(n.code,{children:"null"})," to the builder since Apache Ignite automatically handles marshalling."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Examples below assumes that the ",(0,r.jsx)(n.code,{children:"NodeNameJob"})," class has been deployed to the node by using ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/code-deployment/",children:"code deployment"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"If you are working with common types, you don't need to define custom marshallers. Apache Ignite will handle them automatically. The following example shows a simpler job descriptor that uses built-in marshalling:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'String result = client.compute().execute(\r\n JobTarget.anyNode(client.cluster().nodes()),\r\n JobDescriptor.builder(WordPrintJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .resultClass(String.class)\r\n .build(),\r\n "Hello, Ignite!"\r\n);\n'})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["This example shows how to create a custom job descriptor for a job that takes a user-defined ",(0,r.jsx)(n.code,{children:"MyJobArgument"}),", runs on a random cluster node, and returns a ",(0,r.jsx)(n.code,{children:"MyJobResult"})," object using custom marshallers:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'MyJobResult result = client.compute().execute(\r\n JobTarget.anyNode(client.cluster().nodes()),\r\n JobDescriptor.builder(WordPrintJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .resultClass(MyJobResult.class)\r\n .argumentMarshaller(new ArgMarshaller())\r\n .resultMarshaller(new ResultMarshaller())\r\n .build(),\r\n new MyJobArgument("Hello, Ignite!")\r\n);\n'})}),"\n",(0,r.jsx)(n.p,{children:"For more details on configuring jobs refer to the corresponding API section."}),"\n",(0,r.jsx)(n.h3,{id:"deployment-unit-information",children:"Deployment Unit Information"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"JobExecutionContext"})," object contains the information about the deployment units the job is using as a collection of ",(0,r.jsx)(n.code,{children:"DeploymentUnitInfo"})," for each deployment unit involved in the job."]}),"\n",(0,r.jsxs)(n.p,{children:["Each ",(0,r.jsx)(n.code,{children:"DeploymentUnitInfo"})," object provides the following information:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"name()"})," - The name of the deployment unit"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"version()"})," - The version of the deployment unit"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"path()"})," - The filesystem path to the deployment unit contents"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public class DiagnosticJob implements ComputeJob {\r\n @Override\r\n public CompletableFuture executeAsync(JobExecutionContext context, Void input) {\r\n // Access deployment unit information\r\n String deploymentInfo = context.deploymentUnits().stream()\r\n .map(unit -> String.format("%s:%s at %s",\r\n unit.name(),\r\n unit.version(),\r\n unit.path()))\r\n .collect(Collectors.joining(", "));\r\n\r\n return CompletableFuture.completedFuture(deploymentInfo);\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"executing-jobs",children:"Executing Jobs"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite compute jobs can run on a specific node, any node, or using a colocated approach when job is executed on the node holding the relevant data key."}),"\n",(0,r.jsx)(n.h3,{id:"single-node-execution",children:"Single Node Execution"}),"\n",(0,r.jsx)(n.p,{children:"Often, you need to perform a job on one node in the cluster. In this case, there are multiple ways to start job execution:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"submitAsync()"})," - sends the job to the cluster and returns a future that will be completed with the ",(0,r.jsx)(n.code,{children:"JobExecution"})," object when the job is submitted for execution."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"executeAsync()"})," - sends the job to the cluster and returns a future that will be completed when job execution result is ready."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"execute()"})," - sends the job to the cluster and waits for the result of job execution."]}),"\n"]}),"\n",(0,r.jsxs)(i.A,{groupId:"programming-languages",children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n) {\r\n\r\n System.out.println("\\nConfiguring compute job...");\r\n\r\n JobDescriptor job = JobDescriptor.builder(WordPrintJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n JobTarget jobTarget = JobTarget.anyNode(client.clusterNodes());\r\n\r\n\r\n for (String word : "Print words using runnable".split(" ")) {\r\n\r\n System.out.println("\\nExecuting compute job for word \'" + word + "\'...");\r\n\r\n client.compute().execute(jobTarget, job, word);\r\n }\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'ICompute compute = Client.Compute;\r\nIList nodes = await Client.GetClusterNodesAsync();\r\n\r\nIJobExecution execution = await compute.SubmitAsync(\r\nJobTarget.AnyNode(nodes),\r\nnew JobDescriptor("org.example.NodeNameJob"),\r\narg: "Hello");\r\n\r\nstring result = await execution.GetResultAsync();\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n.build();\r\n\r\njob_execution execution = comp.submit(job_target::any_node(nodes), job_desc, {std::string("Hello")}, {});\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"multiple-node-execution",children:"Multiple Node Execution"}),"\n",(0,r.jsxs)(n.p,{children:["To execute the compute task on multiple nodes, you use the same methods as for single node execution, except instead of creating a ",(0,r.jsx)(n.code,{children:"JobTarget"})," object to designate execution nodes you use the ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget"})," and specify the list of nodes that the job must be executed on."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget"})," object can specify the following:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"BroadcastJobTarget.nodes()"})," - the job will be executed on all nodes in the list."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"BroadcastJobTarget.table()"})," - the job will be executed on all nodes that hold partitions of the specified table."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"You can control what nodes the task is executed on by setting the list of nodes:"}),"\n",(0,r.jsxs)(i.A,{groupId:"programming-languages",children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n) {\r\n\r\n System.out.println("\\nConfiguring compute job...");\r\n\r\n\r\n JobDescriptor job = JobDescriptor.builder(HelloMessageJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n BroadcastJobTarget target = BroadcastJobTarget.nodes(client.cluster().nodes());\r\n\r\n\r\n System.out.println("\\nExecuting compute job...");\r\n\r\n client.compute().execute(target, job, "John");\r\n\r\n System.out.println("\\nCompute job executed...");\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'ICompute compute = Client.Compute;\r\nIList nodes = await Client.GetClusterNodesAsync();\r\n\r\nIBroadcastExecution execution = await compute.SubmitBroadcastAsync(\r\nBroadcastJobTarget.Nodes(nodes),\r\nnew JobDescriptor("org.example.NodeNameJob"),\r\narg: "Hello");\r\n\r\nforeach (IJobExecution jobExecution in execution.JobExecutions)\r\n{\r\nstring jobResult = await jobExecution.GetResultAsync();\r\nConsole.WriteLine($"Job result from node {jobExecution.Node}: {jobResult}");\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n.build();\r\n\r\nbroadcast_execution execution = comp.submit_broadcast(broadcast_job_target::nodes(nodes), job_desc, {std::string("Hello")}, {});\r\nfor (auto &exec: execution.get_job_executions()) {\r\nstd::string result = exec.get_result()->get();\r\n}\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"colocated-execution",children:"Colocated Execution"}),"\n",(0,r.jsx)(n.p,{children:"In Apache Ignite, you can execute colocated computations by specifying a job target that directs the task to run on the node holding the required data."}),"\n",(0,r.jsxs)(n.p,{children:["In the example below, the job runs on the node that owns the partition for the row in the ",(0,r.jsx)(n.code,{children:"accounts"})," table identified by the primary key ",(0,r.jsx)(n.code,{children:"accountNumber"}),".\r\nWe pass the key both to ",(0,r.jsx)(n.code,{children:"JobTarget.colocated()"})," to select the node and as the\r\njob argument, so the job knows which record to read."]}),"\n",(0,r.jsxs)(i.A,{groupId:"programming-languages",children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()) {\r\n\r\n System.out.println("\\nConfiguring compute job...");\r\n\r\n JobDescriptor job = JobDescriptor.builder(PrintAccountInfoJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n int accountNumber = ThreadLocalRandom.current().nextInt(ACCOUNTS_COUNT);\r\n\r\n JobTarget jobTarget = JobTarget.colocated("accounts", accountKey(accountNumber));\r\n client.compute().execute(jobTarget, job, accountNumber);\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'string table = "Person";\r\nstring key = "John";\r\n\r\nIJobExecution execution = await Client.Compute.SubmitAsync(\r\nJobTarget.Colocated(table, key),\r\nnew JobDescriptor("org.example.NodeNameJob"),\r\narg: "Hello");\r\n\r\nstring result = await execution.GetResultAsync();\r\n\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::string table{"Person"};\r\nstd::string key{"John"};\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n.build();\r\n\r\njob_execution execution = comp.submit(job_target::colocated(table, key), job_desc, {std::string("Hello")}, {});\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, you can execute the compute job on all nodes in the cluster that hold partitions for the specified table by creating a ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget.table()"})," target. In this case, Apache Ignite will automatically find all nodes that hold data partitions for the specified table and execute the job on all of them."]}),"\n",(0,r.jsx)(n.h2,{id:"using-qualified-table-names",children:"Using Qualified Table Names"}),"\n",(0,r.jsxs)(n.p,{children:["If you do not specify the table schema, the ",(0,r.jsx)(n.code,{children:"PUBLIC"})," schema will be used. To use a different schema, specify a fully qualified table name. You can provide it in a string or by creating the ",(0,r.jsx)(n.code,{children:"QualifiedName"})," object:"]}),"\n",(0,r.jsxs)(i.A,{groupId:"programming-languages",children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'QualifiedName myTableName = QualifiedName.parse("PUBLIC.MY_QUALIFIED_TABLE");\r\nString executionResult = client.compute()\r\n.execute(\r\nJobTarget.colocated(myTableName, Tuple.create(Map.of("k", 1))),\r\nJobDescriptor.builder(NodeNameJob.class).build(),\r\nnull\r\n);\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.p,{children:"Not supported"})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.p,{children:"Not supported"})})]}),"\n",(0,r.jsxs)(n.p,{children:["Just like with execution on a single node, you can use the ",(0,r.jsx)(n.code,{children:"QualifiedName"})," object to specify a qualified table name and run a job on multiple nodes using ",(0,r.jsx)(n.code,{children:"BroadcastJobTarget"}),":"]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'QualifiedName customSchemaTable = QualifiedName.parse("CUSTOM_SCHEMA.MY_QUALIFIED_TABLE");\r\n\r\nclient.compute().execute(BroadcastJobTarget.table(customSchemaTable), JobDescriptor.builder(HelloMessageJob.class).build(), null);\n'})})})}),"\n",(0,r.jsxs)(n.p,{children:["You can also use the ",(0,r.jsx)(n.code,{children:"of"})," method to instead specify the table name and the schema separately:"]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'QualifiedName customSchemaTableName = QualifiedName.of("PUBLIC", "MY_TABLE");\r\n\r\nclient.compute().execute(BroadcastJobTarget.table(customSchemaTableName), JobDescriptor.builder(HelloMessageJob.class).build(), null);\n'})})})}),"\n",(0,r.jsx)(n.p,{children:"The provided names must follow SQL syntax rules for identifiers:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:'Identifier must start from a character in the "Lu", "Ll", "Lt", "Lm", "Lo", or "Nl" Unicode categories;'}),"\n",(0,r.jsxs)(n.li,{children:["Identifier characters (except for the first one) may be ",(0,r.jsx)(n.code,{children:"U+00B7"})," (middle dot), ",(0,r.jsx)(n.code,{children:"U+0331"}),' (underscore), or any character in the "Mn", "Mc", "Nd", "Pc", or "Cf" Unicode categories;']}),"\n",(0,r.jsx)(n.li,{children:"Identifiers that contain any other characters must be quoted with double-quotes;"}),"\n",(0,r.jsx)(n.li,{children:"Double-quote inside the identifier must be 2 double-quote chars."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Any unquoted names will be cast to upper case. In this case, ",(0,r.jsx)(n.code,{children:"Person"})," and ",(0,r.jsx)(n.code,{children:"PERSON"})," names are equivalent. To avoid this, add escaped quotes around the name. For example, ",(0,r.jsx)(n.code,{children:'\\"Person\\"'})," will be encoded as a case-sensitive ",(0,r.jsx)(n.code,{children:"Person"})," name. If the name contains the ",(0,r.jsx)(n.code,{children:"U+2033"})," (double quote) symbol, it must be escaped as ",(0,r.jsx)(n.code,{children:'""'})," (2 double quote symbols)."]}),"\n",(0,r.jsx)(n.h2,{id:"net-compute-jobs",children:".NET Compute Jobs"}),"\n",(0,r.jsxs)(n.p,{children:["When working with compute jobs written in .NET, resulting binaries (DLL files) should be deployed to server nodes and invoked by the assembly-qualified type name. Every deployment unit combination is loaded into a separate ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/dependency-loading/understanding-assemblyloadcontext",children:"AssemblyLoadContext"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can have multiple versions of the same job (assembly) deployed to the cluster as Apache Ignite supports deployment unit isolation. One job can consist of multiple deployment units. Assemblies and types are looked up in the order you list them."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:[".NET compute jobs are executed in a separate process (",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/architecture/patterns/sidecar",children:"Sidecar"}),") on the server node. The process is started on the first .NET job call and then reused for subsequent jobs."]})}),"\n",(0,r.jsxs)(n.p,{children:["Compute job classes may implement ",(0,r.jsx)(n.code,{children:"IDisposable"})," and ",(0,r.jsx)(n.code,{children:"IAsyncDisposable"})," interfaces. Apache Ignite will call ",(0,r.jsx)(n.code,{children:"Dispose"})," or ",(0,r.jsx)(n.code,{children:"DisposeAsync"})," after job execution whether it succeeds or fails."]}),"\n",(0,r.jsx)(n.h4,{id:"net-compute-requirements",children:".NET Compute Requirements"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:".NET 8 Runtime or later (not SDK) is required on each server node."}),"\n",(0,r.jsx)(n.li,{children:"When using ZIP, DEB, RPM installation, you have to install .NET runtime yourself. Apache Ignite Docker image includes .NET 8 runtime, so you can run .NET jobs in Docker out of the box."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"implementing-net-compute-jobs",children:"Implementing .NET Compute Jobs"}),"\n",(0,r.jsx)(n.p,{children:"Below is an example on implementing a .NET compute job:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:['First, prepare a "class library" project for the job implementation using ',(0,r.jsx)(n.code,{children:"dotnet new classlib"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"In most cases, it is better to use a separate project for compute jobs to reduce deployment size."})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet new classlib -n MyComputeJobs\r\ncd MyComputeJobs\r\ndotnet add package Apache.Ignite\n"})}),"\n",(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["Add a reference to ",(0,r.jsx)(n.code,{children:"Apache.Ignite"})," package to the class library project:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet add package Apache.Ignite\n"})}),"\n",(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsxs)(n.li,{children:["Then create a class that implements ",(0,r.jsx)(n.code,{children:"IComputeJob"})," interface, for example:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'public class HelloJob : IComputeJob\r\n{\r\npublic ValueTask ExecuteAsync(IJobExecutionContext context, string arg, CancellationToken cancellationToken) =>\r\nValueTask.FromResult("Hello " + arg);\r\n}\n'})}),"\n",(0,r.jsxs)(n.ol,{start:"4",children:["\n",(0,r.jsxs)(n.li,{children:["Publish the project by using the ",(0,r.jsx)(n.code,{children:"dotnet publish -c Release"})," command:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet publish -c Release\r\nmkdir deploy\r\ncp bin/Release/net8.0/MyComputeJobs.dll deploy/\r\n# Exclude Ignite assemblies; no subdirectories allowed\r\nignite cluster unit deploy --name MyDotNetJobsUnit --path ./deploy\n"})}),"\n",(0,r.jsxs)(n.ol,{start:"5",children:["\n",(0,r.jsxs)(n.li,{children:["Copy the resulting dll file and any extra dependencies to a separate directory, ",(0,r.jsx)(n.strong,{children:"excluding"})," Apache Ignite dlls."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"The directory with the dll must not contain any subdirectories."})}),"\n",(0,r.jsxs)(n.ol,{start:"6",children:["\n",(0,r.jsxs)(n.li,{children:["Use the Apache Ignite CLI command ",(0,r.jsx)(n.code,{children:"cluster unit deploy command"})," to ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/code-deployment/",children:"deploy"})," the directory to the cluster as a deployment unit. The deployed code will be available on the cluster."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"running-net-compute-jobs",children:"Running .NET Compute Jobs"}),"\n",(0,r.jsxs)(n.p,{children:["You can execute .NET compute jobs from any client (.NET, Java, C++, etc) as long as you created a ",(0,r.jsx)(n.code,{children:"JobDescriptor"})," with the assembly-qualified job class name and set ",(0,r.jsx)(n.code,{children:"JobExecutionOptions"})," with ",(0,r.jsx)(n.code,{children:"JobExecutorType.DotNetSidecar"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"For example, this is how to run your job on a single node from .NET:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var jobTarget = JobTarget.AnyNode(await client.GetClusterNodesAsync());\r\nvar jobDesc = new JobDescriptor(\r\nJobClassName: typeof(HelloJob).AssemblyQualifiedName!,\r\nDeploymentUnits: [new DeploymentUnit("MyDeploymentUnit")],\r\nOptions: new JobExecutionOptions(ExecutorType: JobExecutorType.DotNetSidecar));\r\n\r\nIJobExecution jobExec = await client.Compute.SubmitAsync(jobTarget, jobDesc, "world");\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, use the ",(0,r.jsx)(n.code,{children:"JobDescriptor.Of"})," shortcut method to create a job descriptor from a job instance:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'JobDescriptor jobDesc = JobDescriptor.Of(new HelloJob())\r\nwith { DeploymentUnits = [new DeploymentUnit("MyDeploymentUnit")] };\n'})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["You can call ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/compute/",children:"Java computing jobs"})," from your .NET code, for example:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IList nodes = await client.GetClusterNodesAsync();\r\nIJobTarget> jobTarget = JobTarget.AnyNode(nodes);\r\n\r\nvar jobDesc = new JobDescriptor(JobClassName: "org.foo.bar.MyJob", DeploymentUnits: [new DeploymentUnit("MyDeploymentUnit")]);\r\n\r\nIJobExecution jobExecution = await client.Compute.SubmitAsync(jobTarget, jobDesc, "Job Arg");\r\n\r\nstring jobResult = await jobExecution.GetResultAsync();\n'})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"You can also run .NET compute jobs from Java client, for example:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800")\r\n.build()\r\n) {\r\n\r\nJobDescriptor jobDesc = JobDescriptor.builder().jobClassName("MyNamespace.HelloJob, MyComputeJobsAssembly").deploymentUnits(new DeploymentUnit("MyDeploymentUnit")).executionOptions(new JobExecutionOptions().executorType(JobExecutorType.DotNetSidecar)).build();\r\n\r\nJobTarget jobTarget = JobTarget.anyNode(client.clusterNodes());\r\nfor (String word : "Print words using runnable".split(" ")) {\r\n\r\n System.out.println("\\nExecuting compute job for word \'" + word + "\'...");\r\n\r\n client.compute().execute(jobTarget, job, word);\r\n }\r\n}\r\n\n'})}),"\n",(0,r.jsx)(n.h2,{id:"job-ownership",children:"Job Ownership"}),"\n",(0,r.jsxs)(n.p,{children:["If the cluster has ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/security/authentication",children:"Authentication"})," enabled, compute jobs are executed by a specific user. If user permissions are configured on the cluster, the user needs the appropriate ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/security/authentication",children:"distributed computing permissions"})," to work with distributed computing jobs. Only users with ",(0,r.jsx)(n.code,{children:"JOBS_ADMIN"})," action can interact with jobs of other users."]}),"\n",(0,r.jsx)(n.h2,{id:"job-execution-states",children:"Job Execution States"}),"\n",(0,r.jsx)(n.p,{children:"When using asynchronous API, you can keep track of the status of the job on the server and react to status changes. For example:"}),"\n",(0,r.jsxs)(i.A,{groupId:"programming-languages",children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public static void example() throws ExecutionException, InterruptedException {\r\nIgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800").build();\r\n\r\nCompletableFuture> execution = client.compute().submitAsync(JobTarget.anyNode(client.cluster().nodes()), JobDescriptor.builder(WordPrintJob.class).build(), null);\r\n\r\nexecution.get().stateAsync().thenApply(state -> {\r\n if (state.status() == FAILED) {\r\n System.out.println("\\nJob failed...");\r\n }\r\n return null;\r\n });\r\n System.out.println(execution.resultAsync().get());\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IList nodes = await Client.GetClusterNodesAsync();\r\n\r\nIJobExecution execution = await Client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(nodes),\r\n new JobDescriptor("org.example.NodeNameJob"),\r\n arg: "Hello");\r\n\r\nJobState? state = await execution.GetStateAsync();\r\n\r\nif (state?.Status == JobStatus.Failed)\r\n{\r\n // Handle failure\r\n}\r\n\r\nstring result = await execution.GetResultAsync();\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n\t.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n\t.build();\r\n\r\njob_execution execution = comp.submit(job_target::any_node(nodes), job_desc, {std::string("Hello")}, {});\r\n\r\nstd::optional status = execution.get_status();\r\nif (status && status->state == job_state::FAILED)\r\n{\r\n // Handle failure\r\n}\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"possible-states-and-transitions",children:"Possible States and Transitions"}),"\n",(0,r.jsx)(n.p,{children:"The diagram below depicts the possible transitions of job statuses:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Job Status Diagram",src:t(56728).A+"",width:"1659",height:"728"})}),"\n",(0,r.jsx)(n.p,{children:"The table below lists the possible job statuses:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Status"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Transitions to"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Queued"})}),(0,r.jsx)(n.td,{children:"The job was added to the queue and is waiting for execution."}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"Executing"}),", ",(0,r.jsx)(n.code,{children:"Canceled"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Executing"})}),(0,r.jsx)(n.td,{children:"The job is being executed."}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"Canceling"}),", ",(0,r.jsx)(n.code,{children:"Completed"}),", ",(0,r.jsx)(n.code,{children:"Queued"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Completed"})}),(0,r.jsx)(n.td,{children:"The job was executed successfully and the execution result was returned."}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Failed"})}),(0,r.jsx)(n.td,{children:"The job was unexpectedly terminated during execution."}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Queued"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Canceling"})}),(0,r.jsx)(n.td,{children:"Job has received the cancel command, but is still running."}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"Completed"}),", ",(0,r.jsx)(n.code,{children:"Canceled"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"Canceled"})}),(0,r.jsx)(n.td,{children:"Job was successfully cancelled."}),(0,r.jsx)(n.td,{})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["If all job execution threads are busy, new jobs received by the node are put into job queue according to their ",(0,r.jsx)(n.a,{href:"#job-priority",children:"Job Priority"}),". Apache Ignite sorts all incoming jobs first by priority, then by the time, executing jobs queued earlier first."]}),"\n",(0,r.jsx)(n.h3,{id:"cancelling-executing-jobs",children:"Cancelling Executing Jobs"}),"\n",(0,r.jsxs)(n.p,{children:["When the node receives the command to cancel the job in the ",(0,r.jsx)(n.code,{children:"Executing"})," status, it will immediately send an interrupt to the thread that is responsible for the job. In most cases, this will lead to the job being immediately canceled, however there are cases in which the job will continue. If this happens, the job will be in the ",(0,r.jsx)(n.code,{children:"Canceling"})," state. Depending on specific code being executed, the job may complete successfully, be canceled once the uninterruptible operation is finished, or remain in unfinished state (for example, if code is stuck in a loop). You can use the ",(0,r.jsx)(n.code,{children:"JobExecution.stateAsync()"})," method to keep track of what status the job is in, and react to status change."]}),"\n",(0,r.jsx)(n.p,{children:"To be able to cancel a compute job, you first create a cancel handler and retrieve a token from it. You can then use this token to cancel the compute job:"}),"\n",(0,r.jsxs)(i.A,{groupId:"programming-languages",children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"CancelHandle cancelHandle = CancelHandle.create();\r\nCancellationToken cancelToken = cancelHandle.token();\r\n\r\nCompletableFuture execution = client.compute().executeAsync(JobTarget.anyNode(client.clusterNodes()), JobDescriptor.builder(NodeNameJob.class).build(), cancelToken, null);\r\n\r\ncancelHandle.cancel();\n"})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"var cts = new CancellationTokenSource();\r\nCancellationToken cancelToken = cts.Token;\r\n\r\nvar execution = client.Compute.ExecuteAsync(\r\nJobTarget.AnyNode(await client.GetClusterNodesAsync()),\r\nnew JobDescriptor(typeof(NodeNameJob)),\r\ncancelToken);\r\n\r\ncts.Cancel();\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Another way to cancel jobs is by using the SQL ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/operational-commands#kill-compute",children:"KILL COMPUTE"})," command. The job id can be retrieved via the ",(0,r.jsx)(n.code,{children:"COMPUTE_JOBS"})," ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views",children:"system view"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"job-priority",children:"Job Priority"}),"\n",(0,r.jsxs)(n.p,{children:["You can specify a job priority by setting the ",(0,r.jsx)(n.code,{children:"JobExecutionOptions.priority"})," property. Jobs with a higher priority will be queued before jobs with lower priority (for example, a job with priority 4 will be executed before the job with priority 2)."]}),"\n",(0,r.jsxs)(i.A,{groupId:"programming-languages",children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public static void example() throws ExecutionException, InterruptedException {\r\ntry (IgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800").build()) {\r\n\r\n // Create job execution options\r\n JobExecutionOptions options = JobExecutionOptions.builder().priority(1).build();\r\n\r\n String executionResult = client.compute().execute(JobTarget.anyNode(client.cluster().nodes()),\r\n JobDescriptor.builder(HighPriorityJob.class).options(options).build(), null\r\n );\r\n\r\n System.out.println(executionResult);\r\n }\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var options = JobExecutionOptions.Default with { Priority = 1 };\r\n\r\nIJobExecution execution = await Client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(await Client.GetClusterNodesAsync()),\r\n new JobDescriptor("org.example.NodeNameJob", Options: options),\r\n arg: "Hello");\r\n\r\nstring result = await execution.GetResultAsync();\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nauto job_desc = job_descriptor::builder("org.company.package.NodeNameJob")\r\n\t.deployment_units({deployment_unit{"unitName", "1.1.1"}})\r\n\t.build();\r\n\r\njob_execution_options options{1, 0};\r\njob_execution execution = comp.submit(job_target::any_node(nodes), job_desc, {std::string("Hello")}, std::move(options));\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsx)(n.h3,{id:"job-retries",children:"Job Retries"}),"\n",(0,r.jsxs)(n.p,{children:["You can set the number the job will be retried on failure by setting the ",(0,r.jsx)(n.code,{children:"JobExecutionOptions.maxRetries"})," property. If set, the failed job will be retried the specified number of times before moving to ",(0,r.jsx)(n.code,{children:"Failed"})," state."]}),"\n",(0,r.jsxs)(i.A,{groupId:"programming-languages",children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public static void example() throws ExecutionException, InterruptedException {\r\ntry (IgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800").build()) {\r\n\r\n // Create job execution options with maxRetries set to 5.\r\n JobExecutionOptions options = JobExecutionOptions.builder()\r\n .maxRetries(5)\r\n .build();\r\n\r\n String executionResult = client.compute().execute(JobTarget.anyNode(client.clusterNodes()),\r\n JobDescriptor.builder(NodeNameJob.class).options(options).build(), null\r\n );\r\n\r\n System.out.println(executionResult);\r\n }\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var options = JobExecutionOptions.Default with { MaxRetries = 5 };\r\n\r\nIJobExecution execution = await Client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(await Client.GetClusterNodesAsync()),\r\n new JobDescriptor("org.example.NodeNameJob", Options: options),\r\n arg: "Hello");\r\n\r\nstring result = await execution.GetResultAsync();\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\ncompute comp = client.get_compute();\r\nstd::vector nodes = client.get_nodes();\r\n\r\n// Unit `unitName:1.1.1` contains NodeNameJob class.\r\nstd::vector units{deployment_unit{"unitName", "1.1.1"}};\r\n\r\njob_execution_options options{0, 5};\r\njob_execution execution = comp.submit(nodes, units, NODE_NAME_JOB, {std::string("Hello")}, std::move(options));\r\nstd::string result = execution.get_result()->get();\n'})})})]}),"\n",(0,r.jsx)(n.h2,{id:"job-failover",children:"Job Failover"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite implements mechanics to handle issues that happen during job execution. The following situations are handled:"}),"\n",(0,r.jsx)(n.h3,{id:"worker-node-shutdown",children:"Worker Node Shutdown"}),"\n",(0,r.jsx)(n.p,{children:"If the worker node is shut down, the coordinator node will redistribute all jobs assigned to worker to other viable nodes. If no nodes are found, the job will fail and an exception will be sent to the client."}),"\n",(0,r.jsx)(n.h3,{id:"coordinator-node-shutdown",children:"Coordinator Node Shutdown"}),"\n",(0,r.jsxs)(n.p,{children:["If the coordinator node shuts down, all jobs will be cancelled as soon as the node detects that the coordinator is shut down. Note that ",(0,r.jsx)(n.a,{href:"#cancelling-executing-jobs",children:"some jobs"})," may take a long time to cancel."]}),"\n",(0,r.jsx)(n.h3,{id:"client-disconnect",children:"Client Disconnect"}),"\n",(0,r.jsxs)(n.p,{children:["If the client disconnects, all jobs will be cancelled as soon as the coordinator node detects the disconnect. Note that ",(0,r.jsx)(n.a,{href:"#cancelling-executing-jobs",children:"some jobs"})," may take a long time to cancel."]}),"\n",(0,r.jsx)(n.h2,{id:"mapreduce-tasks",children:"MapReduce Tasks"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite provides an API for performing MapReduce operations in the cluster. This allows you to split your computing task between multiple nodes before aggregating the result and returning it to the user."}),"\n",(0,r.jsx)(n.h3,{id:"understanding-mapreduce-tasks",children:"Understanding MapReduce Tasks"}),"\n",(0,r.jsxs)(n.p,{children:["A MapReduce task must be executed on a node that has a ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/code-deployment/",children:"deployed"})," class implementing the ",(0,r.jsx)(n.code,{children:"MapReduceTask"})," interface. This interface provides a way to implement custom map and reduce logic. A node that receives the task becomes a coordinator node, that will be responsible for both mapping tasks to other nodes, reducing their results and returning the final result to the client."]}),"\n",(0,r.jsxs)(n.p,{children:["The class must implement two methods: ",(0,r.jsx)(n.code,{children:"splitAsync"})," and ",(0,r.jsx)(n.code,{children:"reduceAsync"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"splitAsync()"})," method should be implemented to create compute jobs based on input parameters and map them to worker nodes. The method receives the execution context and your task arguments and returns a completable future containing the list of the job descriptors that will be sent to the worker nodes."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"reduceAsync()"})," method is called during the reduce step, when all the jobs have completed. The method receives a map from the worker node to the completed job result and returns the final result of the computation."]}),"\n",(0,r.jsx)(n.h3,{id:"creating-a-mapper-class",children:"Creating a Mapper Class"}),"\n",(0,r.jsxs)(n.p,{children:["All MapReduce jobs must be submitted to a node that has an appropriate class ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/code-deployment/",children:"deployed"}),". Below is an example of a map reduce job:"]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'public static class PhraseWordLengthCountMapReduceTask implements MapReduceTask {\r\n /** {@inheritDoc} */\r\n @Override\r\n public CompletableFuture>> splitAsync(\r\n TaskExecutionContext taskContext,\r\n String input) {\r\n assert input != null;\r\n\r\n var job = JobDescriptor.builder(WordLengthJob.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n List> jobs = new ArrayList<>();\r\n\r\n for (String word : input.split(" ")) {\r\n jobs.add(\r\n MapReduceJob.builder()\r\n .jobDescriptor(job)\r\n .nodes(taskContext.ignite().cluster().nodes())\r\n .args(word)\r\n .build()\r\n );\r\n }\r\n\r\n return completedFuture(jobs);\r\n }\r\n\r\n /** {@inheritDoc} */\r\n @Override\r\n public CompletableFuture reduceAsync(TaskExecutionContext taskContext, Map results) {\r\n return completedFuture(results.values().stream()\r\n .reduce(Integer::sum)\r\n .orElseThrow());\r\n }\r\n}\n'})})})}),"\n",(0,r.jsx)(n.h3,{id:"executing-a-mapreduce-task",children:"Executing a MapReduce Task"}),"\n",(0,r.jsx)(n.p,{children:"To execute the MapReduce task, you use one of the following methods:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"submitMapReduce()"})," - sends the MapReduce job to the cluster and returns the ",(0,r.jsx)(n.code,{children:"TaskExecution"})," object that can be used to monitor or modify the compute task execution."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"executeMapReduceAsync()"})," - sends the MapReduce job to the cluster in the cluster and gets the future for job execution results."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"executeMapReduce()"})," - sends the job to the cluster and waits for the result of job execution."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["The node that the MapReduce task is sent to must have a class implementing the ",(0,r.jsx)(n.code,{children:"MapReduceTask"})," interface."]}),"\n",(0,r.jsxs)(i.A,{groupId:"programming-languages",children:[(0,r.jsx)(a.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("127.0.0.1:10800").build()) {\r\n\r\n System.out.println("\\nConfiguring map reduce task...");\r\n\r\n\r\n TaskDescriptor taskDescriptor = TaskDescriptor.builder(PhraseWordLengthCountMapReduceTask.class)\r\n .units(new DeploymentUnit(DEPLOYMENT_UNIT_NAME, DEPLOYMENT_UNIT_VERSION))\r\n .build();\r\n\r\n\r\n System.out.println("\\nExecuting map reduce task...");\r\n\r\n String phrase = "Count characters using map reduce";\r\n\r\n Integer result = client.compute().executeMapReduce(taskDescriptor, phrase);\r\n\r\n\r\n System.out.println("\\nTotal number of characters in the words is \'" + result + "\'.");\r\n}\n'})})}),(0,r.jsx)(a.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'ICompute compute = Client.Compute;\r\nvar taskDescriptor = new TaskDescriptor("com.example.MapReduceNodeNameTask");\r\nITaskExecution exec = await compute.SubmitMapReduceAsync(taskDescriptor, "arg");\r\nstring result = await exec.GetResultAsync();\r\nConsole.WriteLine(result);\n'})})}),(0,r.jsx)(a.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.p,{children:"Not supported"})})]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},56728:(e,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/compute_job_statuses-53d7f77902c262ae8b36669ac7d8ef26.png"}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6d14130f.a1e2cabf.js b/docs/ignite3/assets/js/6d14130f.a1e2cabf.js deleted file mode 100644 index 3b7d12ae08..0000000000 --- a/docs/ignite3/assets/js/6d14130f.a1e2cabf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[748],{28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(96540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}},91464:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"administrators-guide/colocation","title":"Data Colocation","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/colocation.md","sourceDirName":"administrators-guide","slug":"/administrators-guide/colocation","permalink":"/docs/ignite3/3.0.0/administrators-guide/colocation","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Data Colocation","sidebar_label":"Data Colocation"},"sidebar":"tutorialSidebar","previous":{"title":"Cluster Lifecycle","permalink":"/docs/ignite3/3.0.0/administrators-guide/lifecycle"},"next":{"title":"Disaster Recovery for Data Partitions","permalink":"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery"}}');var a=o(74848),i=o(28453);const r={title:"Data Colocation",sidebar_label:"Data Colocation"},c="Data Colocation",s={},d=[{value:"Configuring Colocation Key",id:"configuring-colocation-key",level:2}];function l(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:["\n",(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"data-colocation",children:"Data Colocation"})}),"\n",(0,a.jsx)(n.p,{children:"In many cases you may want to store related data on the same node. This way multi-entry queries do not need to pull data from other nodes and are thus executed faster."}),"\n",(0,a.jsx)(n.p,{children:"When the table is created, you can choose the key that will be used to colocate data."}),"\n",(0,a.jsxs)(n.p,{children:["For example, if you have ",(0,a.jsx)(n.code,{children:"Person"})," and ",(0,a.jsx)(n.code,{children:"Company"})," objects, and each person has the companyId field that indicates the company the person works for. By specifying the ",(0,a.jsx)(n.code,{children:"Person.companyId"})," and ",(0,a.jsx)(n.code,{children:"Company.ID"})," as colocation keys, you ensure that all the persons working for the same company are stored on the same node, where the company object is stored as well. Queries that request persons working for a specific company are processed on a single node."]}),"\n",(0,a.jsx)(n.h2,{id:"configuring-colocation-key",children:"Configuring Colocation Key"}),"\n",(0,a.jsxs)(n.p,{children:["Data colocation is configured during table creation by using the ",(0,a.jsx)(n.code,{children:"COLOCATE BY"})," clause. The columns used to colocate data must be in the primary key and must be specified in the same order as the ",(0,a.jsx)(n.code,{children:"PRIMARY KEY"})," of the main table."]}),"\n",(0,a.jsxs)(n.p,{children:["For example, the table below will colocate data for people based on the ",(0,a.jsx)(n.code,{children:"city_id"})," column:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int,\r\n city_id int primary key,\r\n name varchar,\r\n age int,\r\n company varchar\r\n) COLOCATE BY (city_id)\n"})}),"\n",(0,a.jsx)(n.p,{children:"When using composite primary keys, you can specify multiple columns to colocate data by:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"CREATE TABLE Company (\r\n company_id int,\r\n department_id int,\r\n city_id int,\r\n company_name timestamp,\r\n PRIMARY KEY (company_id, city_id)\r\n)\r\n\r\nCREATE TABLE IF NOT EXISTS Person (\r\n id int,\r\n city_id int,\r\n name varchar,\r\n age int,\r\n company_id int,\r\n PRIMARY KEY (id, company_id, city_id)\r\n)\r\nCOLOCATE BY (company_id, city_id)\n"})}),"\n",(0,a.jsx)(n.p,{children:"In this case, Ignite will try to colocate these tables together for storage."}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"COLOCATE BY"})," clause of colocated table (",(0,a.jsx)(n.code,{children:"Person"})," table in the example above) must contain the same set of columns and in the same order as the ",(0,a.jsx)(n.code,{children:"PRIMARY KEY"})," clause of the main table (Company table in the example above) to colocate the data."]})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6d99e875.5cb33887.js b/docs/ignite3/assets/js/6d99e875.5cb33887.js deleted file mode 100644 index 4099034119..0000000000 --- a/docs/ignite3/assets/js/6d99e875.5cb33887.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2108],{28453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>i});var r=s(96540);const o={},t=r.createContext(o);function d(e){const n=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),r.createElement(t.Provider,{value:n},e.children)}},90738:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>d,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"api-reference/native-clients/java/network-api","title":"Network API","description":"The Network API provides access to cluster topology information. Applications use this API to discover nodes, inspect network addresses, and access node metadata. This information supports compute job targeting, monitoring, and cluster awareness.","source":"@site/docs/api-reference/native-clients/java/network-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/network-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"Network API","id":"network-api","sidebar_position":10},"sidebar":"tutorialSidebar","previous":{"title":"Criteria API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api"},"next":{"title":"Security API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api"}}');var o=s(74848),t=s(28453);const d={title:"Network API",id:"network-api",sidebar_position:10},i="Network API",l={},c=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Cluster Access",id:"cluster-access",level:2},{value:"Asynchronous Node Discovery",id:"asynchronous-node-discovery",level:2},{value:"Local Node Information",id:"local-node-information",level:2},{value:"Node Identification",id:"node-identification",level:2},{value:"Network Addresses",id:"network-addresses",level:2},{value:"Address Construction",id:"address-construction",level:2},{value:"Node Metadata",id:"node-metadata",level:2},{value:"Client Connections",id:"client-connections",level:2},{value:"Node Selection",id:"node-selection",level:2},{value:"Multiple Node Selection",id:"multiple-node-selection",level:2},{value:"Compute Job Targeting",id:"compute-job-targeting",level:2},{value:"Address Parsing",id:"address-parsing",level:2},{value:"Address Formatting",id:"address-formatting",level:2},{value:"Deprecated API",id:"deprecated-api",level:2},{value:"Node Comparison",id:"node-comparison",level:2},{value:"Reference",id:"reference",level:2},{value:"IgniteCluster Methods",id:"ignitecluster-methods",level:3},{value:"ClusterNode Methods",id:"clusternode-methods",level:3},{value:"NetworkAddress Methods",id:"networkaddress-methods",level:3},{value:"NetworkAddress Construction",id:"networkaddress-construction",level:3},{value:"IgniteClient Connection Methods",id:"igniteclient-connection-methods",level:3},{value:"Ignite Node Methods",id:"ignite-node-methods",level:3},{value:"Topology Use Cases",id:"topology-use-cases",level:3}];function a(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"network-api",children:"Network API"})}),"\n",(0,o.jsx)(n.p,{children:"The Network API provides access to cluster topology information. Applications use this API to discover nodes, inspect network addresses, and access node metadata. This information supports compute job targeting, monitoring, and cluster awareness."}),"\n",(0,o.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,o.jsx)(n.p,{children:"ClusterNode represents individual nodes in the cluster. Each node has a unique identifier, consistent name, network address, and metadata. The IgniteCluster facade provides access to topology information including all cluster members and the local node."}),"\n",(0,o.jsx)(n.p,{children:"Network addresses identify node endpoints using host and port combinations. Applications parse addresses from strings or construct them programmatically."}),"\n",(0,o.jsx)(n.h2,{id:"cluster-access",children:"Cluster Access"}),"\n",(0,o.jsx)(n.p,{children:"Access cluster topology through the cluster facade:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'IgniteCluster cluster = ignite.cluster();\r\n\r\nCollection nodes = cluster.nodes();\r\nSystem.out.println("Cluster has " + nodes.size() + " nodes");\r\n\r\nfor (ClusterNode node : nodes) {\r\n System.out.println("Node: " + node.name() + " at " + node.address());\r\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"asynchronous-node-discovery",children:"Asynchronous Node Discovery"}),"\n",(0,o.jsx)(n.p,{children:"Retrieve nodes asynchronously:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'CompletableFuture> nodesFuture = cluster.nodesAsync();\r\n\r\nnodesFuture.thenAccept(nodes -> {\r\n for (ClusterNode node : nodes) {\r\n System.out.println("Found node: " + node.name());\r\n }\r\n});\n'})}),"\n",(0,o.jsx)(n.p,{children:"Asynchronous access avoids blocking when topology information requires network calls."}),"\n",(0,o.jsx)(n.h2,{id:"local-node-information",children:"Local Node Information"}),"\n",(0,o.jsx)(n.p,{children:"Access the local node:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'ClusterNode local = ignite.cluster().localNode();\r\n\r\nSystem.out.println("Local node ID: " + local.id());\r\nSystem.out.println("Local node name: " + local.name());\r\nSystem.out.println("Local address: " + local.address());\n'})}),"\n",(0,o.jsx)(n.p,{children:"The local node represents the current Ignite instance within the cluster."}),"\n",(0,o.jsx)(n.h2,{id:"node-identification",children:"Node Identification"}),"\n",(0,o.jsx)(n.p,{children:"Access node identifiers:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'ClusterNode node = cluster.localNode();\r\n\r\nUUID nodeId = node.id();\r\nString nodeName = node.name();\r\n\r\nSystem.out.println("Node ID: " + nodeId);\r\nSystem.out.println("Node name: " + nodeName);\n'})}),"\n",(0,o.jsx)(n.p,{children:"The node ID uniquely identifies the node. The node name provides a human-readable consistent identifier."}),"\n",(0,o.jsx)(n.h2,{id:"network-addresses",children:"Network Addresses"}),"\n",(0,o.jsx)(n.p,{children:"Access node network endpoints:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'ClusterNode node = cluster.localNode();\r\nNetworkAddress address = node.address();\r\n\r\nString host = address.host();\r\nint port = address.port();\r\n\r\nSystem.out.println("Host: " + host);\r\nSystem.out.println("Port: " + port);\n'})}),"\n",(0,o.jsx)(n.p,{children:"NetworkAddress identifies the node endpoint for client connections."}),"\n",(0,o.jsx)(n.h2,{id:"address-construction",children:"Address Construction"}),"\n",(0,o.jsx)(n.p,{children:"Create network addresses programmatically:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'NetworkAddress address1 = new NetworkAddress("localhost", 10800);\r\n\r\nNetworkAddress address2 = NetworkAddress.from("192.168.1.100:10800");\r\n\r\nInetSocketAddress socketAddress = new InetSocketAddress("server.example.com", 10800);\r\nNetworkAddress address3 = NetworkAddress.from(socketAddress);\n'})}),"\n",(0,o.jsx)(n.p,{children:"The from method parses addresses from strings or socket addresses."}),"\n",(0,o.jsx)(n.h2,{id:"node-metadata",children:"Node Metadata"}),"\n",(0,o.jsx)(n.p,{children:"Access node metadata:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:"ClusterNode node = cluster.localNode();\r\nNodeMetadata metadata = node.nodeMetadata();\r\n\r\n// Access metadata properties\r\n// (specific metadata content depends on configuration)\n"})}),"\n",(0,o.jsx)(n.p,{children:"Node metadata contains additional node-specific information configured during cluster setup."}),"\n",(0,o.jsx)(n.h2,{id:"client-connections",children:"Client Connections"}),"\n",(0,o.jsx)(n.p,{children:"Thin clients can access active connections:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'List connections = client.connections();\r\n\r\nSystem.out.println("Connected to " + connections.size() + " servers");\r\n\r\nfor (ClusterNode node : connections) {\r\n System.out.println("Connected to: " + node.name() +\r\n " at " + node.address());\r\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:"The connections list shows servers with active client connections."}),"\n",(0,o.jsx)(n.h2,{id:"node-selection",children:"Node Selection"}),"\n",(0,o.jsx)(n.p,{children:"Select specific nodes for operations:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'Collection allNodes = ignite.clusterNodes();\r\n\r\n// Find node by name\r\nClusterNode targetNode = allNodes.stream()\r\n .filter(node -> node.name().equals("node-1"))\r\n .findFirst()\r\n .orElse(null);\r\n\r\nif (targetNode != null) {\r\n System.out.println("Found node at " + targetNode.address());\r\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"multiple-node-selection",children:"Multiple Node Selection"}),"\n",(0,o.jsx)(n.p,{children:"Filter nodes by criteria:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'Collection allNodes = ignite.clusterNodes();\r\n\r\n// Select nodes by port\r\nList portFiltered = allNodes.stream()\r\n .filter(node -> node.address().port() == 10800)\r\n .collect(Collectors.toList());\r\n\r\n// Select nodes by hostname pattern\r\nList hostFiltered = allNodes.stream()\r\n .filter(node -> node.address().host().contains("prod"))\r\n .collect(Collectors.toList());\n'})}),"\n",(0,o.jsx)(n.h2,{id:"compute-job-targeting",children:"Compute Job Targeting"}),"\n",(0,o.jsx)(n.p,{children:"Use node information for compute operations:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'Collection nodes = ignite.clusterNodes();\r\n\r\nJobDescriptor descriptor =\r\n JobDescriptor.builder("com.example.DataProcessor").build();\r\n\r\n// Execute on all nodes\r\nfor (ClusterNode node : nodes) {\r\n CompletableFuture> executionFuture =\r\n ignite.compute().submitAsync(\r\n JobTarget.node(node),\r\n descriptor,\r\n "input"\r\n );\r\n\r\n executionFuture.thenCompose(JobExecution::resultAsync)\r\n .thenAccept(result -> {\r\n System.out.println("Job result from " + node.name() + ": " + result);\r\n });\r\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"address-parsing",children:"Address Parsing"}),"\n",(0,o.jsx)(n.p,{children:"Parse addresses from configuration strings:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'String[] serverAddresses = {\r\n "server1.example.com:10800",\r\n "server2.example.com:10800",\r\n "192.168.1.100:10800"\r\n};\r\n\r\nList addresses = Arrays.stream(serverAddresses)\r\n .map(NetworkAddress::from)\r\n .collect(Collectors.toList());\r\n\r\nfor (NetworkAddress addr : addresses) {\r\n System.out.println("Server: " + addr.host() + ":" + addr.port());\r\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"address-formatting",children:"Address Formatting"}),"\n",(0,o.jsx)(n.p,{children:"Format addresses for display:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'NetworkAddress address = node.address();\r\n\r\nString formatted = address.host() + ":" + address.port();\r\nSystem.out.println("Node endpoint: " + formatted);\r\n\r\n// Address toString provides formatted output\r\nString automatic = address.toString();\n'})}),"\n",(0,o.jsx)(n.h2,{id:"deprecated-api",children:"Deprecated API"}),"\n",(0,o.jsx)(n.p,{children:"The clusterNodes method on Ignite is deprecated:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:"// Deprecated\r\nCollection nodes1 = ignite.clusterNodes();\r\n\r\n// Preferred\r\nCollection nodes2 = ignite.cluster().nodes();\n"})}),"\n",(0,o.jsx)(n.p,{children:"Use the cluster facade for topology access."}),"\n",(0,o.jsx)(n.h2,{id:"node-comparison",children:"Node Comparison"}),"\n",(0,o.jsx)(n.p,{children:"Compare nodes by identity:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'ClusterNode node1 = cluster.localNode();\r\nClusterNode node2 = nodes.iterator().next();\r\n\r\nboolean same = node1.id().equals(node2.id());\r\nif (same) {\r\n System.out.println("Same node");\r\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:"Compare nodes using their UUID identifiers."}),"\n",(0,o.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Cluster facade: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.network.IgniteCluster"})]}),"\n",(0,o.jsxs)(n.li,{children:["Node representation: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.network.ClusterNode"})]}),"\n",(0,o.jsxs)(n.li,{children:["Network address: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.network.NetworkAddress"})]}),"\n",(0,o.jsxs)(n.li,{children:["Node metadata: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.network.NodeMetadata"})]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"ignitecluster-methods",children:"IgniteCluster Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Collection nodes()"})," - Get all cluster nodes"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"CompletableFuture> nodesAsync()"})," - Async get nodes"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"ClusterNode localNode()"})," - Get local node"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"clusternode-methods",children:"ClusterNode Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"UUID id()"})," - Get node unique identifier"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"String name()"})," - Get node name (consistent ID)"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"NetworkAddress address()"})," - Get network address"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"NodeMetadata nodeMetadata()"})," - Get node metadata"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"networkaddress-methods",children:"NetworkAddress Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"String host()"})," - Get hostname"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"int port()"})," - Get port number"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"networkaddress-construction",children:"NetworkAddress Construction"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"NetworkAddress(String host, int port)"})," - Create from components"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"static NetworkAddress from(String)"}),' - Parse from "host',":port",'" string']}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"static NetworkAddress from(InetSocketAddress)"})," - Convert from socket address"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"igniteclient-connection-methods",children:"IgniteClient Connection Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"List connections()"})," - Get active server connections"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"ignite-node-methods",children:"Ignite Node Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Collection clusterNodes()"})," - Get all nodes (deprecated, use cluster().nodes())"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"topology-use-cases",children:"Topology Use Cases"}),"\n",(0,o.jsx)(n.p,{children:"Node information supports several common patterns:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Compute job targeting based on node location or capabilities"}),"\n",(0,o.jsx)(n.li,{children:"Monitoring and diagnostics of cluster health"}),"\n",(0,o.jsx)(n.li,{children:"Connection management for thin clients"}),"\n",(0,o.jsx)(n.li,{children:"Custom load balancing and data locality optimization"}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/6dd34219.832988e0.js b/docs/ignite3/assets/js/6dd34219.832988e0.js deleted file mode 100644 index 12fadeea62..0000000000 --- a/docs/ignite3/assets/js/6dd34219.832988e0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7366],{28453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>a});var r=i(96540);const s={},o=r.createContext(s);function c(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(o.Provider,{value:n},e.children)}},88242:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configure-and-operate/configuration/index","title":"Configuration","description":"Configuration options for Apache Ignite 3 clusters and nodes.","source":"@site/docs/configure-and-operate/configuration/index.mdx","sourceDirName":"configure-and-operate/configuration","slug":"/configure-and-operate/configuration/","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Kubernetes","permalink":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes"},"next":{"title":"Cluster and Nodes","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes"}}');var s=i(74848),o=i(28453);const c={title:"Configuration"},a="Configuration",t={},d=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components},{IIcon:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,s.jsx)(n.p,{children:"Configuration options for Apache Ignite 3 clusters and nodes."}),"\n",(0,s.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:cog-outline",height:"24"})," Cluster and Node Configuration"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Configure cluster topology, node settings, and network parameters."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./configuration/config-cluster-and-nodes",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:harddisk",height:"24"})," Storage Configuration"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Configure storage engines, profiles, and data persistence options."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./configuration/config-storage-overview",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:shield-account-outline",height:"24"})," Authentication"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Enable and configure authentication and user management."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./configuration/config-authentication",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:lock-outline",height:"24"})," SSL/TLS"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Configure SSL/TLS encryption for secure communications."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./configuration/config-ssl-tls",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:chart-line",height:"24"})," Metrics Configuration"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Configure metrics collection and export for monitoring."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./configuration/metrics-configuration",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:security",height:"24"})," Cluster Security"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Security features and best practices for production clusters."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./configuration/config-cluster-security",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"operations",children:"Operations"})," - Cluster lifecycle management"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"monitoring",children:"Monitoring"})," - Monitor cluster health"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"reference",children:"Configuration Reference"})," - Complete config reference"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/70598898.c51cb51a.js b/docs/ignite3/assets/js/70598898.c51cb51a.js deleted file mode 100644 index ca10047e20..0000000000 --- a/docs/ignite3/assets/js/70598898.c51cb51a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7076],{28453:(e,n,r)=>{r.d(n,{R:()=>d,x:()=>i});var s=r(96540);const t={},o=s.createContext(t);function d(e){const n=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),s.createElement(o.Provider,{value:n},e.children)}},38964:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>d,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"api-reference/native-clients/cpp/network-api","title":"Network API","description":"The Network API provides access to cluster topology information. It exposes cluster node metadata used for compute job targeting and cluster monitoring.","source":"@site/docs/api-reference/native-clients/cpp/network-api.md","sourceDirName":"api-reference/native-clients/cpp","slug":"/api-reference/native-clients/cpp/network-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"Network API","id":"network-api","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"Compute API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api"},"next":{"title":"SQL-Only APIs","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/"}}');var t=r(74848),o=r(28453);const d={title:"Network API",id:"network-api",sidebar_position:6},i="Network API",c={},a=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Cluster Nodes",id:"cluster-nodes",level:3},{value:"Node Identity",id:"node-identity",level:3},{value:"Network Addresses",id:"network-addresses",level:3},{value:"Cluster Node",id:"cluster-node",level:2},{value:"Node Properties",id:"node-properties",level:3},{value:"Accessing Node Information",id:"accessing-node-information",level:3},{value:"Node Comparison",id:"node-comparison",level:3},{value:"Retrieving Cluster Nodes",id:"retrieving-cluster-nodes",level:2},{value:"Synchronous Retrieval",id:"synchronous-retrieval",level:3},{value:"Asynchronous Retrieval",id:"asynchronous-retrieval",level:3},{value:"Use Cases",id:"use-cases",level:2},{value:"Node Selection for Compute",id:"node-selection-for-compute",level:3},{value:"Finding Specific Nodes",id:"finding-specific-nodes",level:3},{value:"Cluster Monitoring",id:"cluster-monitoring",level:3},{value:"Broadcasting to All Nodes",id:"broadcasting-to-all-nodes",level:3},{value:"Node Filtering",id:"node-filtering",level:3},{value:"Round-Robin Selection",id:"round-robin-selection",level:3},{value:"Node Lifecycle",id:"node-lifecycle",level:2},{value:"Node Restart Impact",id:"node-restart-impact",level:3},{value:"Topology Changes",id:"topology-changes",level:3},{value:"Error Handling",id:"error-handling",level:2},{value:"Network Errors",id:"network-errors",level:3},{value:"Empty Topology",id:"empty-topology",level:3},{value:"Integration with Compute API",id:"integration-with-compute-api",level:2},{value:"Job Targeting",id:"job-targeting",level:3},{value:"Node Affinity",id:"node-affinity",level:3},{value:"Best Practices",id:"best-practices",level:2},{value:"Cache Topology Information",id:"cache-topology-information",level:3},{value:"Use Stable References",id:"use-stable-references",level:3},{value:"Handle Dynamic Topology",id:"handle-dynamic-topology",level:3},{value:"Reference",id:"reference",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"network-api",children:"Network API"})}),"\n",(0,t.jsx)(n.p,{children:"The Network API provides access to cluster topology information. It exposes cluster node metadata used for compute job targeting and cluster monitoring."}),"\n",(0,t.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,t.jsx)(n.h3,{id:"cluster-nodes",children:"Cluster Nodes"}),"\n",(0,t.jsx)(n.p,{children:"Cluster nodes represent individual server instances in the Ignite cluster. Each node has a unique identifier, a stable name, and network address information."}),"\n",(0,t.jsx)(n.h3,{id:"node-identity",children:"Node Identity"}),"\n",(0,t.jsx)(n.p,{children:"Nodes have two forms of identification:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Node ID"})," - A UUID that changes when the node restarts"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Node Name"})," - A stable string name that persists across restarts"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Use node names for stable references. Use node IDs for runtime identification."}),"\n",(0,t.jsx)(n.h3,{id:"network-addresses",children:"Network Addresses"}),"\n",(0,t.jsx)(n.p,{children:"Each node exposes a network endpoint containing host and port information. Clients use these addresses to establish connections for operations."}),"\n",(0,t.jsx)(n.h2,{id:"cluster-node",children:"Cluster Node"}),"\n",(0,t.jsx)(n.h3,{id:"node-properties",children:"Node Properties"}),"\n",(0,t.jsx)(n.p,{children:"Cluster nodes provide three key properties:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:"using namespace ignite;\r\n\r\nauto nodes = client.get_cluster_nodes();\r\nfor (const auto& node : nodes) {\r\n // Unique ID (changes on restart)\r\n uuid id = node.get_id();\r\n\r\n // Stable name (persists across restarts)\r\n std::string name = node.get_name();\r\n\r\n // Network address\r\n end_point address = node.get_address();\r\n}\n"})}),"\n",(0,t.jsx)(n.h3,{id:"accessing-node-information",children:"Accessing Node Information"}),"\n",(0,t.jsx)(n.p,{children:"Get the node ID:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'uuid node_id = node.get_id();\r\nstd::cout << "Node ID: " << node_id << std::endl;\n'})}),"\n",(0,t.jsx)(n.p,{children:"Get the node name:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'std::string node_name = node.get_name();\r\nstd::cout << "Node: " << node_name << std::endl;\n'})}),"\n",(0,t.jsx)(n.p,{children:"Get the network address:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'end_point addr = node.get_address();\r\nstd::cout << "Host: " << addr.host << std::endl;\r\nstd::cout << "Port: " << addr.port << std::endl;\n'})}),"\n",(0,t.jsx)(n.h3,{id:"node-comparison",children:"Node Comparison"}),"\n",(0,t.jsx)(n.p,{children:"Cluster nodes support full comparison:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'cluster_node node1 = nodes[0];\r\ncluster_node node2 = nodes[1];\r\n\r\nif (node1 == node2) {\r\n std::cout << "Same node" << std::endl;\r\n}\r\n\r\nif (node1 < node2) {\r\n std::cout << "node1 sorts before node2" << std::endl;\r\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"Comparison enables sorting and set operations:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:"// Sort nodes by name\r\nstd::sort(nodes.begin(), nodes.end(),\r\n [](const auto& n1, const auto& n2) {\r\n return n1.get_name() < n2.get_name();\r\n });\r\n\r\n// Create a set of nodes\r\nstd::set node_set(nodes.begin(), nodes.end());\n"})}),"\n",(0,t.jsx)(n.h2,{id:"retrieving-cluster-nodes",children:"Retrieving Cluster Nodes"}),"\n",(0,t.jsx)(n.h3,{id:"synchronous-retrieval",children:"Synchronous Retrieval"}),"\n",(0,t.jsx)(n.p,{children:"Get all cluster nodes:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'auto nodes = client.get_cluster_nodes();\r\n\r\nstd::cout << "Cluster has " << nodes.size() << " nodes" << std::endl;\r\n\r\nfor (const auto& node : nodes) {\r\n std::cout << node.get_name() << " at "\r\n << node.get_address().host << ":"\r\n << node.get_address().port << std::endl;\r\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"asynchronous-retrieval",children:"Asynchronous Retrieval"}),"\n",(0,t.jsx)(n.p,{children:"Get nodes without blocking:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'client.get_cluster_nodes_async([](ignite_result> result) {\r\n if (!result.has_error()) {\r\n auto nodes = std::move(result).value();\r\n std::cout << "Found " << nodes.size() << " nodes" << std::endl;\r\n } else {\r\n std::cerr << "Error: " << result.error().what_str() << std::endl;\r\n }\r\n});\n'})}),"\n",(0,t.jsx)(n.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,t.jsx)(n.h3,{id:"node-selection-for-compute",children:"Node Selection for Compute"}),"\n",(0,t.jsx)(n.p,{children:"Select specific nodes for job execution:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:"auto nodes = client.get_cluster_nodes();\r\n\r\n// Execute on first node\r\nif (!nodes.empty()) {\r\n auto target = job_target::node(nodes[0]);\r\n auto execution = client.get_compute().submit(target, descriptor, arg);\r\n}\r\n\r\n// Execute on any node\r\nauto target = job_target::any_node(nodes);\r\nauto execution = client.get_compute().submit(target, descriptor, arg);\n"})}),"\n",(0,t.jsx)(n.h3,{id:"finding-specific-nodes",children:"Finding Specific Nodes"}),"\n",(0,t.jsx)(n.p,{children:"Locate nodes by name:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'auto nodes = client.get_cluster_nodes();\r\n\r\nauto it = std::find_if(nodes.begin(), nodes.end(),\r\n [](const auto& node) {\r\n return node.get_name() == "my-node-01";\r\n });\r\n\r\nif (it != nodes.end()) {\r\n cluster_node target_node = *it;\r\n // Use node\r\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"cluster-monitoring",children:"Cluster Monitoring"}),"\n",(0,t.jsx)(n.p,{children:"Monitor cluster size:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'auto nodes = client.get_cluster_nodes();\r\nsize_t cluster_size = nodes.size();\r\n\r\nif (cluster_size < 3) {\r\n std::cerr << "Warning: Cluster has only " << cluster_size << " nodes" << std::endl;\r\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"Track node addresses:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'std::map node_map;\r\n\r\nfor (const auto& node : nodes) {\r\n node_map[node.get_name()] = node.get_address();\r\n}\r\n\r\n// Check if specific node is available\r\nif (node_map.find("my-node-01") != node_map.end()) {\r\n std::cout << "Node my-node-01 is online" << std::endl;\r\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"broadcasting-to-all-nodes",children:"Broadcasting to All Nodes"}),"\n",(0,t.jsx)(n.p,{children:"Execute jobs on all cluster nodes:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'auto nodes = client.get_cluster_nodes();\r\nstd::set node_set(nodes.begin(), nodes.end());\r\n\r\nauto target = broadcast_job_target::nodes(node_set);\r\nauto broadcast = client.get_compute().submit_broadcast(target, descriptor, arg);\r\n\r\nauto executions = broadcast.get_job_executions();\r\nstd::cout << "Broadcast to " << executions.size() << " nodes" << std::endl;\n'})}),"\n",(0,t.jsx)(n.h3,{id:"node-filtering",children:"Node Filtering"}),"\n",(0,t.jsx)(n.p,{children:"Filter nodes by criteria:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'auto nodes = client.get_cluster_nodes();\r\n\r\n// Get nodes on specific host\r\nstd::vector local_nodes;\r\nstd::copy_if(nodes.begin(), nodes.end(), std::back_inserter(local_nodes),\r\n [](const auto& node) {\r\n return node.get_address().host == "192.168.1.100";\r\n });\r\n\r\n// Get nodes in port range\r\nstd::vector dev_nodes;\r\nstd::copy_if(nodes.begin(), nodes.end(), std::back_inserter(dev_nodes),\r\n [](const auto& node) {\r\n return node.get_address().port >= 10800 && node.get_address().port < 10900;\r\n });\n'})}),"\n",(0,t.jsx)(n.h3,{id:"round-robin-selection",children:"Round-Robin Selection"}),"\n",(0,t.jsx)(n.p,{children:"Distribute work across nodes:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:"auto nodes = client.get_cluster_nodes();\r\nsize_t current_index = 0;\r\n\r\nfor (const auto& task : tasks) {\r\n auto target = job_target::node(nodes[current_index]);\r\n compute.submit(target, descriptor, task);\r\n\r\n current_index = (current_index + 1) % nodes.size();\r\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"node-lifecycle",children:"Node Lifecycle"}),"\n",(0,t.jsx)(n.h3,{id:"node-restart-impact",children:"Node Restart Impact"}),"\n",(0,t.jsx)(n.p,{children:"When a node restarts:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Node ID changes to a new UUID"}),"\n",(0,t.jsx)(n.li,{children:"Node name remains the same"}),"\n",(0,t.jsx)(n.li,{children:"Network address typically remains the same"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Use node names for stable node references across restarts."}),"\n",(0,t.jsx)(n.h3,{id:"topology-changes",children:"Topology Changes"}),"\n",(0,t.jsx)(n.p,{children:"The cluster topology may change between calls:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'// Initial topology\r\nauto nodes1 = client.get_cluster_nodes();\r\nsize_t size1 = nodes1.size();\r\n\r\n// Topology may change\r\nstd::this_thread::sleep_for(std::chrono::seconds(10));\r\n\r\n// Updated topology\r\nauto nodes2 = client.get_cluster_nodes();\r\nsize_t size2 = nodes2.size();\r\n\r\nif (size2 != size1) {\r\n std::cout << "Topology changed: "\r\n << size1 << " -> " << size2 << " nodes" << std::endl;\r\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"Always retrieve fresh topology information before node-specific operations."}),"\n",(0,t.jsx)(n.h2,{id:"error-handling",children:"Error Handling"}),"\n",(0,t.jsx)(n.h3,{id:"network-errors",children:"Network Errors"}),"\n",(0,t.jsx)(n.p,{children:"Handle connection failures:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'try {\r\n auto nodes = client.get_cluster_nodes();\r\n} catch (const ignite_error& e) {\r\n std::cerr << "Failed to get cluster nodes: " << e.what_str() << std::endl;\r\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"With async operations:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'client.get_cluster_nodes_async([](ignite_result> result) {\r\n if (result.has_error()) {\r\n std::cerr << "Error: " << result.error().what_str() << std::endl;\r\n } else {\r\n auto nodes = std::move(result).value();\r\n // Use nodes\r\n }\r\n});\n'})}),"\n",(0,t.jsx)(n.h3,{id:"empty-topology",children:"Empty Topology"}),"\n",(0,t.jsx)(n.p,{children:"Check for empty clusters:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'auto nodes = client.get_cluster_nodes();\r\n\r\nif (nodes.empty()) {\r\n std::cerr << "Warning: No nodes available in cluster" << std::endl;\r\n} else {\r\n // Proceed with operations\r\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"integration-with-compute-api",children:"Integration with Compute API"}),"\n",(0,t.jsx)(n.h3,{id:"job-targeting",children:"Job Targeting"}),"\n",(0,t.jsx)(n.p,{children:"Use topology information for compute targeting:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:"auto nodes = client.get_cluster_nodes();\r\n\r\n// Target specific node\r\nauto target = job_target::node(nodes[0]);\r\n\r\n// Target any node from set\r\nauto target = job_target::any_node(nodes);\r\n\r\n// Broadcast to all nodes\r\nstd::set node_set(nodes.begin(), nodes.end());\r\nauto broadcast_target = broadcast_job_target::nodes(node_set);\n"})}),"\n",(0,t.jsx)(n.h3,{id:"node-affinity",children:"Node Affinity"}),"\n",(0,t.jsx)(n.p,{children:"Select nodes based on affinity:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'auto nodes = client.get_cluster_nodes();\r\n\r\n// Find preferred nodes (example: local datacenter)\r\nstd::vector preferred_nodes;\r\nstd::copy_if(nodes.begin(), nodes.end(), std::back_inserter(preferred_nodes),\r\n [](const auto& node) {\r\n return node.get_address().host.find("dc1") != std::string::npos;\r\n });\r\n\r\n// Use preferred nodes for execution\r\nif (!preferred_nodes.empty()) {\r\n auto target = job_target::any_node(preferred_nodes);\r\n compute.submit(target, descriptor, arg);\r\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,t.jsx)(n.h3,{id:"cache-topology-information",children:"Cache Topology Information"}),"\n",(0,t.jsx)(n.p,{children:"Cache node information for short-lived operations:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:"class compute_scheduler {\r\n std::vector nodes_;\r\n std::chrono::steady_clock::time_point last_refresh_;\r\n std::chrono::seconds refresh_interval_{30};\r\n\r\npublic:\r\n void maybe_refresh_topology(ignite_client& client) {\r\n auto now = std::chrono::steady_clock::now();\r\n if (now - last_refresh_ > refresh_interval_) {\r\n nodes_ = client.get_cluster_nodes();\r\n last_refresh_ = now;\r\n }\r\n }\r\n\r\n std::vector get_nodes() const {\r\n return nodes_;\r\n }\r\n};\n"})}),"\n",(0,t.jsx)(n.h3,{id:"use-stable-references",children:"Use Stable References"}),"\n",(0,t.jsx)(n.p,{children:"Prefer node names over IDs for persistent references:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'// Good: Use node name\r\nstd::string target_node_name = "my-node-01";\r\nauto nodes = client.get_cluster_nodes();\r\nauto it = std::find_if(nodes.begin(), nodes.end(),\r\n [&](const auto& n) { return n.get_name() == target_node_name; });\r\n\r\n// Avoid: Using node ID (changes on restart)\r\nuuid target_node_id = saved_id; // May be stale after restart\n'})}),"\n",(0,t.jsx)(n.h3,{id:"handle-dynamic-topology",children:"Handle Dynamic Topology"}),"\n",(0,t.jsx)(n.p,{children:"Account for nodes joining and leaving:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cpp",children:'void execute_with_fallback(ignite_client& client,\r\n std::shared_ptr descriptor,\r\n const binary_object& arg) {\r\n auto nodes = client.get_cluster_nodes();\r\n\r\n if (nodes.empty()) {\r\n throw ignite_error("No nodes available");\r\n }\r\n\r\n // Try first node\r\n try {\r\n auto target = job_target::node(nodes[0]);\r\n compute.submit(target, descriptor, arg);\r\n } catch (const ignite_error& e) {\r\n // Fallback to any available node\r\n auto target = job_target::any_node(nodes);\r\n compute.submit(target, descriptor, arg);\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/cppdoc/",children:"C++ API Documentation"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"./compute-api",children:"Compute API"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"./client-api",children:"Client API"})}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/712f9ec4.da4cbdad.js b/docs/ignite3/assets/js/712f9ec4.da4cbdad.js deleted file mode 100644 index 1e0bac38a8..0000000000 --- a/docs/ignite3/assets/js/712f9ec4.da4cbdad.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5472],{28453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>l});var i=t(96540);const n={},d=i.createContext(n);function r(e){const s=i.useContext(d);return i.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(d.Provider,{value:s},e.children)}},95401:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>h,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"sql/working-with-sql/system-views","title":"System Views","description":"Ignite provides a number of built-in SQL views that provide information on the cluster\'s state and provide real-time insight into the status of its components. These views are available in the SYSTEM schema.","source":"@site/docs/sql/working-with-sql/system-views.md","sourceDirName":"sql/working-with-sql","slug":"/sql/working-with-sql/system-views","permalink":"/docs/ignite3/3.1.0/sql/working-with-sql/system-views","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"system-views","title":"System Views","sidebar_label":"System Views"},"sidebar":"tutorialSidebar","previous":{"title":"Execute Queries","permalink":"/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries"},"next":{"title":"SQL Reference","permalink":"/docs/ignite3/3.1.0/sql/reference/"}}');var n=t(74848),d=t(28453);const r={id:"system-views",title:"System Views",sidebar_label:"System Views"},l="System Views",h={},c=[{value:"Getting Data",id:"getting-data",level:2},{value:"Available Views",id:"available-views",level:2},{value:"SYSTEM_VIEWS",id:"system_views",level:3},{value:"SYSTEM_VIEW_COLUMNS",id:"system_view_columns",level:3},{value:"SYSTEM.ZONES",id:"systemzones",level:3},{value:"SQL_CACHED_QUERY_PLANS",id:"sql_cached_query_plans",level:3}];function a(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"system-views",children:"System Views"})}),"\n",(0,n.jsx)(s.p,{children:"Ignite provides a number of built-in SQL views that provide information on the cluster's state and provide real-time insight into the status of its components. These views are available in the SYSTEM schema."}),"\n",(0,n.jsx)(s.h2,{id:"getting-data",children:"Getting Data"}),"\n",(0,n.jsx)(s.p,{children:"You access system views in Ignite by using SQL and selecting data from the system view like you would from any other table. For example, you can get a list of all available system views in the following way:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sql",children:"SELECT id, schema, name FROM system.system_views WHERE type = 'NODE'\n"})}),"\n",(0,n.jsxs)(s.p,{children:["You can also use joins to combine data from multiple views. The example below returns all columns of a view that was found in the ",(0,n.jsx)(s.code,{children:"SYSTEM_VIEWS"})," view:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sql",children:"SELECT svc.*\r\n FROM system.system_view_columns svc\r\n JOIN system.system_views sv ON svc.view_id = sv.id\r\n WHERE sv.name = 'SYSTEM_VIEWS'\n"})}),"\n",(0,n.jsx)(s.h2,{id:"available-views",children:"Available Views"}),"\n",(0,n.jsx)(s.h3,{id:"system_views",children:"SYSTEM_VIEWS"}),"\n",(0,n.jsx)(s.p,{children:"Describes available system views."}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Column"}),(0,n.jsx)(s.th,{children:"Data Type"}),(0,n.jsx)(s.th,{children:"Description"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"ID"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"System view ID."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"SCHEMA"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsxs)(s.td,{children:["Name of the schema used. Default is ",(0,n.jsx)(s.code,{children:"SYSTEM"}),"."]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"NAME"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"System view name."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"TYPE"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsxs)(s.td,{children:["System view type. Possible values:",(0,n.jsx)("br",{}),"- NODE - The view provides node-specific information. Data will be collected from all nodes, and represented in the view.",(0,n.jsx)("br",{}),"- CLUSTER - The view provides cluster-wide information. Data will be collected from one node, chosen to represent the cluster."]})]})]})]}),"\n",(0,n.jsx)(s.h3,{id:"system_view_columns",children:"SYSTEM_VIEW_COLUMNS"}),"\n",(0,n.jsx)(s.p,{children:"Describes available system view columns."}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Column"}),(0,n.jsx)(s.th,{children:"Data Type"}),(0,n.jsx)(s.th,{children:"Description"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"VIEW_ID"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"System view ID."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"NAME"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"Column name."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"TYPE"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsxs)(s.td,{children:["Column type. Can by any of the ",(0,n.jsx)(s.a,{href:"/3.1.0/sql/reference/data-types-and-functions/data-types",children:"supported types"}),"."]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"NULLABLE"}),(0,n.jsx)(s.td,{children:"BOOLEAN"}),(0,n.jsx)(s.td,{children:"Defines if the column can be empty."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"PRECISION"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"Maximum number of digits."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"SCALE"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"Maximum number of decimal places."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"LENGTH"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"Maximum length of the value. Symbols for string values or bytes for binary values."})]})]})]}),"\n",(0,n.jsx)(s.h3,{id:"systemzones",children:"SYSTEM.ZONES"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Column"}),(0,n.jsx)(s.th,{children:"Data Type"}),(0,n.jsx)(s.th,{children:"Description"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"NAME"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"The name of the distribution zone."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"PARTITIONS"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"The number of partitions in the distribution zone."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"REPLICAS"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"The number of copies of each partition in the distribution zone."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"DATA_NODES_AUTO_ADJUST_SCALE_UP"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"The delay in seconds between the new node joining and the start of data zone adjustment."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"DATA_NODES_AUTO_ADJUST_SCALE_DOWN"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"The delay in seconds between the node leaving the cluster and the start of data zone adjustment."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"DATA_NODES_FILTER"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"The filter that specifies what nodes will be used by the distribution zone."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"IS_DEFAULT_ZONE"}),(0,n.jsx)(s.td,{children:"BOOLEAN"}),(0,n.jsx)(s.td,{children:"Defines if the data zone is used by default."})]})]})]}),"\n",(0,n.jsx)(s.h3,{id:"sql_cached_query_plans",children:"SQL_CACHED_QUERY_PLANS"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Column"}),(0,n.jsx)(s.th,{children:"Data Type"}),(0,n.jsx)(s.th,{children:"Description"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"NODE_ID"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"ID of the node where the plan is cached."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"PLAN_ID"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"Internal identifier of the prepared plan."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"CATALOG_VERSION"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"Catalog version used when the query was prepared."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"QUERY_DEFAULT_SCHEMA"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"Default schema applied during query preparation."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"SQL"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"Normalized SQL text of the query."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"QUERY_TYPE"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"Query type."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"QUERY_PLAN"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"Serialized or explain representation of the chosen query plan."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"QUERY_PREPARE_TIME"}),(0,n.jsx)(s.td,{children:"TIMESTAMP WITH LOCAL TIME ZONE"}),(0,n.jsx)(s.td,{children:"Time the plan was prepared on the node."})]})]})]})]})}function o(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/77a23d4b.fc47d9d0.js b/docs/ignite3/assets/js/77a23d4b.fc47d9d0.js deleted file mode 100644 index 095753de80..0000000000 --- a/docs/ignite3/assets/js/77a23d4b.fc47d9d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[167],{28453:(e,r,n)=>{n.d(r,{R:()=>s,x:()=>l});var t=n(96540);const a={},i=t.createContext(a);function s(e){const r=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(i.Provider,{value:r},e.children)}},86516:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"api-reference/native-clients/dotnet/data-streamer-api","title":"Data Streamer API","description":"The Data Streamer API provides high-throughput bulk data loading into Ignite tables. It automatically batches data into pages, distributes them across cluster nodes, and optionally processes them server-side through custom receivers.","source":"@site/docs/api-reference/native-clients/dotnet/data-streamer-api.md","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/data-streamer-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Data Streamer API","id":"data-streamer-api","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"LINQ API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api"},"next":{"title":"SQL API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api"}}');var a=n(74848),i=n(28453);const s={title:"Data Streamer API",id:"data-streamer-api",sidebar_position:3},l="Data Streamer API",c={},o=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Streaming Targets",id:"streaming-targets",level:3},{value:"Server-Side Receivers",id:"server-side-receivers",level:3},{value:"Page-Based Processing",id:"page-based-processing",level:3},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Basic Streaming",id:"basic-streaming",level:3},{value:"Streaming with Options",id:"streaming-with-options",level:3},{value:"Streaming to Key-Value View",id:"streaming-to-key-value-view",level:3},{value:"Custom Server-Side Receiver",id:"custom-server-side-receiver",level:3},{value:"Error Handling",id:"error-handling",level:3},{value:"Streaming with Cancellation",id:"streaming-with-cancellation",level:3},{value:"Streaming with Transformations",id:"streaming-with-transformations",level:3},{value:"Reference",id:"reference",level:2},{value:"IDataStreamerTarget<T> Interface",id:"idatastreamertargett-interface",level:3},{value:"DataStreamerOptions Class",id:"datastreameroptions-class",level:3},{value:"IDataStreamerReceiver<TItem, TArg, TResult> Interface",id:"idatastreamerreceivertitem-targ-tresult-interface",level:3},{value:"IDataStreamerReceiverContext Interface",id:"idatastreamerreceivercontext-interface",level:3},{value:"ReceiverDescriptor Class",id:"receiverdescriptor-class",level:3},{value:"DataStreamerItem<T> Type",id:"datastreameritemt-type",level:3}];function d(e){const r={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.header,{children:(0,a.jsx)(r.h1,{id:"data-streamer-api",children:"Data Streamer API"})}),"\n",(0,a.jsx)(r.p,{children:"The Data Streamer API provides high-throughput bulk data loading into Ignite tables. It automatically batches data into pages, distributes them across cluster nodes, and optionally processes them server-side through custom receivers."}),"\n",(0,a.jsx)(r.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,a.jsx)(r.p,{children:"Data streaming optimizes bulk loading by grouping records into pages and sending them to the cluster in batches. This reduces network round-trips and enables parallel processing across partitions."}),"\n",(0,a.jsx)(r.h3,{id:"streaming-targets",children:"Streaming Targets"}),"\n",(0,a.jsx)(r.p,{children:"Both IRecordView and IKeyValueView implement IDataStreamerTarget, allowing you to stream data directly to any table view. The streamer automatically routes data to the correct partition nodes."}),"\n",(0,a.jsx)(r.h3,{id:"server-side-receivers",children:"Server-Side Receivers"}),"\n",(0,a.jsx)(r.p,{children:"Receivers execute custom logic on the server for each page of streamed data. Use receivers to transform data, perform aggregations, or implement custom merge logic during loading. Receivers run colocated with the data for maximum performance."}),"\n",(0,a.jsx)(r.h3,{id:"page-based-processing",children:"Page-Based Processing"}),"\n",(0,a.jsx)(r.p,{children:"The streamer divides input data into pages based on DataStreamerOptions.PageSize. Each page is sent to the appropriate cluster node where a receiver processes all items in the page together. This batching reduces overhead and enables efficient bulk operations."}),"\n",(0,a.jsx)(r.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,a.jsx)(r.h3,{id:"basic-streaming",children:"Basic Streaming"}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-csharp",children:'var table = await client.Tables.GetTableAsync("events");\r\nvar view = table.GetRecordView();\r\n\r\n// Generate data asynchronously\r\nasync IAsyncEnumerable GenerateEvents()\r\n{\r\n for (int i = 0; i < 100000; i++)\r\n {\r\n yield return new Event\r\n {\r\n Id = i,\r\n Timestamp = DateTime.UtcNow,\r\n Type = "sensor_reading",\r\n Value = Random.Shared.NextDouble() * 100\r\n };\r\n }\r\n}\r\n\r\n// Stream the data\r\nawait view.StreamDataAsync(GenerateEvents());\n'})}),"\n",(0,a.jsx)(r.h3,{id:"streaming-with-options",children:"Streaming with Options"}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-csharp",children:"var options = new DataStreamerOptions\r\n{\r\n PageSize = 1000, // Items per page\r\n RetryLimit = 16, // Retry failed pages\r\n AutoFlushInterval = TimeSpan.FromSeconds(1)\r\n};\r\n\r\nawait view.StreamDataAsync(GenerateEvents(), options);\n"})}),"\n",(0,a.jsx)(r.h3,{id:"streaming-to-key-value-view",children:"Streaming to Key-Value View"}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-csharp",children:'var table = await client.Tables.GetTableAsync("metrics");\r\nvar kvView = table.GetKeyValueView();\r\n\r\nasync IAsyncEnumerable> GenerateMetrics()\r\n{\r\n for (int i = 0; i < 50000; i++)\r\n {\r\n var key = new MetricKey { MetricId = i };\r\n var value = new MetricValue\r\n {\r\n Name = $"metric_{i}",\r\n Value = Random.Shared.NextDouble()\r\n };\r\n yield return new KeyValuePair(key, value);\r\n }\r\n}\r\n\r\nawait kvView.StreamDataAsync(GenerateMetrics());\n'})}),"\n",(0,a.jsx)(r.h3,{id:"custom-server-side-receiver",children:"Custom Server-Side Receiver"}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-csharp",children:'// Define receiver that processes data on the server\r\npublic class AggregatingReceiver : IDataStreamerReceiver\r\n{\r\n public IMarshaller? PayloadMarshaller => null;\r\n public IMarshaller? ArgumentMarshaller => null;\r\n public IMarshaller? ResultMarshaller => null;\r\n\r\n public async ValueTask?> ReceiveAsync(\r\n IList page,\r\n string arg,\r\n IDataStreamerReceiverContext context,\r\n CancellationToken cancellationToken)\r\n {\r\n // Process page on the server\r\n var sum = 0;\r\n var table = await context.Ignite.Tables.GetTableAsync("sensor_data");\r\n var view = table.GetRecordView();\r\n\r\n foreach (var reading in page)\r\n {\r\n // Custom merge logic\r\n var existing = await view.GetAsync(null, new SensorReading { SensorId = reading.SensorId });\r\n if (existing.HasValue)\r\n {\r\n reading.Value += existing.Value.Value;\r\n }\r\n await view.UpsertAsync(null, reading);\r\n sum += (int)reading.Value;\r\n }\r\n\r\n return new[] { sum };\r\n }\r\n}\r\n\r\n// Register and use receiver\r\nvar receiverDescriptor = new ReceiverDescriptor(\r\n "AggregatingReceiver");\r\n\r\nvar results = view.StreamDataAsync(\r\n data: GenerateReadings(),\r\n receiver: receiverDescriptor,\r\n keySelector: r => new SensorReading { SensorId = r.SensorId },\r\n payloadSelector: r => r,\r\n receiverArg: "aggregate_mode",\r\n options: new DataStreamerOptions { PageSize = 100 });\r\n\r\nawait foreach (var sum in results)\r\n{\r\n Console.WriteLine($"Page sum: {sum}");\r\n}\n'})}),"\n",(0,a.jsx)(r.h3,{id:"error-handling",children:"Error Handling"}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-csharp",children:'var options = new DataStreamerOptions\r\n{\r\n PageSize = 500,\r\n RetryLimit = 16\r\n};\r\n\r\ntry\r\n{\r\n await view.StreamDataAsync(GenerateEvents(), options);\r\n Console.WriteLine("Streaming completed successfully");\r\n}\r\ncatch (Exception ex)\r\n{\r\n Console.WriteLine($"Streaming failed: {ex.Message}");\r\n // Handle failure (page that failed after retries)\r\n}\n'})}),"\n",(0,a.jsx)(r.h3,{id:"streaming-with-cancellation",children:"Streaming with Cancellation"}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-csharp",children:'using var cts = new CancellationTokenSource();\r\ncts.CancelAfter(TimeSpan.FromMinutes(5));\r\n\r\ntry\r\n{\r\n await view.StreamDataAsync(\r\n GenerateEvents(),\r\n options: new DataStreamerOptions { PageSize = 1000 },\r\n cancellationToken: cts.Token);\r\n}\r\ncatch (OperationCanceledException)\r\n{\r\n Console.WriteLine("Streaming cancelled");\r\n}\n'})}),"\n",(0,a.jsx)(r.h3,{id:"streaming-with-transformations",children:"Streaming with Transformations"}),"\n",(0,a.jsx)(r.pre,{children:(0,a.jsx)(r.code,{className:"language-csharp",children:"async IAsyncEnumerable GenerateAndTransform()\r\n{\r\n await foreach (var rawEvent in LoadFromExternalSource())\r\n {\r\n // Transform during generation\r\n yield return new Event\r\n {\r\n Id = rawEvent.Id,\r\n Timestamp = DateTime.UtcNow,\r\n Type = NormalizeType(rawEvent.Type),\r\n Value = rawEvent.Value * 1.5\r\n };\r\n }\r\n}\r\n\r\nawait view.StreamDataAsync(GenerateAndTransform());\n"})}),"\n",(0,a.jsx)(r.h2,{id:"reference",children:"Reference"}),"\n",(0,a.jsx)(r.h3,{id:"idatastreamertargett-interface",children:"IDataStreamerTarget Interface"}),"\n",(0,a.jsx)(r.p,{children:"Basic streaming methods:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"StreamDataAsync(IAsyncEnumerable data, DataStreamerOptions?, CancellationToken)"})," - Stream raw data items"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"StreamDataAsync(IAsyncEnumerable> data, DataStreamerOptions?, CancellationToken)"})," - Stream with operation types"]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"Receiver-based streaming:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"StreamDataAsync"})," - Stream with receiver that returns results per page"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"StreamDataAsync"})," - Stream with receiver (void results)"]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"Parameters:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"data"})," - Async sequence of items to stream"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"receiver"})," - Server-side receiver descriptor"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"keySelector"})," - Function to extract key from source items"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"payloadSelector"})," - Function to extract payload from source items"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"receiverArg"})," - Argument passed to receiver"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"options"})," - Streaming configuration"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"cancellationToken"})," - Cancellation support"]}),"\n"]}),"\n",(0,a.jsx)(r.h3,{id:"datastreameroptions-class",children:"DataStreamerOptions Class"}),"\n",(0,a.jsx)(r.p,{children:"Configuration properties:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"PageSize"})," - Number of items per page (default: 1000)"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"RetryLimit"})," - Maximum retry attempts for failed pages (default: 16)"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"AutoFlushInterval"})," - Time interval for automatic page flushing"]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"The page size controls the granularity of batching. Larger pages reduce network overhead but increase memory usage and reduce parallelism across partitions."}),"\n",(0,a.jsx)(r.h3,{id:"idatastreamerreceivertitem-targ-tresult-interface",children:"IDataStreamerReceiver Interface"}),"\n",(0,a.jsx)(r.p,{children:"Properties:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"PayloadMarshaller"})," - Optional custom marshaller for payload items"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"ArgumentMarshaller"})," - Optional custom marshaller for arguments"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"ResultMarshaller"})," - Optional custom marshaller for results"]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"Methods:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"ReceiveAsync(IList page, TArg arg, IDataStreamerReceiverContext context, CancellationToken)"})," - Process a page of items on the server"]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"The receiver executes on the server node that owns the partition. It receives a page of items (controlled by PageSize), processes them with access to the full Ignite API through the context, and optionally returns results."}),"\n",(0,a.jsx)(r.h3,{id:"idatastreamerreceivercontext-interface",children:"IDataStreamerReceiverContext Interface"}),"\n",(0,a.jsx)(r.p,{children:"Properties:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Ignite"})," - Access to full Ignite client API for server-side operations"]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"Use the context to access tables, execute SQL, or perform other operations during data processing. The context operates within the server environment."}),"\n",(0,a.jsx)(r.h3,{id:"receiverdescriptor-class",children:"ReceiverDescriptor Class"}),"\n",(0,a.jsx)(r.p,{children:"Describes a server-side receiver:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"ReceiverDescriptor(string className)"})," - Create descriptor with class name"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"ReceiverDescriptor(string className)"})," - Create descriptor for receivers with no result"]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"The receiver must be deployed to the server before streaming. The class name identifies the receiver implementation on the server."}),"\n",(0,a.jsx)(r.h3,{id:"datastreameritemt-type",children:"DataStreamerItem Type"}),"\n",(0,a.jsx)(r.p,{children:"Wraps streamed items with operation type:"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"Data"})," - The data item"]}),"\n",(0,a.jsxs)(r.li,{children:[(0,a.jsx)(r.strong,{children:"OperationType"})," - Operation to perform (Put, Remove)"]}),"\n"]}),"\n",(0,a.jsx)(r.p,{children:"Use this when you need to stream mixed operations (inserts, updates, deletes) in a single stream."})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/796ebb42.3a1e0859.js b/docs/ignite3/assets/js/796ebb42.3a1e0859.js deleted file mode 100644 index 777b67b1c3..0000000000 --- a/docs/ignite3/assets/js/796ebb42.3a1e0859.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2758],{28453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var o=n(96540);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}},62990:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/lifecycle2-277426ca0a68c7ae2132ed771376ff6b.png"},65413:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/lifecycle1-022e218335d749f40dd850f775541b40.png"},91583:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"configure-and-operate/operations/lifecycle","title":"Cluster Lifecycle","description":"This topic covers the information covering Ignite 3 cluster initialization and lifecycle.","source":"@site/docs/configure-and-operate/operations/lifecycle.md","sourceDirName":"configure-and-operate/operations","slug":"/configure-and-operate/operations/lifecycle","permalink":"/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"lifecycle","title":"Cluster Lifecycle","sidebar_label":"Lifecycle"},"sidebar":"tutorialSidebar","previous":{"title":"Operations","permalink":"/docs/ignite3/3.1.0/configure-and-operate/operations/"},"next":{"title":"Overview","permalink":"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery"}}');var i=n(74848),s=n(28453);const r={id:"lifecycle",title:"Cluster Lifecycle",sidebar_label:"Lifecycle"},a=void 0,l={},d=[{value:"Node Start Without a Running Cluster",id:"node-start-without-a-running-cluster",level:2},{value:"Node Requirements",id:"node-requirements",level:3},{value:"Cluster Initialization",id:"cluster-initialization",level:2},{value:"Cluster Management Group",id:"cluster-management-group",level:3},{value:"Cluster Metastorage Group",id:"cluster-metastorage-group",level:3},{value:"Node Join Scenarios",id:"node-join-scenarios",level:2},{value:"New Nodes Joining the Cluster",id:"new-nodes-joining-the-cluster",level:3},{value:"Node Rejoins the Cluster",id:"node-rejoins-the-cluster",level:3}];function c(e){const t={code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"This topic covers the information covering Ignite 3 cluster initialization and lifecycle."}),"\n",(0,i.jsx)(t.h2,{id:"node-start-without-a-running-cluster",children:"Node Start Without a Running Cluster"}),"\n",(0,i.jsxs)(t.p,{children:["When nodes start, they check all addresses listed in the node finder configuration (",(0,i.jsx)(t.code,{children:"network.nodeFinder"}),")."]}),"\n",(0,i.jsxs)(t.p,{children:["All nodes found are added to the ",(0,i.jsx)(t.em,{children:"physical topology"}),", the nodes that know each other. All nodes also share information about other nodes, so the topology will include all nodes whose address is listed in at least one other node. If there are nodes that are completely separated (for example, nodes A and B only know about each other, same with C and D), they will form separate physical topologies (in this example, you would have cluster with A and B, and another cluster with C and D)."]}),"\n",(0,i.jsxs)(t.p,{children:["If there is no running cluster, the nodes exchange information about the network, but do not start any processes until the cluster initialization command is received, nor do they form a ",(0,i.jsx)(t.em,{children:"logical topology"}),", the nodes that are verified and form a cluster."]}),"\n",(0,i.jsx)(t.h3,{id:"node-requirements",children:"Node Requirements"}),"\n",(0,i.jsxs)(t.p,{children:["All nodes in cluster must have similar time, that can be different by no more than ",(0,i.jsx)(t.code,{children:"schemaSync.maxClockSkewMillis"}),". This is necessary for correct transaction operation."]}),"\n",(0,i.jsxs)(t.p,{children:["As network latency can be unpredictable, some requests may take so long to arrive that the time will be different on the receiving node by the time request arrives. To account for the delay, set the ",(0,i.jsx)(t.code,{children:"schemaSync.delayDurationMillis"})," property to the time that is long enough for the schema updates to be delivered to all nodes in the cluster. However, this delay also affects how long it takes for DDL to be executed, as all nodes need to wait for the delay to pass before applying the update."]}),"\n",(0,i.jsx)(t.h2,{id:"cluster-initialization",children:"Cluster Initialization"}),"\n",(0,i.jsxs)(t.p,{children:["When the ",(0,i.jsx)(t.code,{children:"cluster init"})," command is received by any node in the cluster, it starts the initialization process."]}),"\n",(0,i.jsxs)(t.p,{children:["First, the nodes specified in the ",(0,i.jsx)(t.code,{children:"--cluster-management-group"})," argument form a RAFT group and take on the role of the ",(0,i.jsx)(t.em,{children:"cluster management group"})," (CMG), a group responsible for managing cluster operations."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Cluster initialization",src:n(65413).A+"",width:"1405",height:"731"})}),"\n",(0,i.jsxs)(t.p,{children:["Next, the nodes specified in the ",(0,i.jsx)(t.code,{children:"--metastorage-group"})," argument form a RAFT group and assume the role of the ",(0,i.jsx)(t.em,{children:"metastorage group"}),". These nodes store the authoritative copy of the cluster's metadata."]}),"\n",(0,i.jsxs)(t.p,{children:["If only one of ",(0,i.jsx)(t.code,{children:"--cluster-management-group"})," or ",(0,i.jsx)(t.code,{children:"--metastorage-group"})," is specified, the specified value is used for both. If neither is specified, a set of nodes is automatically selected for both CMG and the metastorage group in alphabetical order. The number of selected nodes is determined as follows:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"If the cluster size is 3 or fewer, all nodes are used for the metastorage group (CMG and metastorage)."}),"\n",(0,i.jsx)(t.li,{children:"If the cluster size is 4, three nodes are used to maintain an odd number, improving consensus efficiency."}),"\n",(0,i.jsx)(t.li,{children:"If the cluster size is 5 or more, five nodes are used to balance fault tolerance and overhead."}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Once the 2 raft groups are started and elect their leaders, all other nodes in the topology are notified that the cluster is started, and they can join it. At this point, the cluster is considered ",(0,i.jsx)(t.em,{children:"initialized"})," and can start receiving requests."]}),"\n",(0,i.jsx)(t.p,{children:"Each non-leader node receives the invitation from the CMG to join the cluster and forms a validation request. Then, the request is sent to the CMG, and, after validation, the node receives cluster meta information from the metastorage group and joins the cluster."}),"\n",(0,i.jsxs)(t.p,{children:["The nodes are also added to the cluster ",(0,i.jsx)(t.em,{children:"logical topology"}),", the nodes that are verified and accepted by CMG as part of the cluster. When nodes shut down or leave the physical topology for any other reason, the cluster logical topology is immediately adjusted."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Cluster initialized",src:n(62990).A+"",width:"942",height:"1109"})}),"\n",(0,i.jsx)(t.h3,{id:"cluster-management-group",children:"Cluster Management Group"}),"\n",(0,i.jsx)(t.p,{children:"Cluster management group stores information about the cluster, the list of nodes that are in the cluster, and handles all cluster logical topology changes. Due to using RAFT consensus algorithm, the CMG improves the protection from split-brain (as any cluster group losing the CMG majority will no longer be fully functional)."}),"\n",(0,i.jsx)(t.p,{children:"It is recommended to have the CMG of 3, 5 or 7 nodes. Larger management group improves stability, as it reduces the odds of losing the majority of CMG nodes, but may cause a minor performance hit."}),"\n",(0,i.jsx)(t.p,{children:"Losing the majority of CMG nodes leaves the cluster mostly functional. The cluster without the CMG majority can still handle transactions and user requests, but cannot:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Add new nodes to logical topology."}),"\n",(0,i.jsx)(t.li,{children:"Re-add nodes that left the cluster to logical topology."}),"\n",(0,i.jsxs)(t.li,{children:["Create new table indexes. In this scenario, ",(0,i.jsx)(t.code,{children:"CREATE INDEX"})," DDL operation will never be fully resolved and will hang the application."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"To restore full cluster functionality, bring the offline members of CMG back online."}),"\n",(0,i.jsx)(t.p,{children:"The CMG stores the following information:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Current cluster state, including what nodes are in CMG and metastorage groups, what Ignite version is used and cluster tag."}),"\n",(0,i.jsx)(t.li,{children:"Consistent IDs of all nodes in the logical topology."}),"\n",(0,i.jsx)(t.li,{children:"Node validation status."}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["By default, the information is stored in the ",(0,i.jsx)(t.code,{children:"work"})," folder, but it can be configured on each CMG node by setting the ",(0,i.jsx)(t.code,{children:"ignite.system.cmgPath"})," property."]}),"\n",(0,i.jsx)(t.h3,{id:"cluster-metastorage-group",children:"Cluster Metastorage Group"}),"\n",(0,i.jsx)(t.p,{children:"Cluster metastorage group stores information about the data stored in the cluster, and handles data distribution."}),"\n",(0,i.jsx)(t.p,{children:"It is recommended to have the metastorage of 3, 5 or 7 nodes. Larger metastorage group improves stability, as it reduces the odds of losing the majority of metastorage nodes, but may cause a minor performance hit."}),"\n",(0,i.jsx)(t.p,{children:"Losing the majority of metastorage nodes will turn the cluster inoperable and may lead to data loss."}),"\n",(0,i.jsx)(t.p,{children:"The metastorage contains the following information:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Cluster catalog: the single storage of all meta information about the cluster, including table schemas, indexes, views, distribution zone information, etc."}),"\n",(0,i.jsx)(t.li,{children:"Logical topology history."}),"\n",(0,i.jsx)(t.li,{children:"Other data required for cluster operation."}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["By default, the information is stored in the ",(0,i.jsx)(t.code,{children:"work"})," folder, but it can be configured on each node by setting the ",(0,i.jsx)(t.code,{children:"ignite.system.metastoragePath"})," property."]}),"\n",(0,i.jsx)(t.h2,{id:"node-join-scenarios",children:"Node Join Scenarios"}),"\n",(0,i.jsx)(t.h3,{id:"new-nodes-joining-the-cluster",children:"New Nodes Joining the Cluster"}),"\n",(0,i.jsx)(t.p,{children:"When a new node is started, it adds itself to the physical topology. Then, the CMG receives the event that a new node has joined the topology, and sends it an invitation to join the cluster. Once the node receives it, it sends the validation request with node information, which the CMG verifies and adds the node to the logical topology."}),"\n",(0,i.jsx)(t.h3,{id:"node-rejoins-the-cluster",children:"Node Rejoins the Cluster"}),"\n",(0,i.jsx)(t.p,{children:"If the node leaves the physical topology (for example, because the machine with the node is unreachable), the cluster logical topology is immediately adjusted, and the node is excluded from it. It can no longer rejoin the cluster with the same node ID."}),"\n",(0,i.jsx)(t.p,{children:"To rejoin the cluster, the node must be restarted. During the restart, a new ID will be generated and the node will be able to join the physical and logical topology."}),"\n",(0,i.jsx)(t.p,{children:"When a node reappears in the physical topology, the CMG sends it an invitation to join. The node then asks the CMG to validate itself, and, if this is successful, it starts its components (doing local recovery on the way), after which it tells the CMG that it's ready to join. The CMG then adds it to the logical topology. This is the same process as the first join of a blank node."})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/7a0d0e36.7b6e91b4.js b/docs/ignite3/assets/js/7a0d0e36.7b6e91b4.js deleted file mode 100644 index 402473afad..0000000000 --- a/docs/ignite3/assets/js/7a0d0e36.7b6e91b4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5405],{28453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>s});var o=i(96540);const r={},t=o.createContext(r);function a(e){const n=o.useContext(t);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(t.Provider,{value:n},e.children)}},44370:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>g,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"general-tips","title":"General Configuration Tips","description":"{/*","source":"@site/versioned_docs/version-3.0.0/general-tips.md","sourceDirName":".","slug":"/general-tips","permalink":"/docs/ignite3/3.0.0/general-tips","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"General Configuration Tips","sidebar_label":"General Configuration Tips"},"sidebar":"tutorialSidebar","previous":{"title":"Using EXPLAIN","permalink":"/docs/ignite3/3.0.0/sql-tuning/using-explain"},"next":{"title":"Glossary","permalink":"/docs/ignite3/3.0.0/glossary/"}}');var r=i(74848),t=i(28453);const a={title:"General Configuration Tips",sidebar_label:"General Configuration Tips"},s="General Configuration Tips",l={},d=[{value:"Configuring Default Cluster Storage",id:"configuring-default-cluster-storage",level:2},{value:"Configuring Local Paths",id:"configuring-local-paths",level:2},{value:"Configuring Heap Usage",id:"configuring-heap-usage",level:2},{value:"Configuring Server Logging",id:"configuring-server-logging",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"general-configuration-tips",children:"General Configuration Tips"})}),"\n",(0,r.jsx)(n.h2,{id:"configuring-default-cluster-storage",children:"Configuring Default Cluster Storage"}),"\n",(0,r.jsx)(n.p,{children:"When a cluster is created, the default distribution zone is used for storage configuration. While we recommend creating distribution zones for your clusters, you can still use the default zone and configure it to suit your needs."}),"\n",(0,r.jsxs)(n.p,{children:["To get default storage configuration, use the ",(0,r.jsx)(n.code,{children:"cluster config show ignite.zone"})," command. Below is an example of the default configuration in the JSON format."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"In Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "zone" : {\r\n "defaultDataStorage" : "aipersist",\r\n "defaultDistributionZone" : {\r\n "dataNodesAutoAdjustScaleDown" : 2147483647,\r\n "dataNodesAutoAdjustScaleUp" : 0,\r\n "dataStorage" : {\r\n "dataRegion" : "default",\r\n "name" : "aipersist"\r\n },\r\n "filter" : "$..*",\r\n "partitions" : 25,\r\n "replicas" : 1,\r\n "zoneId" : 0\r\n },\r\n "distributionZones" : [ ],\r\n "globalIdCounter" : 0\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["To change the type of storage used for new distribution zones, change the ",(0,r.jsx)(n.code,{children:"zone.defaultDataStorage"})," value to ",(0,r.jsx)(n.code,{children:"aimem"})," or ",(0,r.jsx)(n.code,{children:"rocksDb"}),". You can also change the default data region used for new distribution zones by setting the ",(0,r.jsx)(n.code,{children:"zone.defaultDistributionZone.dataStorage.dataRegion"})," parameter. You will need to restart the cluster after changing the data region parameters."]}),"\n",(0,r.jsxs)(n.p,{children:["You can also change these properties for ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"distribution zones"})," you have created for yourself."]}),"\n",(0,r.jsxs)(n.p,{children:["You can get information about the data region by using the ",(0,r.jsx)(n.code,{children:"cluster config show ignite.aipersist"})," CLI command. Here is how the default data region may look like:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "checkpoint" : {\r\n "checkpointDelayMillis" : 200,\r\n "checkpointThreads" : 4,\r\n "compactionThreads" : 4,\r\n "frequency" : 180000,\r\n "frequencyDeviation" : 40,\r\n "logReadLockThresholdTimeoutMillis" : 0,\r\n "readLockTimeoutMillis" : 10000,\r\n "useAsyncFileIoFactory" : true\r\n },\r\n "defaultRegion" : {\r\n "memoryAllocator" : {\r\n "type" : "unsafe"\r\n },\r\n "replacementMode" : "CLOCK",\r\n "size" : 268435456\r\n },\r\n "pageSizeBytes" : 16384,\r\n "regions" : [ ]\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["To change the size of the default region, use the ",(0,r.jsx)(n.code,{children:"cluster config update"})," command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster config update --url http://localhost:10300 ignite.aipersist.defaultRegion.size:9999999\n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuring-local-paths",children:"Configuring Local Paths"}),"\n",(0,r.jsxs)(n.p,{children:["By default, all files generated by Ignite are stored in the installation folder. However, depending on your environment, you may need to change the path to your files. You can use the ",(0,r.jsx)(n.code,{children:"{IGNITE_HOME}\\etc\\vars.env"})," file to change the storage paths of your files. You can change paths to the following:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Work directory, where data is stored."}),"\n",(0,r.jsx)(n.li,{children:"Log folder, where logs are placed."}),"\n",(0,r.jsx)(n.li,{children:"The folder from which libraries are loaded."}),"\n",(0,r.jsx)(n.li,{children:"The configuration file that is used to set up the default node."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Additionally, in the node configuration you can set:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The location CMG information is stored to by setting the ",(0,r.jsx)(n.code,{children:"ignite.system.cmgPath"})," property."]}),"\n",(0,r.jsxs)(n.li,{children:["The location metastorage information is stored to by setting the ",(0,r.jsx)(n.code,{children:"ignite.system.metastoragePath"})," property."]}),"\n",(0,r.jsxs)(n.li,{children:["The location data partitions are stored in by setting the ",(0,r.jsx)(n.code,{children:"ignite.system.partitionsBasePath"})," property."]}),"\n",(0,r.jsxs)(n.li,{children:["The location RAFT logs are stored in by setting the ",(0,r.jsx)(n.code,{children:"ignite.system.partitionsLogPath"})," property. These logs are separate from node logs."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"configuring-heap-usage",children:"Configuring Heap Usage"}),"\n",(0,r.jsxs)(n.p,{children:["Ignite stores data in off-heap memory, reserved individually for each ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent",children:"storage engine"})," as required. However, Java Heap memory is still used to handle intermediary objects generated by workloads. For example:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Cluster and node metadata. This includes information about what nodes are part of the cluster, internal logs, table ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions#version-storage",children:"version chains"}),", what keys are locked for transactions, and all other information required for Ignite to operate normally."]}),"\n",(0,r.jsx)(n.li,{children:"Intermediary query results. This may lead to needing more heap memory when executing queries on especially large data sets."}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/compute/",children:"Compute"})," operations are likely to use heap memory to store data. Specific requirements for compute jobs vary depending on what job is being performed."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"By default, Ignite allocates 16GB to heap storage. Depending on your environment and workload, you may want to change this value. Smaller heap would mean faster garbage collection, and less resources allocated to Ignite. Larger heap allows to handle more objects, but garbage collection may take longer."}),"\n",(0,r.jsxs)(n.p,{children:["To configure allocated heap, you can use the ",(0,r.jsx)(n.code,{children:"JVM_MAX_MEM"})," and ",(0,r.jsx)(n.code,{children:"JVM_MIN_MEM"})," variables stored in the ",(0,r.jsx)(n.code,{children:"{IGNITE_HOME}\\etc\\vars.env"})," file. These variables are the equivalent of setting the ",(0,r.jsx)(n.code,{children:"Xmx"})," and ",(0,r.jsx)(n.code,{children:"Xms"})," variables in JVM."]}),"\n",(0,r.jsx)(n.h2,{id:"configuring-server-logging",children:"Configuring Server Logging"}),"\n",(0,r.jsxs)(n.p,{children:["By default, Ignite 3 uses the ",(0,r.jsx)(n.code,{children:"java.util.logging"})," (JUL) logging framework. It utilizes the ",(0,r.jsx)(n.code,{children:"etc/ignite.java.util.logging.properties"})," configuration and outputs logs to the folder the ",(0,r.jsx)(n.code,{children:"LOG_DIR"})," variable points to (can be configured in the ",(0,r.jsx)(n.code,{children:"etc/vars.env"})," file). By default, logs are stored in the ",(0,r.jsx)(n.code,{children:"{IGNITE_HOME}/log"})," folder. You can provide a custom configuration file using the ",(0,r.jsx)(n.code,{children:"java.util.logging.config.file"})," property."]}),"\n",(0,r.jsxs)(n.p,{children:["For more information on configuring JUL logging, see the ",(0,r.jsx)(n.a,{href:"https://docs.oracle.com/en/java/javase/11/core/java-logging-overview.html",children:"Java Logging Overview"})," in Oracle documentation."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["You can also configure client logging for the ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/clients/java#logging",children:"Java client"}),"."]})})]})}function g(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/7a459efc.df153344.js b/docs/ignite3/assets/js/7a459efc.df153344.js deleted file mode 100644 index 9cd183391d..0000000000 --- a/docs/ignite3/assets/js/7a459efc.df153344.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4005],{11470:(e,r,n)=>{n.d(r,{A:()=>f});var t=n(96540),l=n(34164),a=n(17559),s=n(23104),i=n(56347),o=n(205),u=n(57485),c=n(31682),d=n(70679);function h(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:r}=e;return!!r&&"object"==typeof r&&"value"in r}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:r,children:n}=e;return(0,t.useMemo)(()=>{const e=r??function(e){return h(e).map(({props:{value:e,label:r,attributes:n,default:t}})=>({value:e,label:r,attributes:n,default:t}))}(n);return function(e){const r=(0,c.XI)(e,(e,r)=>e.value===r.value);if(r.length>0)throw new Error(`Docusaurus error: Duplicate values "${r.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[r,n])}function b({value:e,tabValues:r}){return r.some(r=>r.value===e)}function m({queryString:e=!1,groupId:r}){const n=(0,i.W6)(),l=function({queryString:e=!1,groupId:r}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:e,groupId:r});return[(0,u.aZ)(l),(0,t.useCallback)(e=>{if(!l)return;const r=new URLSearchParams(n.location.search);r.set(l,e),n.replace({...n.location,search:r.toString()})},[l,n])]}function g(e){const{defaultValue:r,queryString:n=!1,groupId:l}=e,a=p(e),[s,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:r}){if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!b({value:e,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${r.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=r.find(e=>e.default)??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:r,tabValues:a})),[u,c]=m({queryString:n,groupId:l}),[h,g]=function({groupId:e}){const r=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,l]=(0,d.Dv)(r);return[n,(0,t.useCallback)(e=>{r&&l.set(e)},[r,l])]}({groupId:l}),j=(()=>{const e=u??h;return b({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{j&&i(j)},[j]);return{selectedValue:s,selectValue:(0,t.useCallback)(e=>{if(!b({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),g(e)},[c,g,a]),tabValues:a}}var j=n(92303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=n(74848);function C({className:e,block:r,selectedValue:n,selectValue:t,tabValues:a}){const i=[],{blockElementScrollPositionUntilNextRender:o}=(0,s.a_)(),u=e=>{const r=e.currentTarget,l=i.indexOf(r),s=a[l].value;s!==n&&(o(r),t(s))},c=e=>{let r=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const n=i.indexOf(e.currentTarget)+1;r=i[n]??i[0];break}case"ArrowLeft":{const n=i.indexOf(e.currentTarget)-1;r=i[n]??i[i.length-1];break}}r?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":r},e),children:a.map(({value:e,label:r,attributes:t})=>(0,v.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{i.push(e)},onKeyDown:c,onClick:u,...t,className:(0,l.A)("tabs__item",x.tabItem,t?.className,{"tabs__item--active":n===e}),children:r??e},e))})}function y({lazy:e,children:r,selectedValue:n}){const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===n);return e?(0,t.cloneElement)(e,{className:(0,l.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,r)=>(0,t.cloneElement)(e,{key:r,hidden:e.props.value!==n}))})}function w(e){const r=g(e);return(0,v.jsxs)("div",{className:(0,l.A)(a.G.tabs.container,"tabs-container",x.tabList),children:[(0,v.jsx)(C,{...r,...e}),(0,v.jsx)(y,{...r,...e})]})}function f(e){const r=(0,j.A)();return(0,v.jsx)(w,{...e,children:h(e.children)},String(r))}},19365:(e,r,n)=>{n.d(r,{A:()=>s});n(96540);var t=n(34164);const l={tabItem:"tabItem_Ymn6"};var a=n(74848);function s({children:e,hidden:r,className:n}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,t.A)(l.tabItem,n),hidden:r,children:e})}},28453:(e,r,n)=>{n.d(r,{R:()=>s,x:()=>i});var t=n(96540);const l={},a=t.createContext(l);function s(e){const r=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),t.createElement(a.Provider,{value:r},e.children)}},89233:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"developers-guide/compute/serialization","title":"Object Serialization","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/compute/serialization.md","sourceDirName":"developers-guide/compute","slug":"/developers-guide/compute/serialization","permalink":"/docs/ignite3/3.0.0/developers-guide/compute/serialization","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Object Serialization","sidebar_label":"Object Serialization"},"sidebar":"tutorialSidebar","previous":{"title":"Distributed Computing","permalink":"/docs/ignite3/3.0.0/developers-guide/compute/"},"next":{"title":"Performing Transactions","permalink":"/docs/ignite3/3.0.0/developers-guide/transactions"}}');var l=n(74848),a=n(28453),s=n(11470),i=n(19365);const o={title:"Object Serialization",sidebar_label:"Object Serialization"},u=void 0,c={},d=[{value:"Native Types",id:"native-types",level:2},{value:"Tuples",id:"tuples",level:2},{value:"User Objects",id:"user-objects",level:2},{value:"Server-Side",id:"server-side",level:3},{value:"Client-Side",id:"client-side",level:3}];function h(e){const r={code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:["\n","\n",(0,l.jsx)(r.p,{children:"Apache Ignite provides a way to serialize your java objects and types and send the data between servers and clients."}),"\n",(0,l.jsx)(r.h2,{id:"native-types",children:"Native Types"}),"\n",(0,l.jsx)(r.p,{children:"Apache Ignite handles native type serialization automatically. For example, the following Compute job accepts an Integer and returns an Integer:"}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class IntegerComputeJob implements ComputeJob {\r\n @Override\r\n public @Nullable CompletableFuture executeAsync(\r\n JobExecutionContext context, @Nullable Integer arg\r\n ) {\r\n return completedFuture(arg - 1);\r\n }\r\n}\n"})}),"\n",(0,l.jsx)(r.p,{children:"Since both the argument and the result are native types and are serialized automatically, you do not need any additional code to handle the serialization:"}),"\n",(0,l.jsxs)(s.A,{groupId:"programming-languages",children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("address/to/cluster:port").build()) {\r\nInteger result = client.compute().execute(\r\nJobTarget.anyNode(client.clusterNodes()),\r\nJobDescriptor.builder(IntegerComputeJob.class).build(),\r\n1\r\n);\r\n}\n'})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:'using var client = await IgniteClient.StartAsync(\r\n new IgniteClientConfiguration("address/to/cluster:port"));\r\n\r\nIJobExecution jobExec = await client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(await client.GetClusterNodesAsync()),\r\n new JobDescriptor("org.example.IntegerComputeJob"),\r\n 1);\r\n\r\nint result = await jobExec.GetResultAsync();\n'})})})]}),"\n",(0,l.jsx)(r.h2,{id:"tuples",children:"Tuples"}),"\n",(0,l.jsx)(r.p,{children:"Apache Ignite is designed around working with Tuples, and handles tuple serialization automatically. For example, the following Job accepts Tuple and returns Tuple:"}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:'class TupleComputeJob implements ComputeJob {\r\n @Override\r\n public @Nullable CompletableFuture executeAsync(JobExecutionContext context, @Nullable Tuple arg) {\r\n Tuple resultTuple = Tuple.copy(arg);\r\n resultTuple.set("col", "new value");\r\n\r\n return completedFuture(resultTuple);\r\n }\r\n}\n'})}),"\n",(0,l.jsx)(r.p,{children:"Since both the argument and the result are tuples, they are serialized automatically, and you do not need to handle serialization:"}),"\n",(0,l.jsxs)(s.A,{groupId:"programming-languages",children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("address/to/cluster:port").build()) {\r\nTuple resultTuple = client.compute().execute(\r\nJobTarget.anyNode(client.clusterNodes()),\r\nJobDescriptor.builder(TupleComputeJob.class).build(),\r\nTuple.create().set("col", "value")\r\n);\r\n}\n'})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:'using var client = await IgniteClient.StartAsync(\r\n new IgniteClientConfiguration("address/to/cluster:port"));\r\n\r\nIJobExecution jobExec = await client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(await client.GetClusterNodesAsync()),\r\n new JobDescriptor("org.example.TupleComputeJob"),\r\n new IgniteTuple { ["col"] = "value" });\r\n\r\nIIgniteTuple result = await jobExec.GetResultAsync();\n'})})})]}),"\n",(0,l.jsx)(r.h2,{id:"user-objects",children:"User Objects"}),"\n",(0,l.jsx)(r.p,{children:"User objects are marshalled automatically in the following way:"}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsx)(r.li,{children:"If a custom marshaller is defined, it is used."}),"\n",(0,l.jsx)(r.li,{children:"If no marshaller is defined, user Java objects are marshalled to binary tuples."}),"\n",(0,l.jsx)(r.li,{children:"If there are nested objects, they are recursively marshalled to tuples."}),"\n"]}),"\n",(0,l.jsxs)(r.p,{children:["Below is an example of user objects marshalled with custom logic (using JSON serialization with ",(0,l.jsx)(r.code,{children:"ObjectMapper"}),", but you can do whatever you think is good for your use case)."]}),"\n",(0,l.jsx)(r.p,{children:"Let's start with Compute job definition that should be a part of the same deployment unit."}),"\n",(0,l.jsx)(r.h3,{id:"server-side",children:"Server-Side"}),"\n",(0,l.jsx)(r.p,{children:"The code below shows how to handle marshalling on a server, so that it can properly send the data to the clients and receive their responses:"}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsx)(r.li,{children:"This is the custom object that we will be using as an argument the job:"}),"\n"]}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class ArgumentCustomServerObject {\r\n int arg1;\r\n String arg2;\r\n}\n"})}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsxs)(r.li,{children:["We need to define a marshaller for it using the ",(0,l.jsx)(r.code,{children:"ObjectMapper"})," object:"]}),"\n"]}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"final ObjectMapper MAPPER = new ObjectMapper();\r\n\r\nclass ArgumentCustomServerObjectMarshaller implements Marshaller {\r\n @Override\r\n public byte @Nullable [] marshal(@Nullable ArgumentCustomServerObject object) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.writeValueAsBytes(object);\r\n } catch (JsonProcessingException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n\r\n @Override\r\n public @Nullable ArgumentCustomServerObject unmarshal(byte @Nullable [] raw) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.readValue(raw, ArgumentCustomServerObject.class);\r\n } catch (IOException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n}\r\n\n"})}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsx)(r.li,{children:"Let's also create another object that will be used to store Compute job results, and the corresponding marshaller:"}),"\n"]}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class ResultCustomServerObject {\r\n int res1;\r\n String res2;\r\n long res3;\r\n}\r\n\r\nclass ResultCustomServerObjectMarshaller implements Marshaller {\r\n @Override\r\n public byte @Nullable [] marshal(@Nullable ResultCustomServerObject object) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.writeValueAsBytes(object);\r\n } catch (JsonProcessingException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n\r\n @Override\r\n public @Nullable ResultCustomServerObject unmarshal(byte @Nullable [] raw) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.readValue(raw, ResultCustomServerObject.class);\r\n } catch (IOException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n}\n"})}),"\n",(0,l.jsxs)(r.p,{children:["The marshallers above define how to represent corresponding objects as ",(0,l.jsx)(r.code,{children:"byte[]"}),", and how to read these objects from ",(0,l.jsx)(r.code,{children:"byte[]"}),". However, defining these classes does not enable custom serialization, as you need to specify the marshaller to use when serializing objects. In Apache Ignite, this is done by overriding two methods in Compute job definition to use them as factory methods for marshallers:"]}),"\n",(0,l.jsx)(r.p,{children:"The code below provides an example of implementing marshallers in a compute job:"}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class PojoComputeJob implements ComputeJob {\r\n\r\n @Override\r\n public @Nullable CompletableFuture executeAsync(\r\n JobExecutionContext context,\r\n @Nullable ArgumentCustomServerObject arg\r\n ) {\r\n ResultCustomServerObject res = new ResultCustomServerObject();\r\n res.res1 = arg.arg1;\r\n res.res2 = arg.arg2;\r\n res.res3 = 1;\r\n\r\n return completedFuture(res);\r\n }\r\n\r\n @Override\r\n public Marshaller inputMarshaller() {\r\n return new ArgumentCustomServerObjectMarshaller();\r\n }\r\n\r\n @Override\r\n public Marshaller resultMarshaller() {\r\n return new ResultCustomServerObjectMarshaller();\r\n }\r\n}\n"})}),"\n",(0,l.jsx)(r.p,{children:"With this, the Apache Ignite server will be able to handle marshalling the required objects to sending them to clients, and unmarshalling the client responses."}),"\n",(0,l.jsx)(r.h3,{id:"client-side",children:"Client-Side"}),"\n",(0,l.jsx)(r.p,{children:"On the client side, largely the same code is required to handle the incoming objects and to marshal the response:"}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsx)(r.li,{children:"Define the custom object that is used for compute job:"}),"\n"]}),"\n",(0,l.jsxs)(s.A,{groupId:"programming-languages",children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class ArgumentCustomClientObject {\r\nint arg1;\r\nString arg2;\r\n}\n"})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:"record ArgumentCustomClientObject(int arg1, string arg2);\n"})})})]}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsx)(r.li,{children:"Define the marshaller for the object:"}),"\n"]}),"\n",(0,l.jsxs)(s.A,{groupId:"programming-languages",children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"final ObjectMapper MAPPER = new ObjectMapper();\r\n\r\nclass ArgumentCustomClientObjectMarshaller implements Marshaller {\r\n@Override\r\npublic byte @Nullable [] marshal(@Nullable ArgumentCustomClientObject object) throws UnsupportedObjectTypeMarshallingException {\r\ntry {\r\nreturn MAPPER.writeValueAsBytes(object);\r\n} catch (JsonProcessingException e) {\r\nthrow new RuntimeException(e);\r\n}\r\n}\r\n\r\n @Override\r\n public @Nullable ArgumentCustomClientObject unmarshal(byte @Nullable [] raw) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.readValue(raw, ArgumentCustomClientObject.class);\r\n } catch (IOException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n}\n"})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:"class MyJsonMarshaller : IMarshaller\r\n{\r\n public void Marshal(T obj, IBufferWriter writer)\r\n {\r\n using var utf8JsonWriter = new Utf8JsonWriter(writer);\r\n JsonSerializer.Serialize(utf8JsonWriter, obj);\r\n }\r\n\r\n public T Unmarshal(ReadOnlySpan bytes) =>\r\n JsonSerializer.Deserialize(bytes)!;\r\n}\n"})})})]}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsx)(r.li,{children:"Do the same for the result object:"}),"\n"]}),"\n",(0,l.jsxs)(s.A,{groupId:"programming-languages",children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class ResultCustomClientObject {\r\nint res1;\r\nString res2;\r\nlong res3;\r\n}\r\n\r\n\r\nclass ResultCustomClientObjectMarshaller implements Marshaller {\r\n@Override\r\npublic byte @Nullable [] marshal(@Nullable ResultCustomClientObject object) throws UnsupportedObjectTypeMarshallingException {\r\ntry {\r\nreturn MAPPER.writeValueAsBytes(object);\r\n} catch (JsonProcessingException e) {\r\nthrow new RuntimeException(e);\r\n}\r\n}\r\n\r\n @Override\r\n public @Nullable ResultCustomClientObject unmarshal(byte @Nullable [] raw) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.readValue(raw, ResultCustomClientObject.class);\r\n } catch (IOException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n}\r\n\r\n// ....\n"})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:"record ResultCustomClientObject(int res1, string res2, long res3);\r\n\r\n// Use the same generic MyJsonMarshaller class (see above) for the result object.\n"})})})]}),"\n",(0,l.jsx)(r.p,{children:"Now that all marshallers are defined, you can start working with the custom objects and handle marshalling of arguments and results in your compute jobs:"}),"\n",(0,l.jsxs)(s.A,{groupId:"programming-languages",children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("address/to/cluster:port").build()) {\r\n// Marshalling example of pojo.\r\nResultCustomClientObject resultPojo = client.compute().execute(\r\nJobTarget.anyNode(client.clusterNodes()),\r\nJobDescriptor.builder(PojoComputeJob.class.getName())\r\n.argumentMarshaller(new ArgumentCustomClientObjectMarshaller())\r\n.resultMarshaller(new ResultCustomClientObjectMarshaller())\r\n.build(),\r\nnew ArgumentCustomClientObject()\r\n);\r\n}\n'})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:'using var client = await IgniteClient.StartAsync(\r\nnew IgniteClientConfiguration("address/to/cluster:port"));\r\n\r\nIJobExecution jobExec = await client.Compute.SubmitAsync(\r\nJobTarget.AnyNode(await client.GetClusterNodesAsync()),\r\nnew JobDescriptor("org.example.PojoComputeJob")\r\n{\r\nArgMarshaller = new MyJsonMarshaller(),\r\nResultMarshaller = new MyJsonMarshaller()\r\n},\r\nnew ArgumentCustomClientObject(1, "abc"));\r\n\r\nResultCustomClientObject result = await jobExec.GetResultAsync();\n'})})})]})]})}function p(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,l.jsx)(r,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/7bd5cb78.78a0588f.js b/docs/ignite3/assets/js/7bd5cb78.78a0588f.js deleted file mode 100644 index f2b81243b3..0000000000 --- a/docs/ignite3/assets/js/7bd5cb78.78a0588f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9399],{28453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>s});var t=n(96540);const o={},a=t.createContext(o);function r(e){const i=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(a.Provider,{value:i},e.children)}},35130:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>s,default:()=>g,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"configure-and-operate/configuration/config-storage-overview","title":"Storage","description":"Apache Ignite 3 features a modern and highly configurable storage system that allows you to choose where and how your data is stored. This topic provides an overview of storage principles in Apache Ignite.","source":"@site/docs/configure-and-operate/configuration/storage-overview.md","sourceDirName":"configure-and-operate/configuration","slug":"/configure-and-operate/configuration/config-storage-overview","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-overview","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"config-storage-overview","title":"Storage","sidebar_label":"Storage Overview"},"sidebar":"tutorialSidebar","previous":{"title":"Cluster and Nodes","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes"},"next":{"title":"Storage Profiles","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage"}}');var o=n(74848),a=n(28453);const r={id:"config-storage-overview",title:"Storage",sidebar_label:"Storage Overview"},s=void 0,l={},d=[{value:"What is a Storage Engine?",id:"what-is-a-storage-engine",level:2},{value:"Available Storage Engines",id:"available-storage-engines",level:2},{value:"AIMemory Storage (Volatile)",id:"aimemory-storage-volatile",level:3},{value:"AIPersist Storage (B+ tree)",id:"aipersist-storage-b-tree",level:3},{value:"RocksDB Storage (LSM tree)",id:"rocksdb-storage-lsm-tree",level:3},{value:"Configuring Storage Engines",id:"configuring-storage-engines",level:2},{value:"What is a Storage Profile?",id:"what-is-a-storage-profile",level:2},{value:"Default Storage Profile",id:"default-storage-profile",level:2},{value:"Creating and Using Storage Profiles",id:"creating-and-using-storage-profiles",level:2},{value:"Defining Tables With Storage Profiles",id:"defining-tables-with-storage-profiles",level:2}];function c(e){const i={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.p,{children:"Apache Ignite 3 features a modern and highly configurable storage system that allows you to choose where and how your data is stored. This topic provides an overview of storage principles in Apache Ignite."}),"\n",(0,o.jsx)(i.p,{children:"The diagram below depicts the relationship between tables, distribution zones, storage profiles and storage engines:"}),"\n",(0,o.jsx)(i.p,{children:(0,o.jsx)(i.img,{alt:"Storage architecture",src:n(61841).A+"",width:"987",height:"572"})}),"\n",(0,o.jsx)(i.p,{children:"In Apache Ignite, storage has both cluster-wide and node-specific components:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Cluster-wide Components"}),": Table definitions, Distribution Zone configurations, and Profile names/types are consistent across the entire cluster."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.strong,{children:"Node-specific Components"}),": The actual implementation of a Storage Profile is configured locally on each node."]}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"In Apache Ignite's architecture:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Tables contain your data and are assigned to distribution zones"}),"\n",(0,o.jsx)(i.li,{children:"Distribution zones determine how data is partitioned and distributed across the cluster"}),"\n",(0,o.jsx)(i.li,{children:"Storage profiles define which storage engine to use and how to configure it"}),"\n",(0,o.jsx)(i.li,{children:"Storage engines handle the actual storage and retrieval of data"}),"\n"]}),"\n",(0,o.jsxs)(i.p,{children:['For example, all nodes using a profile named "fast_storage" must configure it with the same engine type (e.g., ',(0,o.jsx)(i.code,{children:"aimem"}),"), but can have different settings in storage profiles (like memory allocation) based on each node's capabilities."]}),"\n",(0,o.jsx)(i.h2,{id:"what-is-a-storage-engine",children:"What is a Storage Engine?"}),"\n",(0,o.jsx)(i.p,{children:"Storage engines handle how your data is physically written to and read from storage media. Each engine has its own approach to organizing and accessing data, optimized for different usage patterns. It defines:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"The binary format of stored data"}),"\n",(0,o.jsx)(i.li,{children:"Configuration properties for specific data formats"}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"Apache Ignite supports different storage engines that can be used interchangeably, depending on your expected database workload."}),"\n",(0,o.jsx)(i.h2,{id:"available-storage-engines",children:"Available Storage Engines"}),"\n",(0,o.jsx)(i.h3,{id:"aimemory-storage-volatile",children:"AIMemory Storage (Volatile)"}),"\n",(0,o.jsx)(i.p,{children:"Apache Ignite Volatile storage provides quick, in-memory storage without persistence guarantees. All data is stored in RAM and will be lost on cluster shutdown."}),"\n",(0,o.jsx)(i.h3,{id:"aipersist-storage-b-tree",children:"AIPersist Storage (B+ tree)"}),"\n",(0,o.jsx)(i.p,{children:"Apache Ignite Persistence provides responsive persistent storage. It stores all data on disk, loading as much as possible into RAM for processing. Each partition is stored in a separate file, along with indexes and metadata."}),"\n",(0,o.jsx)(i.h3,{id:"rocksdb-storage-lsm-tree",children:"RocksDB Storage (LSM tree)"}),"\n",(0,o.jsx)(i.p,{children:"RocksDB is an experimental persistent storage engine based on LSM tree, optimized for environments with a high number of write requests."}),"\n",(0,o.jsx)(i.h2,{id:"configuring-storage-engines",children:"Configuring Storage Engines"}),"\n",(0,o.jsx)(i.p,{children:"Storage engine configuration applies to all profiles using that engine. All storage engines start with their respective default configuration. To change storage engine configuration, use the CLI tool:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-shell",children:"node config show ignite.storage.engines\r\nnode config update ignite.storage.engines.aipersist.checkpoint.intervalMillis = 16000\n"})}),"\n",(0,o.jsx)(i.p,{children:"After updating the configuration, restart the node for changes to take effect."}),"\n",(0,o.jsx)(i.h2,{id:"what-is-a-storage-profile",children:"What is a Storage Profile?"}),"\n",(0,o.jsxs)(i.p,{children:["A storage profile is the Apache Ignite node entity that defines the configuration parameters for a Storage Engine. A ",(0,o.jsx)(i.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"Distribution Zone"})," must be configured to use a set of Storage Profiles declared in the node configuration. A table can only have a single primary storage profile defined."]}),"\n",(0,o.jsx)(i.p,{children:"Storage profiles define:"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsx)(i.li,{children:"Which storage engine is used to store data"}),"\n",(0,o.jsx)(i.li,{children:"Configuration values for that storage engine"}),"\n"]}),"\n",(0,o.jsx)(i.p,{children:"You can declare any number of storage profiles on a node."}),"\n",(0,o.jsx)(i.h2,{id:"default-storage-profile",children:"Default Storage Profile"}),"\n",(0,o.jsxs)(i.p,{children:["Apache Ignite creates a ",(0,o.jsx)(i.code,{children:"default"})," storage profile that uses the persistent Apache Ignite storage engine (",(0,o.jsx)(i.code,{children:"aipersist"}),"). Unless otherwise specified, distribution zones will use this storage profile. To check the currently available profiles on a node, use:"]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-shell",children:"node config show ignite.storage.profiles\n"})}),"\n",(0,o.jsx)(i.h2,{id:"creating-and-using-storage-profiles",children:"Creating and Using Storage Profiles"}),"\n",(0,o.jsxs)(i.p,{children:["While Apache Ignite creates the ",(0,o.jsx)(i.code,{children:"default"})," storage profile automatically, you can create additional profiles as needed. To create a new profile, pass the profile configuration to the ",(0,o.jsx)(i.code,{children:"storage.profiles"})," parameter:"]}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-shell",children:'node config update "ignite.storage.profiles:{rocksProfile{engine:rocksdb,sizeBytes:10000}}"\n'})}),"\n",(0,o.jsx)(i.p,{children:"After configuration is updated and the node restarted, the new storage profile becomes available for use by distribution zones."}),"\n",(0,o.jsx)(i.h2,{id:"defining-tables-with-storage-profiles",children:"Defining Tables With Storage Profiles"}),"\n",(0,o.jsxs)(i.p,{children:["After defining storage profiles and ",(0,o.jsx)(i.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"distribution zones"}),", you can create tables using SQL or ",(0,o.jsx)(i.a,{href:"/3.1.0/develop/work-with-data/java-to-tables",children:"from code"}),". Both zone and storage profile cannot be changed after table creation."]}),"\n",(0,o.jsx)(i.p,{children:"To create a table with a specific storage profile:"}),"\n",(0,o.jsx)(i.pre,{children:(0,o.jsx)(i.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone STORAGE PROFILES ['default, profile1'];\r\n\r\nCREATE TABLE exampleTable (key INT PRIMARY KEY, my_value VARCHAR)\r\nZONE exampleZone STORAGE PROFILE 'profile1';\n"})}),"\n",(0,o.jsxs)(i.p,{children:["In this case, ",(0,o.jsx)(i.code,{children:"exampleTable"})," uses the storage engine with parameters specified in the ",(0,o.jsx)(i.code,{children:"profile1"})," storage profile. If a node doesn't have ",(0,o.jsx)(i.code,{children:"profile1"})," configured, the table won't be stored on that node. Each node may have different configuration for ",(0,o.jsx)(i.code,{children:"profile1"}),", and data will be stored according to local configuration."]})]})}function g(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},61841:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/storage-5b255ab63bb718db1ac062ed20385833.png"}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/7ea0a1cf.fe11d1c4.js b/docs/ignite3/assets/js/7ea0a1cf.fe11d1c4.js deleted file mode 100644 index e64fbaef3f..0000000000 --- a/docs/ignite3/assets/js/7ea0a1cf.fe11d1c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9],{28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>l});var r=t(96540);const i={},s=r.createContext(i);function a(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:n},e.children)}},98129:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"installation/installing-to-k8s","title":"Installing on Kubernetes","description":"{/*","source":"@site/versioned_docs/version-3.0.0/installation/installing-to-k8s.md","sourceDirName":"installation","slug":"/installation/installing-to-k8s","permalink":"/docs/ignite3/3.0.0/installation/installing-to-k8s","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Installing on Kubernetes","sidebar_label":"Installing on Kubernetes"},"sidebar":"tutorialSidebar","previous":{"title":"Installing Using Docker","permalink":"/docs/ignite3/3.0.0/installation/installing-using-docker"},"next":{"title":"Migration From Apache Ignite 2","permalink":"/docs/ignite3/3.0.0/installation/migration-from-ai2/"}}');var i=t(74848),s=t(28453);const a={title:"Installing on Kubernetes",sidebar_label:"Installing on Kubernetes"},l=void 0,o={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Recommended Kubernetes Version",id:"recommended-kubernetes-version",level:3},{value:"Installation Steps",id:"installation-steps",level:2},{value:"Create ConfigMaps",id:"create-configmaps",level:3},{value:"Create and Deploy the Service",id:"create-and-deploy-the-service",level:3},{value:"Deploy the StatefulSet",id:"deploy-the-statefulset",level:3},{value:"Wait for Pods to Start",id:"wait-for-pods-to-start",level:3},{value:"Deploy the Job",id:"deploy-the-job",level:3},{value:"Installation Verification",id:"installation-verification",level:2},{value:"Installation Troubleshooting",id:"installation-troubleshooting",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(n.p,{children:"You can install Apache Ignite 3 and run an Apache Ignite cluster on Kubernetes cluster. This section describes all the necessary steps, as well as provides the configurations and manifests that you can copy and paste into your environment."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Using the ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/installation/installing-to-k8s",children:"Helm chart"})," is recommended, however, if you choose not to use Helm, this guide will walk you through installing Apache Ignite on Kubernetes."]})}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsx)(n.h3,{id:"recommended-kubernetes-version",children:"Recommended Kubernetes Version"}),"\n",(0,i.jsx)(n.p,{children:"Kubernetes 1.25 or later."}),"\n",(0,i.jsx)(n.h2,{id:"installation-steps",children:"Installation Steps"}),"\n",(0,i.jsx)(n.h3,{id:"create-configmaps",children:"Create ConfigMaps"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Create the Apache Ignite configuration file. The minimum node configuration is as follows:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",metastring:'title="ignite-config.conf"',children:'ignite: {\r\n network: {\r\n # Apache Ignite 3 node port\r\n port = 3344\r\n nodeFinder = {\r\n netClusterNodes = [\r\n # Kubernetes service to access the Apache Ignite 3 cluster on the Kubernetes network\r\n "ignite-svc-headless:3344"\r\n ]\r\n }\r\n }\r\n\r\n storage: {\r\n profiles = [\r\n {\r\n engine = "aipersist"\r\n name = "default"\r\n replacementMode = "CLOCK"\r\n # Explicit storage size configuration\r\n sizeBytes = 2147483648\r\n }\r\n ]\r\n }\r\n}\n'})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Create the ConfigMap object for Apache Ignite configuration:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl create configmap ignite-config -n --from-file=ignite-config.conf\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Replace ",(0,i.jsx)(n.code,{children:""})," with the name of the namespace where you want to deploy Apache Ignite."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:["In Kubernetes deployments, the ",(0,i.jsx)(n.code,{children:"ignite-config.conf"})," file is mounted as a read-only ConfigMap, so any attempt to update it with the ",(0,i.jsx)(n.code,{children:"node config update"})," command will fail."]}),(0,i.jsx)(n.p,{children:"To update Apache Ignite node configuration, modify the existing ConfigMap and restart all Apache Ignite pods."}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Modify previously configured ConfigMap object:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"kubectl edit configmap ignite-config -n \n"})}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Restart Apache Ignite pod, repeat for every pod:"}),"\n"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"kubectl delete pod -n \n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"create-and-deploy-the-service",children:"Create and Deploy the Service"}),"\n",(0,i.jsx)(n.p,{children:"Depending on your requirements, define and deploy a Kubernetes service. Apache Ignite 3 use two types of services: one for internal cluster discovery, and the other for external client access."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["First, choose a type of service you need and prepare the ",(0,i.jsx)(n.code,{children:"service.yaml"})," file."]}),"\n"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["For communication inside the Kubernetes cluster, Use a headless service by setting the ",(0,i.jsx)(n.code,{children:"clusterIP"})," parameter to ",(0,i.jsx)(n.code,{children:"None"}),". This will expose each pod's IP, enabling Apache Ignite to be partition-aware: clients discover every node's address, determine which partition resides on which node, and send requests directly where the data is located."]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="service.yaml"',children:"apiVersion: v1\r\nkind: Service\r\nmetadata:\r\n # The name must be equal to netClusterNodes.\r\n name: ignite-svc-headless\r\n # Place your namespace name here.\r\n namespace: \r\nspec:\r\n clusterIP: None\r\n internalTrafficPolicy: Cluster\r\n ipFamilies:\r\n - IPv4\r\n ipFamilyPolicy: SingleStack\r\n ports:\r\n - name: management\r\n port: 10300\r\n protocol: TCP\r\n targetPort: 10300\r\n - name: rest\r\n port: 10800\r\n protocol: TCP\r\n targetPort: 10800\r\n - name: cluster\r\n port: 3344\r\n protocol: TCP\r\n targetPort: 3344\r\n selector:\r\n # Must be equal to the label set for pods.\r\n app: ignite\r\n # Include not-yet-ready nodes.\r\n publishNotReadyAddresses: True\r\n sessionAffinity: None\r\n type: ClusterIP\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Use a ",(0,i.jsx)(n.code,{children:"LoadBalancer"})," service to allow external clients to connect. Keep in mind, that with this option you giving up partition awareness."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["If your environments does not support ",(0,i.jsx)(n.code,{children:"LoadBalancer"}),", you can use ",(0,i.jsx)(n.code,{children:"type: NodePort"})," instead. Refer to the Kubernetes ",(0,i.jsx)(n.a,{href:"https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/",children:"documentation"})," for details."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"apiVersion: v1\r\nkind: Service\r\nmetadata:\r\n name: ignite-loadbalancer\r\n labels:\r\n app: ignite\r\nspec:\r\n type: LoadBalancer\r\n selector:\r\n app: ignite\r\n ports:\r\n - name: rest\r\n protocol: TCP\r\n port: 10800\r\n targetPort: 10800\r\n - name: client\r\n port: 10300\r\n protocol: TCP\r\n targetPort: 10300\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Then apply the ",(0,i.jsx)(n.code,{children:"service.yaml"})," file to set up this service:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl apply -f service.yaml\n"})}),"\n",(0,i.jsx)(n.h3,{id:"deploy-the-statefulset",children:"Deploy the StatefulSet"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Prepare the ",(0,i.jsx)(n.code,{children:"statefulset.yaml"})," file for StatefulSet deployment:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="statefulset.yaml"',children:'apiVersion: apps/v1\r\nkind: StatefulSet\r\nmetadata:\r\n # The cluster name.\r\n name: ignite-cluster\r\n # Place your namespace name.\r\n namespace: \r\nspec:\r\n # The initial number of pods to be started by Kubernetes.\r\n replicas: 2\r\n # Kubernetes service to access the Ignite 3 cluster on the Kubernetes network.\r\n serviceName: ignite-svc-headless\r\n selector:\r\n matchLabels:\r\n app: ignite\r\n template:\r\n metadata:\r\n labels:\r\n app: ignite\r\n spec:\r\n terminationGracePeriodSeconds: 60000\r\n containers:\r\n # Custom pod name.\r\n - name: ignite-node\r\n # Limits and requests for the Ignite container.\r\n resources:\r\n limits:\r\n cpu: "4"\r\n memory: 4Gi\r\n requests:\r\n cpu: "4"\r\n memory: 4Gi\r\n env:\r\n # Must be specified to ensure that Apache Ignite 3 cluster replicas are visible to each other.\r\n - name: IGNITE_NODE_NAME\r\n valueFrom:\r\n fieldRef:\r\n fieldPath: metadata.name\r\n # Apache Ignite 3 working directory.\r\n - name: IGNITE_WORK_DIR\r\n value: /ai3-work\r\n # Apache Ignite Docker image and its version.\r\n image: apache/ignite3:3.0.0\r\n ports:\r\n - containerPort: 10300\r\n - containerPort: 10800\r\n - containerPort: 3344\r\n volumeMounts:\r\n # The config will be placed at this path in the container.\r\n - mountPath: /opt/ignite/etc/ignite-config.conf\r\n name: config-vol\r\n subPath: ignite-config.conf\r\n # Ignite 3 working directory.\r\n - mountPath: /ai3-work\r\n name: persistence\r\n volumes:\r\n - name: config-vol\r\n configMap:\r\n name: ignite-config\r\n volumeClaimTemplates:\r\n - apiVersion: v1\r\n kind: PersistentVolumeClaim\r\n metadata:\r\n name: persistence\r\n spec:\r\n accessModes:\r\n - ReadWriteOnce\r\n resources:\r\n requests:\r\n storage: 10Gi # Provide enough space for your application data.\r\n volumeMode: Filesystem\n'})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Apply the ",(0,i.jsx)(n.code,{children:"statefulset.yaml"})," file to deploy the main components of Apache Ignite 3:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl apply -f statefulset.yaml\n"})}),"\n",(0,i.jsx)(n.h3,{id:"wait-for-pods-to-start",children:"Wait for Pods to Start"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Monitor the status of the pods:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl get pods -n -w\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Ensure that all pods' ",(0,i.jsx)(n.code,{children:"STATUS"})," is ",(0,i.jsx)(n.code,{children:"Running"})," before proceeding."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"deploy-the-job",children:"Deploy the Job"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Prepare the ",(0,i.jsx)(n.code,{children:"job.yaml"})," file for deploying the job:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",metastring:'title="job.yaml"',children:"apiVersion: batch/v1\r\nkind: Job\r\nmetadata:\r\n name: cluster-init\r\n # Place your namespace name here.\r\n namespace: \r\nspec:\r\n template:\r\n spec:\r\n containers:\r\n # Command to init the cluster. URL and host must be the name of the service you created before. Port is 10300 as the management port.\r\n - args:\r\n - -ec\r\n - |\r\n apt update && apt-get install -y bind9-host\r\n IGNITE_NODES=$(host -tsrv _cluster._tcp.ignite-svc-headless | grep 'SRV record' | awk '{print $8}' | awk -F. '{print $1}' | paste -sd ',')\r\n /opt/ignite3cli/bin/ignite3 cluster init --name=ignite --url=http://ignite-svc-headless:10300\r\n command:\r\n - /bin/sh\r\n # Specify the Docker image with the Apache Ignite 3 CLI and its version.\r\n image: apache/ignite3:3.0.0\r\n imagePullPolicy: IfNotPresent\r\n name: cluster-init\r\n resources: {}\r\n restartPolicy: Never\r\n terminationGracePeriodSeconds: 120\r\n\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Apply the ",(0,i.jsx)(n.code,{children:"job.yaml"})," file to complete installation."]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl apply -f job.yaml\n"})}),"\n",(0,i.jsx)(n.h2,{id:"installation-verification",children:"Installation Verification"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Check the status of all resources in your namespace:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl get all -n \n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsxs)(n.li,{children:["Ensure that all components are running as expected, without errors, and that the initialization job is in the ",(0,i.jsx)(n.code,{children:"Completed"})," status."]}),"\n",(0,i.jsx)(n.li,{children:"Verify that your cluster is initialized and running."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl exec -it ignite-cluster-0 bash -n \r\n/opt/ignite3cli/bin/ignite3 cluster status\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The command output must include the name of your cluster and the number of nodes. The status must be ",(0,i.jsx)(n.code,{children:"ACTIVE"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"installation-troubleshooting",children:"Installation Troubleshooting"}),"\n",(0,i.jsx)(n.p,{children:"If any issues occur during the installation:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Check the logs of specific pods:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl logs -n \n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Review events in the namespace:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"kubectl get events -n \n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/7faacd1a.3a176262.js b/docs/ignite3/assets/js/7faacd1a.3a176262.js deleted file mode 100644 index 2b7e336af2..0000000000 --- a/docs/ignite3/assets/js/7faacd1a.3a176262.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2265],{27647:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"administrators-guide/storage/engines/aimem","title":"Volatile Storage","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/storage/engines/aimem.md","sourceDirName":"administrators-guide/storage/engines","slug":"/administrators-guide/storage/engines/aimem","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Volatile Storage","sidebar_label":"Volatile Storage"},"sidebar":"tutorialSidebar","previous":{"title":"RocksDB Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb"},"next":{"title":"Data Partitioning","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions"}}');var r=t(74848),a=t(28453);const s={title:"Volatile Storage",sidebar_label:"Volatile Storage"},o=void 0,l={},d=[{value:"Overview",id:"overview",level:2},{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Configuration Example",id:"configuration-example",level:2}];function c(e){const i={code:"code",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(i.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(i.p,{children:"Apache Ignite Volatile storage is designed to provide a quick and responsive storage without guarantees of data persistence."}),"\n",(0,r.jsx)(i.p,{children:"When it is enabled for the data region, Apache Ignite stores all data in the data region in RAM. Data will be lost on cluster shutdown, so make sure to have a separate data region for persistent storage."}),"\n",(0,r.jsx)(i.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,r.jsx)(i.p,{children:"Each Apache Ignite storage engine can have several storage profiles. Each profile has the following properties:"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"aimem.initSizeBytes"}),(0,r.jsx)(i.td,{children:"268435456"}),(0,r.jsx)(i.td,{children:"Initial memory region size in bytes, when the used memory size exceeds this value, new chunks of memory will be allocated."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Min 256Mb, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"aimem.maxSizeBytes"}),(0,r.jsx)(i.td,{children:"(268435456 or 20% of physical memory)"}),(0,r.jsx)(i.td,{children:"Maximum memory region size in bytes. Calculated automatically as 256Mb or 20% of available memory, whichever is larger."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Min 256Mb, max defined by the addressable memory limit of the OS"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"configuration-example",children:"Configuration Example"}),"\n",(0,r.jsxs)(i.p,{children:['In Apache Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,r.jsx)(i.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node. The example below shows how to configure one data region that uses volatile storage."]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "storage" : {\r\n "profiles" : [\r\n {\r\n "engine": "aimem",\r\n "name": "default_aimem",\r\n "initSizeBytes": 268435456,\r\n "maxSizeBytes": 268435456\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.p,{children:["You can then use the profile (in this case, ",(0,r.jsx)(i.code,{children:"default_aimem"}),") in your distribution zone configuration."]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},28453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>o});var n=t(96540);const r={},a=n.createContext(r);function s(e){const i=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/83719db0.f2af8bcc.js b/docs/ignite3/assets/js/83719db0.f2af8bcc.js deleted file mode 100644 index 71b46b02c1..0000000000 --- a/docs/ignite3/assets/js/83719db0.f2af8bcc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[213],{6430:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"sql-tuning/using-explain","title":"How to Improve Queries With EXPLAIN Command","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-tuning/using-explain.md","sourceDirName":"sql-tuning","slug":"/sql-tuning/using-explain","permalink":"/docs/ignite3/3.0.0/sql-tuning/using-explain","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"How to Improve Queries With EXPLAIN Command","sidebar_label":"Using EXPLAIN"},"sidebar":"tutorialSidebar","previous":{"title":"SQL Performance Tuning","permalink":"/docs/ignite3/3.0.0/sql-tuning/"},"next":{"title":"General Configuration Tips","permalink":"/docs/ignite3/3.0.0/general-tips"}}');var i=r(74848),a=r(28453);const t={title:"How to Improve Queries With EXPLAIN Command",sidebar_label:"Using EXPLAIN"},l=void 0,o={},d=[{value:"EXPLAIN Command Syntax",id:"explain-command-syntax",level:2},{value:"Understanding The Output",id:"understanding-the-output",level:2},{value:"Operator Naming",id:"operator-naming",level:3},{value:"Hierarchical Plan Structure",id:"hierarchical-plan-structure",level:3},{value:"Common Query Optimization Issues",id:"common-query-optimization-issues",level:2},{value:"Full Scan Instead of Index Scan",id:"full-scan-instead-of-index-scan",level:2},{value:"Suboptimal Indexes",id:"suboptimal-indexes",level:2},{value:"Unexpected Sort Operation",id:"unexpected-sort-operation",level:2},{value:"Performance Impact of Correlated Subqueries",id:"performance-impact-of-correlated-subqueries",level:2},{value:"Excessive Sorting",id:"excessive-sorting",level:2},{value:"Select Count Optimization",id:"select-count-optimization",level:2},{value:"Index Scan Without Exact Search Bounds",id:"index-scan-without-exact-search-bounds",level:2},{value:"Prohibit Index Usage",id:"prohibit-index-usage",level:3},{value:"Manual Type Casting",id:"manual-type-casting",level:3},{value:"Colocation Usage",id:"colocation-usage",level:2},{value:"Comprehensive EXPLAIN Examples",id:"comprehensive-explain-examples",level:2},{value:"Example: Complex Join Query",id:"example-complex-join-query",level:3},{value:"Example: Query Mapping",id:"example-query-mapping",level:3}];function c(e){const n={admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsxs)(n.p,{children:["The SQL ",(0,i.jsx)(n.code,{children:"EXPLAIN"})," command is a powerful tool used to analyze and understand the execution plan of a query without actually executing it."]}),"\n",(0,i.jsx)(n.p,{children:"When you use the EXPLAIN command, it returns the query execution plan, which includes details such as:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The order in which tables are accessed."}),"\n",(0,i.jsx)(n.li,{children:"The type of join operations used (for example, nested loops, hash joins, or merge joins)."}),"\n",(0,i.jsx)(n.li,{children:"Any indexes that are used to speed up data retrieval."}),"\n",(0,i.jsx)(n.li,{children:"Estimated costs and row counts for different parts of the query."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"This information is crucial for optimizing query performance, identifying bottlenecks, and making informed decisions about database schema design and indexing strategies."}),"\n",(0,i.jsx)(n.h2,{id:"explain-command-syntax",children:"EXPLAIN Command Syntax"}),"\n",(0,i.jsxs)(n.p,{children:["Apache Ignite supports two variations of the ",(0,i.jsx)(n.code,{children:"EXPLAIN"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN [PLAN | MAPPING] FOR \n"})}),"\n",(0,i.jsxs)(n.p,{children:["If neither ",(0,i.jsx)(n.code,{children:"PLAN"})," nor ",(0,i.jsx)(n.code,{children:"MAPPING"})," is specified, then ",(0,i.jsx)(n.code,{children:"PLAN"})," is implicit."]}),"\n",(0,i.jsx)(n.p,{children:"Parameters:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"PLAN"})," - explains query in terms of relational operators tree. This representation is suitable for investigation of performance issues related to the optimizer."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"MAPPING"})," - explains query in terms of mapping of query fragment to a particular node of the cluster. This representation is suitable for investigation of performance issues related to the data colocation."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Examples:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN SELECT * FROM lineitem;\r\nEXPLAIN PLAN FOR SELECT * FROM lineitem;\r\nEXPLAIN MAPPING FOR SELECT * FROM lineitem;\n"})}),"\n",(0,i.jsx)(n.h2,{id:"understanding-the-output",children:"Understanding The Output"}),"\n",(0,i.jsx)(n.p,{children:"Each query plan is represented as a tree-like structure composed of relational operators."}),"\n",(0,i.jsx)(n.p,{children:"A node in the plan includes:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"name"}),", indicating the relational operator (e.g., ",(0,i.jsx)(n.code,{children:"TableScan"}),", ",(0,i.jsx)(n.code,{children:"IndexScan"}),", ",(0,i.jsx)(n.code,{children:"Sort"}),", ",(0,i.jsx)(n.code,{children:"Join"})," types)"]}),"\n",(0,i.jsxs)(n.li,{children:["A set of ",(0,i.jsx)(n.strong,{children:"attributes"}),", relevant to that specific operator"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"OperatorName\r\n attribute1: value1\r\n attribute2: value2\n"})}),"\n",(0,i.jsx)(n.h3,{id:"operator-naming",children:"Operator Naming"}),"\n",(0,i.jsx)(n.p,{children:"The operator name reflects the specific algorithm or strategy used. For example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"TableScan"})," \u2013 Full scan of a base table."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IndexScan"})," \u2013 Access via index, possibly sorted."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Sort"})," \u2013 Explicit sorting step."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"HashJoin"}),", ",(0,i.jsx)(n.code,{children:"MergeJoin"}),", ",(0,i.jsx)(n.code,{children:"NestedLoopJoin"})," \u2013 Types of join algorithms."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Limit"}),", ",(0,i.jsx)(n.code,{children:"Project"}),", ",(0,i.jsx)(n.code,{children:"Exchange"})," \u2013 Execution-related transformations and controls."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"hierarchical-plan-structure",children:"Hierarchical Plan Structure"}),"\n",(0,i.jsxs)(n.p,{children:["The plan is structured as a ",(0,i.jsx)(n.strong,{children:"tree"}),", where:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Leaf nodes"})," represent data sources (e.g., ",(0,i.jsx)(n.code,{children:"TableScan"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Internal nodes"})," represent data transformations (e.g., ",(0,i.jsx)(n.code,{children:"Join"}),", ",(0,i.jsx)(n.code,{children:"Sort"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"The root node"})," (topmost) is the final operator that produces the result"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"common-query-optimization-issues",children:"Common Query Optimization Issues"}),"\n",(0,i.jsx)(n.p,{children:"SQL EXPLAIN output analysis can help you optimize slow query execution. You can avoid common bottlenecks in SQL execution by following these guidelines:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Avoid scanning an entire table."}),"\n",(0,i.jsx)(n.li,{children:"Avoid scanning non-optimal indexes."}),"\n",(0,i.jsx)(n.li,{children:"Avoid suboptimal join ordering or join algorithm."}),"\n",(0,i.jsx)(n.li,{children:"Ensure optimal data colocation for your queries."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In the following sections, we will see some common issues with queries and ways to identify and fix them."}),"\n",(0,i.jsx)(n.h2,{id:"full-scan-instead-of-index-scan",children:"Full Scan Instead of Index Scan"}),"\n",(0,i.jsx)(n.p,{children:"Suppose related sql execution flow looks like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t (id INT PRIMARY KEY, col1 VARCHAR);\r\nCREATE INDEX t_col1_idx ON t(col1);\r\n\r\nSELECT id FROM t WHERE col1 = '1';\n"})}),"\n",(0,i.jsx)(n.p,{children:"And possible EXPLAIN output:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" TableScan\r\n table: PUBLIC.T\r\n predicate: =(COL1, _UTF-8'1')\r\n fieldNames: [ID]\r\n est: (rows=1)\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"For simplicity, here and below, information that is not related to the example is omitted from the EXPLAIN output."})}),"\n",(0,i.jsxs)(n.p,{children:["We can see a full scan (",(0,i.jsx)(n.strong,{children:"TableScan"})," operator) with predicate.\r\nThe execution planner chooses which scan implementation (",(0,i.jsx)(n.strong,{children:"TableScan"})," or ",(0,i.jsx)(n.strong,{children:"IndexScan"}),") to use.\r\nIf you expect that index scan is preferable, you can use the ",(0,i.jsx)(n.code,{children:"FORCE_INDEX"})," hint to manually force ",(0,i.jsx)(n.code,{children:"IndexScan"})," approach:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ FORCE_INDEX(t_col1_idx) */ id FROM t WHERE col1 = '1';\n"})}),"\n",(0,i.jsx)(n.p,{children:"Will show a different plan, like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n type: SORTED\r\n predicate: =(COL1, _UTF-8'1')\r\n searchBounds: [ExactBounds [bound=_UTF-8'1']]\r\n ieldNames: [ID]\r\n collation: []\r\n est: (rows=1)\n"})}),"\n",(0,i.jsx)(n.h2,{id:"suboptimal-indexes",children:"Suboptimal Indexes"}),"\n",(0,i.jsx)(n.p,{children:"Indexes with less prediction can be chosen, for example schema and query may look as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t (id INT PRIMARY KEY, col1 VARCHAR, col2 VARCHAR);\r\nCREATE INDEX t_col1_col2_idx ON T(col1, col2);\r\nCREATE INDEX t_col1_idx ON t(col1);\r\n\r\nSELECT id FROM t WHERE col1 = '1' AND col2 = '2';\n"})}),"\n",(0,i.jsx)(n.p,{children:"and a possible plan would be:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see that the execution uses the ",(0,i.jsx)(n.strong,{children:"T_COL1_IDX"})," index, through both predicates ",(0,i.jsx)(n.strong,{children:"COL1 = '1' AND COL2 = '2'"})," are involved and the ",(0,i.jsx)(n.strong,{children:"T_COL1_COL2_IDX"})," is preferable. In this case, the optimal plan would be:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_COL2_IDX\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You can also use the ",(0,i.jsx)(n.code,{children:"FORCE_INDEX"})," hint to achieve this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ FORCE_INDEX(t_col1_col2_idx) */ id FROM t WHERE col1 = '1' AND col2 = '2';\n"})}),"\n",(0,i.jsx)(n.h2,{id:"unexpected-sort-operation",children:"Unexpected Sort Operation"}),"\n",(0,i.jsx)(n.p,{children:"By default, sorted indexes store their entries in ascending order.\r\nYou can adjust the ordering of a sorted index by including the options ASC or DESC."}),"\n",(0,i.jsx)(n.p,{children:"Let's suppose the schema and related query look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t1 (id INT PRIMARY KEY, col1 VARCHAR);\r\nCREATE TABLE t2 (id INT PRIMARY KEY, col1 VARCHAR);\r\nCREATE INDEX t1_col1_desc_idx ON t1(col1 DESC);\r\nCREATE INDEX t2_col1_idx ON t2(col1);\r\n\r\nSELECT t1.id as t1id, t2.id as t2id FROM t1 JOIN t2 USING (col1);\n"})}),"\n",(0,i.jsx)(n.p,{children:"And the possible execution plan looks like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" MergeJoin\r\n ...\r\n Sort\r\n collation: [COL1 ASC]\r\n ...\r\n IndexScan\r\n index: T2_COL1_IDX\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["In the example above, the planner adds the ",(0,i.jsx)(n.strong,{children:"Sort"})," operation before performing the ",(0,i.jsx)(n.strong,{children:"IndexScan"}),",\r\nas the index used is sorted in descending order, while ascending order is required."]}),"\n",(0,i.jsxs)(n.p,{children:["Extra ",(0,i.jsx)(n.strong,{children:"Sort"})," operations adds performance costs, and we can avoid it by creating an index with the appropriate sort ordering:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE INDEX t1_col1_idx ON t1(col1);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And plan will no longer display the ",(0,i.jsx)(n.strong,{children:"Sort"})," operation, improving query execution speed:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" MergeJoin\r\n ...\r\n IndexScan\r\n index: T1_COL1_IDX\r\n ...\r\n IndexScan\r\n index: T2_COL1_IDX\r\n ...\n"})}),"\n",(0,i.jsx)(n.h2,{id:"performance-impact-of-correlated-subqueries",children:"Performance Impact of Correlated Subqueries"}),"\n",(0,i.jsx)(n.p,{children:"The SQL-99 standard allows for nested subqueries at nearly all places within a query, so Ignite 3 supports nested subqueries, both correlated and not.\r\nPerformance of certain complex correlated subqueries may be insufficient. Let's consider a correlated query:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE emp(dept_id INTEGER PRIMARY KEY, name VARCHAR, salary INTEGER);\r\nCREATE TABLE dept(id INTEGER PRIMARY KEY, name VARCHAR);\r\n\r\nSELECT emp.name, (SELECT dept.name FROM dept WHERE emp.dept_id=dept.id)\r\nFROM emp\r\nWHERE emp.salary > 1000;\n"})}),"\n",(0,i.jsx)(n.p,{children:"We can see nested correlated subquery here, lets check the plan:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" CorrelatedNestedLoopJoin\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n predicate: >(SALARY, 1000)\r\n ...\r\n ColocatedHashAggregate\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n predicate: =($cor1.DEPT_ID, ID)\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The example above shows the slow ",(0,i.jsx)(n.strong,{children:"CorrelatedNestedLoopJoin"})," operation. Queries with this operation may cause a number of issues:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Such subqueries may become bottlenecks."}),"\n",(0,i.jsx)(n.li,{children:"Queries can cause high CPU load."}),"\n",(0,i.jsx)(n.li,{children:"Certain queries may perform slower than expected."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If performance issues are found in similar queries, it would be more\r\nefficient to rewrite the query without nested subqueries, for example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT emp.name, dept.name\r\nFROM emp, dept\r\nWHERE emp.salary > 1000 AND emp.dept_id=dept.id;\n"})}),"\n",(0,i.jsx)(n.p,{children:"And new plan becomes:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" HashJoin\r\n predicate: =(DEPT_ID, ID)\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n predicate: >(SALARY, 1000)\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Without the ",(0,i.jsx)(n.strong,{children:"CorrelatedNestedLoopJoin"})," operation, the query should perform much better than the previous one."]}),"\n",(0,i.jsx)(n.h2,{id:"excessive-sorting",children:"Excessive Sorting"}),"\n",(0,i.jsx)(n.p,{children:"Lets explain we have an index involved two columns one of them is participate in predicate and other in ordering, or in sql terms:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE emp(dept_id INTEGER PRIMARY KEY, name VARCHAR, salary INTEGER);\r\nCREATE INDEX emp_salary_name_idx ON emp(salary, name);\r\n\r\nSELECT dept_id FROM emp WHERE salary = 1 ORDER BY name;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Expectations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Index need to be used here."}),"\n",(0,i.jsxs)(n.li,{children:["No additional sort is needed because index is ordered by ",(0,i.jsx)(n.strong,{children:"name"})," column is satisfies initial query ordering."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"But the real execution plan shows a different result:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" Sort\r\n collation: [NAME ASC]\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n predicate: =(SALARY, 1)\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see a redundant ",(0,i.jsx)(n.strong,{children:"Sort"})," operator. A bit query refactoring can help to avoid excessive sorting:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT dept_id FROM emp WHERE salary = 1 ORDER BY salary, name;\n"})}),"\n",(0,i.jsx)(n.p,{children:"And the plan becomes as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.EMP\r\n index: EMP_SALARY_NAME_IDX\r\n predicate: =(SALARY, 1)\r\n ...\n"})}),"\n",(0,i.jsx)(n.h2,{id:"select-count-optimization",children:"Select Count Optimization"}),"\n",(0,i.jsx)(n.p,{children:"Some queries can be optimized to use more optimal plans which brings performance speed up. For example, plan for:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT COUNT(*) FROM emp;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Can look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" SelectCount\r\n table: PUBLIC.EMP\r\n est: (rows=43)\r\n ...\n"})}),"\n",(0,i.jsx)(n.p,{children:"But there are numerous cases where such optimization is not applicable. In such a cases, a plan can be different and the execution may require more time."}),"\n",(0,i.jsx)(n.p,{children:"The same query as above, but with explicit transaction may produce a different plan, for example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" ReduceSortAggregate\r\n ...\r\n MapSortAggregate\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n est: (rows=43)\r\n ...\n"})}),"\n",(0,i.jsx)(n.h2,{id:"index-scan-without-exact-search-bounds",children:"Index Scan Without Exact Search Bounds"}),"\n",(0,i.jsx)(n.p,{children:"Table scans are available in two implementations: direct table scan and scan through index.\r\nIndex scans contain predicate and search bounds.\r\nPredicate provides final rows comparison. If search bounds are absentm the query degenerates into table scan through index scan (requiring an additional store look up), with further predicate comparison, that incurs additional performance overhead costs."}),"\n",(0,i.jsx)(n.p,{children:"Let's suppose we have schema and query like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t (id INTEGER PRIMARY KEY, col1 DECIMAL(5, 3));\r\nCREATE INDEX t_col1_idx ON t(col1);\r\n\r\nSELECT id FROM t WHERE col1 = 43;\n"})}),"\n",(0,i.jsx)(n.p,{children:"And possible plan would look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n predicate: =(CAST(COL1):DECIMAL(13, 3), 43.000)\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see here - only ",(0,i.jsx)(n.strong,{children:"predicate"})," (and no ",(0,i.jsx)(n.strong,{children:"searchBounds"}),") which means that ",(0,i.jsx)(n.strong,{children:"all"})," rows from index will go through predicate and bring additional performance penalty."]}),"\n",(0,i.jsx)(n.p,{children:"Two type of solutions are possible here:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"You can prohibit suboptimal index usage;"}),"\n",(0,i.jsx)(n.li,{children:"You can explicitly help the planner with type derivation."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"prohibit-index-usage",children:"Prohibit Index Usage"}),"\n",(0,i.jsxs)(n.p,{children:["For the first approach, use the ",(0,i.jsx)(n.strong,{children:"NO_INDEX"})," hint to prohibit index usage:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ NO_INDEX */ id FROM t WHERE col1 = 43;\r\n\r\n-- or with direct index mention:\r\n\r\nSELECT /*+ NO_INDEX(t_col1_idx) */ id FROM t WHERE col1 = 43;\n"})}),"\n",(0,i.jsx)(n.p,{children:"As a result, you will have a plan similar to this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" TableScan\r\n table: PUBLIC.T\r\n predicate: =(CAST(COL1):DECIMAL(13, 3), 43.000)\r\n ...\n"})}),"\n",(0,i.jsx)(n.h3,{id:"manual-type-casting",children:"Manual Type Casting"}),"\n",(0,i.jsx)(n.p,{children:"You can append additional cast to the same query to explicitly cast data as a specific type:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT id FROM t WHERE col1 = 43::DECIMAL(5, 3);\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n predicate: =(COL1, 43.000)\r\n searchBounds: [ExactBounds [bound=43.000:DECIMAL(5, 3)]]\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see here both ",(0,i.jsx)(n.strong,{children:"searchBounds"})," and ",(0,i.jsx)(n.strong,{children:"predicate"})," which means that only exact lookup through index will be involved."]}),"\n",(0,i.jsx)(n.p,{children:"The same case as above but for a bit complicated query:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE t (id INT PRIMARY KEY, col1 INT);\r\nCREATE INDEX t_col1_asc_idx ON t (col1);\r\n\r\nSELECT * FROM t WHERE col1::varchar = SUBSTR(CURRENT_DATE::varchar, 4);\n"})}),"\n",(0,i.jsx)(n.p,{children:"Possible plan:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:' IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_IDX\r\n predicate: =(CAST(COL1):VARCHAR CHARACTER SET "UTF-8", SUBSTR(CAST(CURRENT_DATE):VARCHAR CHARACTER SET "UTF-8" NOT NULL, 4))\r\n ...\n'})}),"\n",(0,i.jsxs)(n.p,{children:["And we also can see that no ",(0,i.jsx)(n.strong,{children:"search bounds"})," are involved here."]}),"\n",(0,i.jsx)(n.p,{children:"Try to change it like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT * FROM t WHERE col1 = SUBSTR(CURRENT_DATE::varchar, 4)::int;\n"})}),"\n",(0,i.jsx)(n.p,{children:"And the possible plan will become:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:' IndexScan\r\n table: PUBLIC.T\r\n index: T_COL1_ASC_IDX\r\n predicate: =(COL1, CAST(SUBSTR(CAST(CURRENT_DATE):VARCHAR CHARACTER SET "UTF-8" NOT NULL, 4)):INTEGER NOT NULL)\r\n searchBounds: [ExactBounds [bound=CAST(SUBSTR(CAST(CURRENT_DATE):VARCHAR CHARACTER SET "UTF-8" NOT NULL, 4)):INTEGER]]\r\n ...\n'})}),"\n",(0,i.jsxs)(n.p,{children:["We can see that ",(0,i.jsx)(n.strong,{children:"searchBounds"})," are present, thus more productive execution flow is expected here."]}),"\n",(0,i.jsx)(n.h2,{id:"colocation-usage",children:"Colocation Usage"}),"\n",(0,i.jsx)(n.p,{children:"As mentioned above, right colocated columns choice plays a significant role in query execution performance.\r\nFor example, if initially tables are created without any thoughts about further usage columns colocation you can have the following scenario:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- by default, the table is implicitly colocated by PRIMARY KEY\r\nCREATE TABLE emp(dept_id INTEGER, name VARCHAR, salary INTEGER, PRIMARY KEY(dept_id, name));\r\n\r\n-- implicitly colocated by PRIMARY KEY\r\nCREATE TABLE dept(id INTEGER, name VARCHAR, PRIMARY KEY(name, id));\n"})}),"\n",(0,i.jsx)(n.p,{children:"And query as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"SELECT emp.name, dept.name FROM emp JOIN dept ON emp.dept_id = dept.id AND emp.salary > 1000;\n"})}),"\n",(0,i.jsx)(n.p,{children:"Bring plan like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" HashJoin\r\n predicate: =(DEPT_ID, ID)\r\n ...\r\n Exchange\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n ...\r\n Exchange\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We can see two ",(0,i.jsx)(n.strong,{children:"Exchange"})," operators, which means that all rows are transferred into a single node and then are joined.\r\nThis execution flow brings a performance cost and slows down query execution."]}),"\n",(0,i.jsxs)(n.p,{children:["Let's try to improve it by adding explicit colocation for the ",(0,i.jsx)(n.strong,{children:"dept"})," table by the ",(0,i.jsx)(n.strong,{children:"ID"})," column:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- implicitly colocated by PRIMARY KEY\r\nCREATE TABLE emp(dept_id INTEGER, name VARCHAR, salary INTEGER, PRIMARY KEY(dept_id, name));\r\n-- explicitly colocated by ID\r\nCREATE TABLE dept(id INTEGER, name VARCHAR, PRIMARY KEY(name, id)) COLOCATE BY (id);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now the dependent rows from ",(0,i.jsx)(n.strong,{children:"emp"})," table are transferred into the appropriate\r\nnode where ",(0,i.jsx)(n.strong,{children:"dept"})," holds the rows according to ",(0,i.jsx)(n.strong,{children:"DEPT.ID"})," distribution:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:' HashJoin\r\n predicate: =(DEPT_ID, ID)\r\n ...\r\n Exchange\r\n distribution: table PUBLIC.DEPT in zone "Default" by [DEPT_ID]\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n ...\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Only one ",(0,i.jsx)(n.strong,{children:"Exchange"})," operator for now, which, once again, mean only rows transferring\r\nfrom ",(0,i.jsx)(n.strong,{children:"emp"})," table to appropriate ",(0,i.jsx)(n.strong,{children:"dept"})," one."]}),"\n",(0,i.jsx)(n.p,{children:"And finally, both join predicate related columns are colocated:"}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["The following colocation example will only work if the ",(0,i.jsx)(n.strong,{children:"emp"})," and ",(0,i.jsx)(n.strong,{children:"dept"})," tables belong to the same distribution zone."]})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"-- explicitly colocated by DEPT_ID\r\nCREATE TABLE emp(dept_id INTEGER, name VARCHAR, salary INTEGER, PRIMARY KEY(dept_id, name)) COLOCATE BY(dept_id);\r\n-- explicitly colocated by ID\r\nCREATE TABLE dept(id INTEGER, name VARCHAR, PRIMARY KEY(id, name)) COLOCATE BY(id);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now, the ",(0,i.jsx)(n.strong,{children:"emp"})," and ",(0,i.jsx)(n.strong,{children:"dept"})," tables are both colocated."]}),"\n",(0,i.jsx)(n.p,{children:"And the final plan will look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:" HashJoin\r\n predicate: =(DEPT_ID, ID)\r\n ...\r\n TableScan\r\n table: PUBLIC.EMP\r\n ...\r\n TableScan\r\n table: PUBLIC.DEPT\r\n ...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["No ",(0,i.jsx)(n.strong,{children:"Exchange"})," operators are involved in the explanation, which means that no excessive rows transfer has occurred."]}),"\n",(0,i.jsx)(n.h2,{id:"comprehensive-explain-examples",children:"Comprehensive EXPLAIN Examples"}),"\n",(0,i.jsx)(n.h3,{id:"example-complex-join-query",children:"Example: Complex Join Query"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN PLAN FOR\r\n SELECT\r\n U.UserName, P.ProductName, R.ReviewText, R.Rating\r\n FROM Users U, Reviews R, Products P\r\n WHERE U.UserID = R.UserID\r\n AND R.ProductID = P.ProductID\r\n AND P.ProductName = 'Product_' || ?::varchar\n"})}),"\n",(0,i.jsx)(n.p,{children:"The resulting output is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"Project\r\n fieldNames: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n projection: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n est: (rows=16650)\r\n HashJoin\r\n predicate: =(USERID$0, USERID)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME, USERID$0, USERNAME]\r\n type: inner\r\n est: (rows=16650)\r\n HashJoin\r\n predicate: =(PRODUCTID, PRODUCTID$0)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME]\r\n type: inner\r\n est: (rows=16650)\r\n Exchange\r\n distribution: single\r\n est: (rows=50000)\r\n TableScan\r\n table: PUBLIC.REVIEWS\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n est: (rows=50000)\r\n Exchange\r\n distribution: single\r\n est: (rows=1665)\r\n TableScan\r\n table: PUBLIC.PRODUCTS\r\n predicate: =(PRODUCTNAME, ||(_UTF-8'Product_', CAST(?0):VARCHAR CHARACTER SET \"UTF-8\"))\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n est: (rows=1665)\r\n Exchange\r\n distribution: single\r\n est: (rows=10000)\r\n TableScan\r\n table: PUBLIC.USERS\r\n fieldNames: [USERID, USERNAME]\r\n est: (rows=10000)\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This execution plan represents a query that joins three tables: ",(0,i.jsx)(n.code,{children:"USERS"}),", ",(0,i.jsx)(n.code,{children:"REVIEWS"}),", and ",(0,i.jsx)(n.code,{children:"PRODUCTS"}),", and selects four fields after filtering by product name."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Project"})," (root node): Outputs the final selected fields \u2014 ",(0,i.jsx)(n.code,{children:"USERNAME"}),", ",(0,i.jsx)(n.code,{children:"PRODUCTNAME"}),", ",(0,i.jsx)(n.code,{children:"REVIEWTEXT"}),", and ",(0,i.jsx)(n.code,{children:"RATING"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"HashJoins"})," (two levels): Perform the inner joins.\r\n** The first (bottom-most) joins ",(0,i.jsx)(n.code,{children:"REVIEWS"})," with ",(0,i.jsx)(n.code,{children:"PRODUCTS"})," on ",(0,i.jsx)(n.code,{children:"PRODUCTID"}),".\r\n** The second joins the result with ",(0,i.jsx)(n.code,{children:"USERS"})," on ",(0,i.jsx)(n.code,{children:"USERID"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"TableScans"}),": Each table is scanned:\r\n** ",(0,i.jsx)(n.code,{children:"REVIEWS"})," is fully scanned.\r\n** ",(0,i.jsx)(n.code,{children:"PRODUCTS"})," is scanned with a filter on ",(0,i.jsx)(n.code,{children:"PRODUCTNAME"}),".\r\n** ",(0,i.jsx)(n.code,{children:"USERS"})," is fully scanned."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Exchange"})," nodes: Indicate data redistribution between operators."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Each node includes:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"fieldNames"}),": Output columns at that stage."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"predicate"}),": Join or filter condition."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"est"}),": Estimated number of rows at that point in the plan."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"example-query-mapping",children:"Example: Query Mapping"}),"\n",(0,i.jsx)(n.p,{children:"A result of EXPLAIN MAPPING command includes additional metadata providing insight at how the query is mapped on cluster topology. So, for the command like below:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN MAPPING FOR\r\n SELECT\r\n U.UserName, P.ProductName, R.ReviewText, R.Rating\r\n FROM Users U, Reviews R, Products P\r\n WHERE U.UserID = R.UserID\r\n AND R.ProductID = P.ProductID\r\n AND P.ProductName = 'Product_' || ?::varchar\n"})}),"\n",(0,i.jsx)(n.p,{children:"The resulting output is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:'Fragment#0 root\r\n distribution: single\r\n executionNodes: [node_1]\r\n tree:\r\n Project\r\n fieldNames: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n projection: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n est: (rows=1)\r\n HashJoin\r\n predicate: =(USERID$0, USERID)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME, USERID$0, USERNAME]\r\n type: inner\r\n est: (rows=1)\r\n HashJoin\r\n predicate: =(PRODUCTID, PRODUCTID$0)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME]\r\n type: inner\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n sourceFragmentId: 1\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n sourceFragmentId: 2\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [USERID, USERNAME]\r\n sourceFragmentId: 3\r\n est: (rows=1)\r\n\r\nFragment#1\r\n distribution: random\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [REVIEWS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=50000)\r\n TableScan\r\n table: PUBLIC.REVIEWS\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n est: (rows=50000)\r\n\r\nFragment#2\r\n distribution: table PUBLIC.PRODUCTS in zone "Default"\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [PRODUCTS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=1665)\r\n TableScan\r\n table: PUBLIC.PRODUCTS\r\n predicate: =(PRODUCTNAME, ||(_UTF-8\'Product_\', CAST(?0):VARCHAR CHARACTER SET "UTF-8"))\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n est: (rows=1665)\r\n\r\nFragment#3\r\n distribution: table PUBLIC.USERS in zone "Default"\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [USERS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=10000)\r\n TableScan\r\n table: PUBLIC.USERS\r\n fieldNames: [USERID, USERNAME]\r\n est: (rows=10000)\n'})}),"\n",(0,i.jsx)(n.p,{children:"Where:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Fragment#0"})," means fragment with id=0"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"root"})," marks a fragment which is considered as root fragment, i.e. a fragment which represents user's cursor"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"distribution"})," attribute provides an insight into which mapping strategy was applied to this particular fragment"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"executionNodes"})," attribute provides a list of nodes this fragment will be executed on"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"partitions"})," attribute provides an insight into which partitions of which tables will be read from which nodes"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"tree"})," attribute specifies which part of the relational tree corresponds to this fragment"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The output above shows how the query is broken into multiple execution fragments and distributed across the cluster. It gives insight into both the logical execution plan and how it maps to the physical topology."}),"\n",(0,i.jsxs)(n.p,{children:["The query starts execution in ",(0,i.jsx)(n.em,{children:"Fragment#0"}),", which serves as the root of the plan \u2014 this is where the final result is produced. It runs on a single node (",(0,i.jsx)(n.code,{children:"node_1"}),") and contains the main logic of the query, including the projection and two nested hash joins. Instead of scanning tables directly, it receives data from other fragments through ",(0,i.jsx)(n.code,{children:"Receiver"})," operators. These incoming streams correspond to the ",(0,i.jsx)(n.code,{children:"REVIEWS"}),", ",(0,i.jsx)(n.code,{children:"PRODUCTS"}),", and ",(0,i.jsx)(n.code,{children:"USERS"})," tables."]}),"\n",(0,i.jsxs)(n.p,{children:["The actual table scans happen in ",(0,i.jsx)(n.em,{children:"Fragments 1 through 3"}),", each responsible for one of the involved tables. These fragments operate in parallel across the cluster. Each performs a scan on its respective table and then sends the results back to Fragment#0."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"Fragment#1"})," handles the ",(0,i.jsx)(n.code,{children:"REVIEWS"})," table. It runs on all nodes and uses a random distribution strategy. Data is partitioned across nodes, and after scanning the table, results are sent upstream."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"Fragment#2"})," is in charge of the ",(0,i.jsx)(n.code,{children:"PRODUCTS"})," table. It also spans all nodes but follows a zone-based distribution linked to the table's partitioning. There's a filter applied to ",(0,i.jsx)(n.code,{children:"PRODUCTNAME"}),", which limits the amount of data sent to the root."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"Fragment#3"})," covers the ",(0,i.jsx)(n.code,{children:"USERS"})," table. Like the others, it's distributed and reads from table partitions spread across the cluster."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Each fragment includes metadata such as the nodes it's executed on, how data is partitioned, and how results are sent between fragments. This layout provides a clear view of not only how the query is logically processed, but also how the workload is split and coordinated in a distributed environment."})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>l});var s=r(96540);const i={},a=s.createContext(i);function t(e){const n=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/840d3d48.96cff181.js b/docs/ignite3/assets/js/840d3d48.96cff181.js deleted file mode 100644 index 65728f0cee..0000000000 --- a/docs/ignite3/assets/js/840d3d48.96cff181.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8178],{28453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>s});var r=i(96540);const t={},a=r.createContext(t);function l(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),r.createElement(a.Provider,{value:n},e.children)}},63264:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"getting-started/key-value-api","title":"Using Java API","description":"This guide walks you through creating a Java application that connects to an Ignite 3 cluster, demonstrating key patterns for working with data using Ignite Java API.","source":"@site/docs/getting-started/key-value-api.md","sourceDirName":"getting-started","slug":"/getting-started/key-value-api","permalink":"/docs/ignite3/3.1.0/getting-started/key-value-api","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Using Java API"},"sidebar":"tutorialSidebar","previous":{"title":"Working with SQL","permalink":"/docs/ignite3/3.1.0/getting-started/work-with-sql"},"next":{"title":"Embedded Mode","permalink":"/docs/ignite3/3.1.0/getting-started/embedded-mode"}}');var t=i(74848),a=i(28453);const l={title:"Using Java API"},s=void 0,o={},c=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Setting Up Ignite 3 Cluster",id:"setting-up-ignite-3-cluster",level:2},{value:"Starting and Initializing the Cluster",id:"starting-and-initializing-the-cluster",level:3},{value:"Setting Up Your Java Project",id:"setting-up-your-java-project",level:2},{value:"Create a Maven Project",id:"create-a-maven-project",level:3},{value:"Configure Maven Dependencies",id:"configure-maven-dependencies",level:3},{value:"Building Your Java Application",id:"building-your-java-application",level:2},{value:"Main Application Class",id:"main-application-class",level:3},{value:"Running the Application",id:"running-the-application",level:2},{value:"Expected Output",id:"expected-output",level:2},{value:"Understanding Table Views in Ignite 3",id:"understanding-table-views-in-ignite-3",level:2},{value:"RecordView Pattern",id:"recordview-pattern",level:3},{value:"KeyValueView Pattern",id:"keyvalueview-pattern",level:3},{value:"Cleaning Up",id:"cleaning-up",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"This guide walks you through creating a Java application that connects to an Ignite 3 cluster, demonstrating key patterns for working with data using Ignite Java API."}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"JDK 17 or later"}),"\n",(0,t.jsx)(n.li,{children:"Maven"}),"\n",(0,t.jsx)(n.li,{children:"Up-to-date versions of Docker and Docker Compose"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"setting-up-ignite-3-cluster",children:"Setting Up Ignite 3 Cluster"}),"\n",(0,t.jsx)(n.p,{children:"Create a Docker Compose file to run a three-node Ignite cluster:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'# docker-compose.yml\r\nname: ignite3\r\n\r\nx-ignite-def: &ignite-def\r\n image: apacheignite/ignite:3.0.0\r\n environment:\r\n JVM_MAX_MEM: "4g"\r\n JVM_MIN_MEM: "4g"\r\n configs:\r\n - source: node_config\r\n target: /opt/ignite/etc/ignite-config.conf\r\n\r\nservices:\r\n node1:\r\n <<: *ignite-def\r\n command: --node-name node1\r\n ports:\r\n - "10300:10300" # REST API port\r\n - "10800:10800" # Client port\r\n node2:\r\n <<: *ignite-def\r\n command: --node-name node2\r\n ports:\r\n - "10301:10300"\r\n - "10801:10800"\r\n node3:\r\n <<: *ignite-def\r\n command: --node-name node3\r\n ports:\r\n - "10302:10300"\r\n - "10802:10800"\r\n\r\nconfigs:\r\n node_config:\r\n content: |\r\n ignite {\r\n network {\r\n port: 3344\r\n nodeFinder.netClusterNodes = ["node1:3344", "node2:3344", "node3:3344"]\r\n }\r\n }\n'})}),"\n",(0,t.jsx)(n.h3,{id:"starting-and-initializing-the-cluster",children:"Starting and Initializing the Cluster"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Start the cluster:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"Run the Ignite CLI and initialize the cluster:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run --rm -it --network=host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 apacheignite/ignite:3.0.0 cli\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsx)(n.li,{children:"Inside the CLI, confirm the connection to the default node."}),"\n",(0,t.jsx)(n.li,{children:"Initialize the cluster:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cluster init --name=ignite3 --metastorage-group=node1,node2,node3\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"5",children:["\n",(0,t.jsx)(n.li,{children:"Enter the SQL mode:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sql\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"6",children:["\n",(0,t.jsx)(n.li,{children:"Create a sample table and insert data:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"CREATE TABLE Person (id INT PRIMARY KEY, name VARCHAR);\r\nINSERT INTO Person (id, name) VALUES (1, 'John');\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"7",children:["\n",(0,t.jsx)(n.li,{children:"Exit the SQL mode and CLI tool:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"exit;\r\nexit\n"})}),"\n",(0,t.jsx)(n.h2,{id:"setting-up-your-java-project",children:"Setting Up Your Java Project"}),"\n",(0,t.jsx)(n.h3,{id:"create-a-maven-project",children:"Create a Maven Project"}),"\n",(0,t.jsx)(n.p,{children:"First, create a simple Maven project. Below is the example of the project we will be using:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"ignite3-java-demo/\r\n\u251c\u2500\u2500 pom.xml\r\n\u2514\u2500\u2500 src/\r\n \u2514\u2500\u2500 main/\r\n \u2514\u2500\u2500 java/\r\n \u2514\u2500\u2500 com/\r\n \u2514\u2500\u2500 example/\r\n \u2514\u2500\u2500 Main.java\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configure-maven-dependencies",children:"Configure Maven Dependencies"}),"\n",(0,t.jsxs)(n.p,{children:["Include the Ignite client dependency in your ",(0,t.jsx)(n.code,{children:"pom.xml"})," file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-xml",children:"\r\n \x3c!-- Ignite 3 Client --\x3e\r\n \r\n org.apache.ignite\r\n ignite-client\r\n 3.0.0\r\n \r\n\n"})}),"\n",(0,t.jsx)(n.h2,{id:"building-your-java-application",children:"Building Your Java Application"}),"\n",(0,t.jsx)(n.p,{children:"Now, let's create a Java application that connects to our Ignite cluster and performs various data operations."}),"\n",(0,t.jsx)(n.h3,{id:"main-application-class",children:"Main Application Class"}),"\n",(0,t.jsxs)(n.p,{children:["Create a ",(0,t.jsx)(n.code,{children:"Main.java"})," file with the following code:"]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsx)(n.p,{children:"See the structure example above for the expected file location. This example contains the full class file."})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'package com.example;\r\n\r\nimport org.apache.ignite.catalog.ColumnType;\r\nimport org.apache.ignite.catalog.definitions.ColumnDefinition;\r\nimport org.apache.ignite.catalog.definitions.TableDefinition;\r\nimport org.apache.ignite.client.IgniteClient;\r\nimport org.apache.ignite.table.KeyValueView;\r\nimport org.apache.ignite.table.RecordView;\r\nimport org.apache.ignite.table.Table;\r\nimport org.apache.ignite.table.Tuple;\r\n\r\n/**\r\n * This example demonstrates connecting to an Ignite 3 cluster\r\n * and working with data using different table view patterns.\r\n */\r\npublic class Main {\r\n public static void main(String[] args) {\r\n // Create an array of connection addresses for fault tolerance\r\n String[] addresses = {\r\n "localhost:10800",\r\n "localhost:10801",\r\n "localhost:10802"\r\n };\r\n\r\n // Connect to the Ignite cluster using the client builder pattern\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses(addresses)\r\n .build()) {\r\n\r\n System.out.println("Connected to the cluster: " + client.connections());\r\n\r\n // Demonstrate querying existing data using SQL API\r\n queryExistingTable(client);\r\n\r\n // Create a new table using Java API\r\n Table table = createTable(client);\r\n\r\n // Demonstrate different ways to interact with tables\r\n populateTableWithDifferentViews(table);\r\n\r\n // Query the new table using SQL API\r\n queryNewTable(client);\r\n }\r\n }\r\n\r\n /**\r\n * Queries the pre-created Person table using SQL\r\n */\r\n private static void queryExistingTable(IgniteClient client) {\r\n System.out.println("\\n--- Querying Person table ---");\r\n client.sql().execute(null, "SELECT * FROM Person")\r\n .forEachRemaining(row -> System.out.println("Person: " + row.stringValue("name")));\r\n }\r\n\r\n /**\r\n * Creates a new table using the Java API\r\n */\r\n private static Table createTable(IgniteClient client) {\r\n System.out.println("\\n--- Creating Person2 table ---");\r\n return client.catalog().createTable(\r\n TableDefinition.builder("Person2")\r\n .ifNotExists()\r\n .columns(\r\n ColumnDefinition.column("ID", ColumnType.INT32),\r\n ColumnDefinition.column("NAME", ColumnType.VARCHAR))\r\n .primaryKey("ID")\r\n .build());\r\n }\r\n\r\n /**\r\n * Demonstrates different ways to interact with tables\r\n */\r\n private static void populateTableWithDifferentViews(Table table) {\r\n System.out.println("\\n--- Populating Person2 table using different views ---");\r\n\r\n // 1. Using RecordView with Tuples\r\n RecordView recordView = table.recordView();\r\n recordView.upsert(null, Tuple.create().set("id", 2).set("name", "Jane"));\r\n System.out.println("Added record using RecordView with Tuple");\r\n\r\n // 2. Using RecordView with POJOs\r\n RecordView pojoView = table.recordView(Person.class);\r\n pojoView.upsert(null, new Person(3, "Jack"));\r\n System.out.println("Added record using RecordView with POJO");\r\n\r\n // 3. Using KeyValueView with Tuples\r\n KeyValueView keyValueView = table.keyValueView();\r\n keyValueView.put(null, Tuple.create().set("id", 4), Tuple.create().set("name", "Jill"));\r\n System.out.println("Added record using KeyValueView with Tuples");\r\n\r\n // 4. Using KeyValueView with Native Types\r\n KeyValueView keyValuePojoView = table.keyValueView(Integer.class, String.class);\r\n keyValuePojoView.put(null, 5, "Joe");\r\n System.out.println("Added record using KeyValueView with Native Types");\r\n }\r\n\r\n /**\r\n * Queries the newly created Person2 table using SQL\r\n */\r\n private static void queryNewTable(IgniteClient client) {\r\n System.out.println("\\n--- Querying Person2 table ---");\r\n client.sql().execute(null, "SELECT * FROM Person2")\r\n .forEachRemaining(row -> System.out.println("Person2: " + row.stringValue("name")));\r\n }\r\n\r\n /**\r\n * POJO class representing a Person\r\n */\r\n public static class Person {\r\n // Default constructor required for serialization\r\n public Person() { }\r\n\r\n public Person(Integer id, String name) {\r\n this.id = id;\r\n this.name = name;\r\n }\r\n\r\n Integer id;\r\n String name;\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"running-the-application",children:"Running the Application"}),"\n",(0,t.jsx)(n.p,{children:"To run your application:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Make sure your Ignite cluster is up and running"}),"\n",(0,t.jsx)(n.li,{children:"Compile and run your Java application:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'mvn compile exec:java -Dexec.mainClass="com.example.Main"\n'})}),"\n",(0,t.jsx)(n.h2,{id:"expected-output",children:"Expected Output"}),"\n",(0,t.jsx)(n.p,{children:"You should see output similar to this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"Connected to the cluster: Connections{active=1, total=1}\r\n\r\n--- Querying Person table ---\r\nPerson: John\r\n\r\n--- Creating Person2 table ---\r\n\r\n--- Populating Person2 table using different views ---\r\nAdded record using RecordView with Tuple\r\nAdded record using RecordView with POJO\r\nAdded record using KeyValueView with Tuples\r\nAdded record using KeyValueView with Native Types\r\n\r\n--- Querying Person2 table ---\r\nPerson2: Jane\r\nPerson2: Jack\r\nPerson2: Jill\r\nPerson2: Joe\n"})}),"\n",(0,t.jsx)(n.h2,{id:"understanding-table-views-in-ignite-3",children:"Understanding Table Views in Ignite 3"}),"\n",(0,t.jsxs)(n.p,{children:["Ignite 3 provides multiple view patterns for interacting with tables on top of providing a robust SQL API. Examples below showcase how you can work with Ignite tables from your project without SQL. For examples of working with SQL, see the ",(0,t.jsx)(n.a,{href:"/3.1.0/getting-started/work-with-sql",children:"Getting Started with SQL"})," tutorial."]}),"\n",(0,t.jsx)(n.h3,{id:"recordview-pattern",children:"RecordView Pattern"}),"\n",(0,t.jsx)(n.p,{children:"RecordView treats tables as a collection of records, perfect for operations that work with entire rows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'// Get RecordView for Tuple objects (schema-less)\r\nRecordView recordView = table.recordView();\r\nrecordView.upsert(null, Tuple.create().set("id", 2).set("name", "Jane"));\r\n\r\n// Get RecordView for mapped POJO objects (type-safe)\r\nRecordView pojoView = table.recordView(Person.class);\r\npojoView.upsert(null, new Person(3, "Jack"));\n'})}),"\n",(0,t.jsx)(n.h3,{id:"keyvalueview-pattern",children:"KeyValueView Pattern"}),"\n",(0,t.jsx)(n.p,{children:"KeyValueView treats tables as a key-value store, ideal for simple lookups:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'// Get KeyValueView for Tuple objects\r\nKeyValueView keyValueView = table.keyValueView();\r\nkeyValueView.put(null, Tuple.create().set("id", 4), Tuple.create().set("name", "Jill"));\r\n\r\n// Get KeyValueView for native Java types\r\nKeyValueView keyValuePojoView = table.keyValueView(Integer.class, String.class);\r\nkeyValuePojoView.put(null, 5, "Joe");\n'})}),"\n",(0,t.jsx)(n.h2,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,t.jsx)(n.p,{children:"To stop your cluster when you are done:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose down\n"})}),"\n",(0,t.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsx)(n.p,{children:"If you encounter connection issues:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Verify your Docker containers are running with ",(0,t.jsx)(n.code,{children:"docker compose ps"})," command"]}),"\n",(0,t.jsx)(n.li,{children:"Check if the exposed ports match those in your client configuration"}),"\n",(0,t.jsxs)(n.li,{children:["Ensure that the ",(0,t.jsx)(n.code,{children:"localhost"})," interface can access the Docker container network"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,t.jsx)(n.p,{children:"Now that you've explored the basics of connecting to Ignite and interacting with data:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Try implementing transactions"}),"\n",(0,t.jsx)(n.li,{children:"Experiment with more complex schemas and data types"}),"\n",(0,t.jsx)(n.li,{children:"Explore data partitioning strategies"}),"\n",(0,t.jsx)(n.li,{children:"Investigate distributed computing capabilities"}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/8452ee8f.ead1f14d.js b/docs/ignite3/assets/js/8452ee8f.ead1f14d.js deleted file mode 100644 index 524a26b496..0000000000 --- a/docs/ignite3/assets/js/8452ee8f.ead1f14d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8494],{28453:(e,a,i)=>{i.d(a,{R:()=>c,x:()=>d});var r=i(96540);const s={},n=r.createContext(s);function c(e){const a=r.useContext(n);return r.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function d(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),r.createElement(n.Provider,{value:a},e.children)}},59602:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"api-reference/native-clients/java/java-index","title":"Java API","description":"The primary API for Apache Ignite 3 with complete feature support across all platform capabilities.","source":"@site/docs/api-reference/native-clients/java/index.mdx","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Java API","id":"java-index","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Native Client APIs","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/"},"next":{"title":"Client API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api"}}');var s=i(74848),n=i(28453);const c={title:"Java API",id:"java-index",sidebar_position:1},d="Java API",t={},l=[{value:"Overview",id:"overview",level:2},{value:"API Categories",id:"api-categories",level:2},{value:"Reference",id:"reference",level:2},{value:"Next Steps",id:"next-steps",level:2}];function o(e){const a={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components},{IIcon:i}=a;return i||function(e,a){throw new Error("Expected "+(a?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"java-api",children:"Java API"})}),"\n",(0,s.jsx)(a.p,{children:"The primary API for Apache Ignite 3 with complete feature support across all platform capabilities."}),"\n",(0,s.jsx)(a.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(a.p,{children:"The Java API provides two deployment modes. The thin client connects to remote clusters without joining topology. The embedded node participates in cluster operations and storage."}),"\n",(0,s.jsx)(a.p,{children:"Both modes share common APIs for tables, SQL, transactions, compute, streaming, and catalog management. The embedded mode adds cluster initialization APIs and direct access to internal cluster components."}),"\n",(0,s.jsx)(a.h2,{id:"api-categories",children:"API Categories"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:connection",height:"24"})," Client API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Thin client connection configuration, connection pooling, and cluster discovery."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/client-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:server",height:"24"})," Server API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Embedded node initialization, lifecycle management, and local cluster participation."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/server-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:table",height:"24"})," Tables API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Record and key-value operations with typed and binary views for table data access."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/tables-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:upload-network-outline",height:"24"})," Data Streamer API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"High-throughput bulk loading with reactive streams and backpressure handling."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/data-streamer-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:console-line",height:"24"})," SQL API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Query execution with prepared statements, parameter binding, and result processing."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/sql-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:shield-check-outline",height:"24"})," Transactions API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"ACID transaction management with explicit control and closure-based patterns."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/transactions-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:server-network",height:"24"})," Compute API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Distributed job execution with colocated processing and broadcast operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/compute-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:file-tree-outline",height:"24"})," Catalog API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Schema management with annotations and fluent builders for table creation."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/catalog-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:filter-outline",height:"24"})," Criteria API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Type-safe predicate construction for table queries with compile-time validation."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/criteria-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"carbon:network-3",height:"24"})," Network API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Cluster topology discovery and node information for distributed coordination."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/network-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:security",height:"24"})," Security API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Authentication configuration and credential management for secure cluster access."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./java/security-api",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(a.h2,{id:"reference",children:"Reference"}),"\n",(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsx)(a.li,{children:(0,s.jsx)(a.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/javadoc/",children:"Java API Documentation"})}),"\n"]}),"\n",(0,s.jsx)(a.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsxs)(a.li,{children:[(0,s.jsx)(a.a,{href:"../../getting-started",children:"Getting Started"})," - Quick start tutorials"]}),"\n",(0,s.jsxs)(a.li,{children:[(0,s.jsx)(a.a,{href:"../../develop",children:"Develop and Build"})," - Application development guides"]}),"\n"]})]})}function h(e={}){const{wrapper:a}={...(0,n.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/86aa3622.8db1d0fc.js b/docs/ignite3/assets/js/86aa3622.8db1d0fc.js deleted file mode 100644 index 11e9ffc39b..0000000000 --- a/docs/ignite3/assets/js/86aa3622.8db1d0fc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8392],{28453:(e,i,n)=>{n.d(i,{R:()=>d,x:()=>l});var t=n(96540);const r={},s=t.createContext(r);function d(e){const i=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),t.createElement(s.Provider,{value:i},e.children)}},40104:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>d,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"administrators-guide/config/cluster-config","title":"Cluster Configuration Parameters","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/config/cluster-config.md","sourceDirName":"administrators-guide/config","slug":"/administrators-guide/config/cluster-config","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Cluster Configuration Parameters","sidebar_label":"Cluster Configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Node Configuration","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/node-config"},"next":{"title":"CLI Configuration","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/cli-config"}}');var r=n(74848),s=n(28453);const d={title:"Cluster Configuration Parameters",sidebar_label:"Cluster Configuration"},l="Cluster Configuration Parameters",c={},a=[{value:"Checking Cluster Configuration",id:"checking-cluster-configuration",level:2},{value:"Changing Cluster Configuration",id:"changing-cluster-configuration",level:2},{value:"Update via REPL",id:"update-via-repl",level:3},{value:"Update via Non-Interactive Mode",id:"update-via-non-interactive-mode",level:3},{value:"Exporting Cluster Configuration",id:"exporting-cluster-configuration",level:2},{value:"Configuration Parameters",id:"configuration-parameters",level:2},{value:"Event Log Configuration",id:"event-log-configuration",level:3},{value:"Garbage Collection Configuration",id:"garbage-collection-configuration",level:3},{value:"System Configuration",id:"system-configuration",level:3},{value:"Metrics Configuration",id:"metrics-configuration",level:3},{value:"Replication Configuration",id:"replication-configuration",level:3},{value:"Schema Sync Configuration",id:"schema-sync-configuration",level:3},{value:"Security Configuration",id:"security-configuration",level:3},{value:"SQL Configuration",id:"sql-configuration",level:3},{value:"Transactions Configuration",id:"transactions-configuration",level:3},{value:"System Configuration",id:"system-configuration-1",level:2}];function o(e){const i={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"cluster-configuration-parameters",children:"Cluster Configuration Parameters"})}),"\n",(0,r.jsx)(i.p,{children:"Ignite 3 cluster configuration is shared across the whole cluster. Regardless of which node you apply the configuration on, it will be propagated to all nodes in the cluster."}),"\n",(0,r.jsxs)(i.p,{children:['In Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,r.jsx)(i.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node."]}),"\n",(0,r.jsx)(i.h2,{id:"checking-cluster-configuration",children:"Checking Cluster Configuration"}),"\n",(0,r.jsx)(i.p,{children:"To get cluster configuration, use the CLI tool."}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Start the CLI tool and connect to any node in the cluster."}),"\n",(0,r.jsxs)(i.li,{children:["Run the ",(0,r.jsx)(i.code,{children:"cluster config show"})," command."]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"The CLI tool will print the full cluster configuration. If you only need a part of the configuration, you can narrow down the search by providing the properties you need as the command argument, for example:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-shell",children:"cluster config show ignite.transaction\n"})}),"\n",(0,r.jsx)(i.h2,{id:"changing-cluster-configuration",children:"Changing Cluster Configuration"}),"\n",(0,r.jsxs)(i.p,{children:["Cluster configuration is changed from the CLI tool. You can update it both in the interactive (REPL) and non-interactive mode by passing a configuration file with the ",(0,r.jsx)(i.code,{children:"--file"})," parameter."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsx)(i.p,{children:"Values set directly via the CLI take precedence over values set in the configuration file."})}),"\n",(0,r.jsx)(i.h3,{id:"update-via-repl",children:"Update via REPL"}),"\n",(0,r.jsx)(i.p,{children:"Start the CLI tool and connect to any node in the cluster."}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Run the ",(0,r.jsx)(i.code,{children:"cluster config update"})," command and provide the updated configuration as the command argument, for example:"]}),"\n"]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-shell",children:"cluster config update ignite.system.idleSafeTimeSyncIntervalMillis=600\n"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["To update one or more parameters, pass the configuration file to the ",(0,r.jsx)(i.code,{children:"cluster config update"})," command:"]}),"\n"]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-shell",children:"cluster config update --file ../ignite-config.conf\n"})}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"You also can update the configuration combining both approaches:"}),"\n"]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-shell",children:"cluster config update --file ../ignite-config.conf ignite.system.idleSafeTimeSyncIntervalMillis=600\n"})}),"\n",(0,r.jsx)(i.p,{children:"The updated configuration will automatically be applied across the cluster."}),"\n",(0,r.jsx)(i.h3,{id:"update-via-non-interactive-mode",children:"Update via Non-Interactive Mode"}),"\n",(0,r.jsxs)(i.p,{children:["You can also modify cluster configuration via ",(0,r.jsx)(i.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool#non-interactive-cli-mode",children:"non-interactive"})," CLI mode without starting the CLI tool first."]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Pass the configuration file with the ",(0,r.jsx)(i.code,{children:"--file"})," parameter:"]}),"\n"]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-shell",children:"bin/ignite3 cluster config update --file ../ignite-config.conf\n"})}),"\n",(0,r.jsx)(i.p,{children:"The updated configuration will automatically be applied across the cluster."}),"\n",(0,r.jsx)(i.h2,{id:"exporting-cluster-configuration",children:"Exporting Cluster Configuration"}),"\n",(0,r.jsx)(i.p,{children:"If you need to export cluster configuration to file, use the following command:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-shell",children:"bin/ignite3 cluster config show > cluster-config.txt\n"})}),"\n",(0,r.jsx)(i.h2,{id:"configuration-parameters",children:"Configuration Parameters"}),"\n",(0,r.jsx)(i.h3,{id:"event-log-configuration",children:"Event Log Configuration"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "eventlog" : {\r\n "channels" : [ ],\r\n "sinks" : [ ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"channels"}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{children:"A named list of event log channels."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"Valid channels"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"sinks"}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{children:"A named list of event log sinks."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"Valid sinks"})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"garbage-collection-configuration",children:"Garbage Collection Configuration"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "gc" : {\r\n "batchSize" : 5,\r\n "lowWatermark" : {\r\n "dataAvailabilityTimeMillis" : 600000,\r\n "updateIntervalMillis" : 300000\r\n },\r\n "threads" : 16\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"batchSize"}),(0,r.jsx)(i.td,{children:"5"}),(0,r.jsx)(i.td,{children:"The number of entries to be removed by the garbage collection batch for each partition"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"0 - inf"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"lowWatermark.dataAvailabilityTimeMillis"}),(0,r.jsx)(i.td,{children:"600000"}),(0,r.jsx)(i.td,{children:"The duration the outdated versions are available for, in milliseconds."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"1000 - inf"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"lowWatermark.updateIntervalMillis"}),(0,r.jsx)(i.td,{children:"300000"}),(0,r.jsx)(i.td,{children:"The interval of the low watermark updates."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"0 - inf"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"threads"}),(0,r.jsx)(i.td,{children:"Runtime.getRuntime().availableProcessors()"}),(0,r.jsx)(i.td,{children:"The number of threads used by the garbage collector."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"1 - inf"})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"system-configuration",children:"System Configuration"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "system" : {\r\n "idleSafeTimeSyncIntervalMillis" : 500\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsx)(i.tbody,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"idleSafeTimeSyncIntervalMillis"}),(0,r.jsx)(i.td,{children:"500"}),(0,r.jsx)(i.td,{children:"Period (in milliseconds) used to determine how often to issue time sync commands when Metastorage is idle (no Writes are issued). Should not exceed schemaSync.delayDurationMillis. The optimal value is schemaSync.delayDurationMillis / 2."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No (becomes effective on Metastorage leader reelection)"}),(0,r.jsx)(i.td,{children:"1 - inf"})]})})]}),"\n",(0,r.jsx)(i.h3,{id:"metrics-configuration",children:"Metrics Configuration"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "metrics" : {\r\n "exporters" : [ ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsx)(i.tbody,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"exporters"}),(0,r.jsx)(i.td,{}),(0,r.jsxs)(i.td,{children:["The list of ",(0,r.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics",children:"metric"})," exporters currently used."]}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"Valid exporters"})]})})]}),"\n",(0,r.jsx)(i.h3,{id:"replication-configuration",children:"Replication Configuration"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "replication" : {\r\n "idleSafeTimePropagationDurationMillis" : 1000,\r\n "leaseAgreementAcceptanceTimeLimitMillis" : 120000,\r\n "leaseExpirationIntervalMillis" : 5000,\r\n "rpcTimeoutMillis" : 60000,\r\n "batchSizeBytes" : 8192\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"idleSafeTimePropagationDurationMillis"}),(0,r.jsx)(i.td,{children:"1000"}),(0,r.jsx)(i.td,{children:"Interval between Partition Safe Time updates."}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"N/A"}),(0,r.jsx)(i.td,{children:"1 - inf"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"leaseAgreementAcceptanceTimeLimitMillis"}),(0,r.jsx)(i.td,{children:"120000"}),(0,r.jsx)(i.td,{children:"The maximum duration of an election for a new partition leaseholder, in milliseconds."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"N/A"}),(0,r.jsx)(i.td,{children:"5000 - inf"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"leaseExpirationIntervalMillis"}),(0,r.jsx)(i.td,{children:"5000"}),(0,r.jsx)(i.td,{children:"The duration of a single lease."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"N/A"}),(0,r.jsx)(i.td,{children:"2000 - 120000"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"rpcTimeoutMillis"}),(0,r.jsx)(i.td,{children:"60000"}),(0,r.jsx)(i.td,{children:"Replication request processing timeout."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"0 - inf"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"batchSizeBytes"}),(0,r.jsx)(i.td,{children:"8192"}),(0,r.jsx)(i.td,{children:"Batch length (in bytes) to be written into physical storage. Used to limit the size of an atomical Write."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"1 - Integer.MAX_VALUE"})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"schema-sync-configuration",children:"Schema Sync Configuration"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "schemaSync" : {\r\n "delayDurationMillis" : 100,\r\n "maxClockSkewMillis" : 500\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"delayDurationMillis"}),(0,r.jsx)(i.td,{children:"100"}),(0,r.jsx)(i.td,{children:"The delay after which a schema update becomes active. Should exceed the typical time to deliver a schema update to all cluster nodes, otherwise delays in handling operations are possible. Should not be less than system.idleSafeTimeSyncIntervalMillis. The optimal value is system.idleSafeTimeSyncIntervalMillis * 2."}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"N/A"}),(0,r.jsx)(i.td,{children:"1 - inf"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"maxClockSkewMillis"}),(0,r.jsx)(i.td,{children:"500"}),(0,r.jsx)(i.td,{children:"Maximum physical clock skew (ms) tolerated by the cluster. If the difference between physical clocks of two nodes in the cluster exceeds this value, the cluster might demonstrate abnormal behavior."}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"N/A"}),(0,r.jsx)(i.td,{children:"0 - inf"})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"security-configuration",children:"Security Configuration"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "security" : {\r\n "authentication" : {\r\n "providers" : [ {\r\n "name" : "default",\r\n "type" : "basic",\r\n "users" : [ {\r\n "password" : "********",\r\n "username" : "ignite",\r\n "displayName" : "ignite"\r\n }]\r\n } ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"Authentication parameters"}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"providers.name"}),(0,r.jsx)(i.td,{children:"default"}),(0,r.jsx)(i.td,{children:"The name of the authentication provider."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"A valid string"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"providers.type"}),(0,r.jsx)(i.td,{children:"basic"}),(0,r.jsx)(i.td,{children:"The authentication provider type."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"basic, ldap"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"providers.users"}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{children:"The list of users registered with the specific provider."}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"providers.users.displayName"}),(0,r.jsx)(i.td,{children:"ignite"}),(0,r.jsx)(i.td,{children:"Case sensitive user name."}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"N/A"}),(0,r.jsx)(i.td,{children:"A valid username"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"providers.users.password"}),(0,r.jsx)(i.td,{children:"********"}),(0,r.jsx)(i.td,{children:"User password."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"A valid password"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"providers.users.username"}),(0,r.jsx)(i.td,{children:"ignite"}),(0,r.jsx)(i.td,{children:"Case-insensitive user name."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"A valid user name"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"Authorization parameters"}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"sql-configuration",children:"SQL Configuration"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "sql" : {\r\n "planner" : {\r\n "estimatedNumberOfQueries" : 1024,\r\n "maxPlanningTimeMillis" : 15000\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"planner.estimatedNumberOfQueries"}),(0,r.jsx)(i.td,{children:"1024"}),(0,r.jsx)(i.td,{children:"The estimated number of unique queries that are planned to be executed in the cluster in a certain period of time. Used to optimize internal caches and processes. Optional."}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"0 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"planner.maxPlanningTimeMillis"}),(0,r.jsx)(i.td,{children:"15000"}),(0,r.jsx)(i.td,{children:'Query planning timeout in milliseconds. Plan optimization process stops when the timeout is reached. "0" means no timeout.'}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"0 - Long.MAX_VALUE"})]})]})]}),"\n",(0,r.jsx)(i.h3,{id:"transactions-configuration",children:"Transactions Configuration"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "transaction" : {\r\n "readOnlyTimeoutMillis" : 600000,\r\n "readWriteTimeoutMillis" : 30000\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"readOnlyTimeoutMillis"}),(0,r.jsx)(i.td,{children:"600000"}),(0,r.jsxs)(i.td,{children:["Timeout for read-only transactions. It defines how long the transaction holds acquired resources on participating nodes. If no timeout is specified, or it is set to ",(0,r.jsx)(i.code,{children:"0"}),", a default value of 10 minutes is applied. The transaction is guaranteed to remain active until the timeout expires. Once the timeout is reached, the transaction is aborted but may persist briefly beyond the timeout while corresponding resources are cleaned up. Use instead of deprecated ",(0,r.jsx)(i.code,{children:"readOnlyTimeout"}),"."]}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"1 - inf"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"readWriteTimeoutMillis"}),(0,r.jsx)(i.td,{children:"30000"}),(0,r.jsxs)(i.td,{children:["Timeout for read-write transactions. It defines how long the transaction holds acquired resources on participating nodes. If no timeout is specified, or it is set to ",(0,r.jsx)(i.code,{children:"0"}),", a default value of 30 seconds is applied. The transaction is guaranteed to remain active until the timeout expires. Once the timeout is reached, the transaction is aborted but may persist briefly beyond the timeout while corresponding resources are cleaned up. Use instead of deprecated ",(0,r.jsx)(i.code,{children:"readWriteTimeout"}),"."]}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"No"}),(0,r.jsx)(i.td,{children:"1 - inf"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"system-configuration-1",children:"System Configuration"}),"\n",(0,r.jsxs)(i.p,{children:["This section describes internal properties, which are used by a number of Ignite components. Although you can edit these properties in the same way you edit all others by using the ",(0,r.jsx)(i.code,{children:"node config update"})," CLI command, we suggest that you discuss the proposed changes with the Ignite support team. The properties can apply to the cluster as a whole or to a ",(0,r.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config#system-configuration",children:"specific node"}),"."]}),"\n",(0,r.jsx)(i.admonition,{type:"note",children:(0,r.jsxs)(i.p,{children:["Note that the property names are in ",(0,r.jsx)(i.code,{children:"camelCase"}),"."]})}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "system" : {\r\n "cmgPath" : "",\r\n "metastoragePath" : "",\r\n "partitionsBasePath" : "",\r\n "partitionsLogPath" : "",\r\n "properties":[]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Property"}),(0,r.jsx)(i.th,{children:"Default"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Changeable"}),(0,r.jsx)(i.th,{children:"Requires Restart"}),(0,r.jsx)(i.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"system.cmgPath"}),(0,r.jsxs)(i.td,{children:["The path the cluster management group information is stored to. By default, data is stored in ",(0,r.jsx)(i.code,{children:"{IGNITE_HOME}/work/cmg"}),"."]}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"system.metastoragePath"}),(0,r.jsxs)(i.td,{children:["The path the cluster meta information is stored to. By default, data is stored in ",(0,r.jsx)(i.code,{children:"{IGNITE_HOME}/work/metastorage"}),"."]}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"system.partitionsBasePath"}),(0,r.jsxs)(i.td,{children:["The path data partitions are saved to. By default, partitions are stored in ",(0,r.jsx)(i.code,{children:"{IGNITE_HOME}/work/partitions"}),"."]}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"system.partitionsLogPath"}),(0,r.jsxs)(i.td,{children:["The path RAFT log the partitions are stored at. By default, this log is stored in ",(0,r.jsx)(i.code,{children:"{system.partitionsBasePath}/log"}),"."]}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"system.properties"}),(0,r.jsx)(i.td,{children:"System properties used by the Ignite components."}),(0,r.jsx)(i.td,{}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"Yes"}),(0,r.jsx)(i.td,{children:"An array of properties."})]})]})]})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/86fea04b.2a7ac518.js b/docs/ignite3/assets/js/86fea04b.2a7ac518.js deleted file mode 100644 index f738228f7c..0000000000 --- a/docs/ignite3/assets/js/86fea04b.2a7ac518.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3187],{28453:(e,r,t)=>{t.d(r,{R:()=>o,x:()=>c});var n=t(96540);const i={},s=n.createContext(i);function o(e){const r=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function c(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(s.Provider,{value:r},e.children)}},97246:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"configure-and-operate/monitoring/config-metrics","title":"Configuring Metrics","description":"Metric management is performed through the Ignite CLI tool.","source":"@site/docs/configure-and-operate/monitoring/configuring-metrics.md","sourceDirName":"configure-and-operate/monitoring","slug":"/configure-and-operate/monitoring/config-metrics","permalink":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/config-metrics","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"config-metrics","title":"Configuring Metrics","sidebar_label":"Metrics"},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics"},"next":{"title":"Available Metrics","permalink":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics"}}');var i=t(74848),s=t(28453);const o={id:"config-metrics",title:"Configuring Metrics",sidebar_label:"Metrics"},c=void 0,l={},d=[{value:"Listing Metric Sources",id:"listing-metric-sources",level:2},{value:"Listing Metrics",id:"listing-metrics",level:2},{value:"Enabling Metric Sources",id:"enabling-metric-sources",level:2},{value:"Disabling Metric Sources",id:"disabling-metric-sources",level:2},{value:"Configuring Metrics Exporters",id:"configuring-metrics-exporters",level:2},{value:"JMX",id:"jmx",level:3},{value:"Log Exporter",id:"log-exporter",level:3},{value:"OpenTelemetry",id:"opentelemetry",level:3},{value:"Connection to Grafana",id:"connection-to-grafana",level:4},{value:"Connection to Prometheus",id:"connection-to-prometheus",level:4}];function a(e){const r={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(r.p,{children:["Metric management is performed through the ",(0,i.jsx)(r.a,{href:"/3.1.0/tools/cli-commands",children:"Ignite CLI tool"}),"."]}),"\n",(0,i.jsx)(r.h2,{id:"listing-metric-sources",children:"Listing Metric Sources"}),"\n",(0,i.jsx)(r.p,{children:"You can list all available metric sources for a node or for the entire cluster."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"node metric source list\r\ncluster metric source list\n"})}),"\n",(0,i.jsx)(r.h2,{id:"listing-metrics",children:"Listing Metrics"}),"\n",(0,i.jsx)(r.p,{children:"You can list all metrics for a node."}),"\n",(0,i.jsx)(r.admonition,{type:"note",children:(0,i.jsxs)(r.p,{children:["To see the list of metrics, you need to enable the relevant metric sources, see ",(0,i.jsx)(r.a,{href:"#enabling-metric-sources",children:"Enabling Metric Sources"}),"."]})}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"node metric list\n"})}),"\n",(0,i.jsx)(r.p,{children:"The above command returns the list of all currently available metrics organized with their exporters."}),"\n",(0,i.jsx)(r.h2,{id:"enabling-metric-sources",children:"Enabling Metric Sources"}),"\n",(0,i.jsx)(r.p,{children:"Metric collection might affect the performance of an application. Therefore, by default, all metric sources are disabled."}),"\n",(0,i.jsx)(r.p,{children:"Metric sources can be enabled:"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:["On per-node basis: you can specify the node to interact with by using the ",(0,i.jsx)(r.code,{children:"-u"})," parameter to specify node URL or ",(0,i.jsx)(r.code,{children:"-n"})," parameter to specify node name."]}),"\n",(0,i.jsx)(r.li,{children:"For the entire cluster."}),"\n"]}),"\n",(0,i.jsx)(r.p,{children:"For example:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"node metric source enable -n=defaultNode jvm\r\ncluster metric source enable jvm\n"})}),"\n",(0,i.jsx)(r.h2,{id:"disabling-metric-sources",children:"Disabling Metric Sources"}),"\n",(0,i.jsx)(r.p,{children:"Metric sources can be disabled:"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:["On per-node basis: you can specify the node to interact with by using the ",(0,i.jsx)(r.code,{children:"-u"})," parameter to specify node URL or ",(0,i.jsx)(r.code,{children:"-n"})," parameter to specify node name."]}),"\n",(0,i.jsx)(r.li,{children:"For the entire cluster."}),"\n"]}),"\n",(0,i.jsx)(r.p,{children:"For example:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"node metric source disable -n=defaultNode jvm\r\ncluster metric source disable jvm\n"})}),"\n",(0,i.jsx)(r.h2,{id:"configuring-metrics-exporters",children:"Configuring Metrics Exporters"}),"\n",(0,i.jsx)(r.p,{children:"To access the collected metrics with external tools, you need to configure metrics exporters."}),"\n",(0,i.jsx)(r.h3,{id:"jmx",children:"JMX"}),"\n",(0,i.jsx)(r.p,{children:"The JMX exporter provides information about Ignite nodes in JMX(Java Management Extensions) format. When the exporter is enabled, the node exposes the metrics to monitoring tools."}),"\n",(0,i.jsx)(r.p,{children:"You can enable the JMX exporter in the following way:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"cluster config update ignite.metrics.exporters.myJmxExporter.exporterName=jmx\n"})}),"\n",(0,i.jsx)(r.p,{children:"After you do, JMX monitoring tools will be able to collect enabled metrics from the specified nodes."}),"\n",(0,i.jsx)(r.p,{children:"You can also open internal JDK modules required for JMX, enable the remote JMX agent, configure the connection port, authentication, and SSL. Add the following JVM options to your Ignite node configuration:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:"--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED\r\n\r\n-Dcom.sun.management.jmxremote\r\n-Dcom.sun.management.jmxremote.port=\r\n-Dcom.sun.management.jmxremote.authenticate=true|false\r\n-Dcom.sun.management.jmxremote.ssl=true|false\n"})}),"\n",(0,i.jsx)(r.h3,{id:"log-exporter",children:"Log Exporter"}),"\n",(0,i.jsx)(r.p,{children:"Log exporter writes metrics data to the application log, so they can be consumed by log collectors or inspected manually. To configure it, use the following parameters:"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Name"}),(0,i.jsx)(r.th,{children:"Description"}),(0,i.jsx)(r.th,{children:"Default value"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"periodMillis"}),(0,i.jsx)(r.td,{children:"Export interval for the metrics, in milliseconds."}),(0,i.jsx)(r.td,{children:"30000"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"oneLinePerMetricSource"}),(0,i.jsx)(r.td,{children:"Define whether to print all metrics from one metric source on a single log line."}),(0,i.jsx)(r.td,{children:"true"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"enabledMetrics"}),(0,i.jsxs)(r.td,{children:["List of enabled metric sources. If this list is non-empty, only the listed metric sources will be printed, all others will be skipped. A wildcard can be used to match a prefix (for example, ",(0,i.jsx)(r.code,{children:"jvm.*"}),"). By default, the metrics of some background activities are printed."]}),(0,i.jsx)(r.td,{children:'"metastorage", "placement-driver", "resource.vacuum"'})]})]})]}),"\n",(0,i.jsxs)(r.p,{children:["To add log exporter to cluster exporters list, run the following command and define all the metrics to print in ",(0,i.jsx)(r.code,{children:"enabledMetrics"})," list:"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'cluster config update ignite.metrics.exporters.logPush \'{"exporterName":"logPush","periodMillis":30000,"oneLinePerMetricSource":true,"enabledMetrics":[]}\'\n'})}),"\n",(0,i.jsx)(r.p,{children:"Updated exporters configuration should look like this:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-hocon",children:"exporters=[\r\n {\r\n enabledMetrics=[]\r\n exporterName=logPush\r\n name=logPush\r\n oneLinePerMetricSource=true\r\n periodMillis=30000\r\n }\r\n]\n"})}),"\n",(0,i.jsx)(r.h3,{id:"opentelemetry",children:"OpenTelemetry"}),"\n",(0,i.jsxs)(r.p,{children:["The ",(0,i.jsx)(r.a,{href:"https://opentelemetry.io/",children:"OpenTelemetry"})," exporter connects to an OpenTelemetry service that is provided in configuration and sends cluster information to it. Each node sends metrics independently, and requires access to the specified endpoint."]}),"\n",(0,i.jsx)(r.p,{children:"The example below shows the basic OpenTelemetry configuration. As OpenTelemetry services require different URL formats and may require headers, this example may not work for your environment."}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-bash",children:'cluster config update ignite.metrics.exporters.test: {exporterName:otlp, endpoint:"http://localhost:9090/api/v1/otlp/v1/metrics", protocol:"http/protobuf"}\n'})}),"\n",(0,i.jsx)(r.p,{children:"OpenTelemetry exporter created by this command will look like this:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-hocon",children:'{\r\n compression=gzip\r\n endpoint="http://localhost:9090/api/v1/otlp/v1/metrics"\r\n exporterName=otlp\r\n headers=[]\r\n name=test\r\n periodMillis=30000\r\n protocol="http/protobuf"\r\n ssl {\r\n ciphers=""\r\n clientAuth=none\r\n enabled=false\r\n keyStore {\r\n password="********"\r\n path=""\r\n type=PKCS12\r\n }\r\n trustStore {\r\n password="********"\r\n path=""\r\n type=PKCS12\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(r.p,{children:"Below are the descriptions of configuration parameters:"}),"\n",(0,i.jsxs)(r.table,{children:[(0,i.jsx)(r.thead,{children:(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.th,{children:"Name"}),(0,i.jsx)(r.th,{children:"Description"}),(0,i.jsx)(r.th,{children:"Default value"})]})}),(0,i.jsxs)(r.tbody,{children:[(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"compression"}),(0,i.jsxs)(r.td,{children:["How the payload is compressed. Possible values: ",(0,i.jsx)(r.code,{children:"none"}),", ",(0,i.jsx)(r.code,{children:"gzip"}),"."]}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"gzip"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"endpoint"}),(0,i.jsx)(r.td,{children:"The OpenTelemetry endpoint. Each node resolves the endpoint individually."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"exporterName"}),(0,i.jsxs)(r.td,{children:["Exporter name. Must be ",(0,i.jsx)(r.code,{children:"otlp"})," to use OpenTelemetry."]}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"headers"}),(0,i.jsx)(r.td,{children:"Request headers, if any."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"name"}),(0,i.jsx)(r.td,{children:"User-defined exporter name, used to refer to it in Ignite."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"periodMillis"}),(0,i.jsx)(r.td,{children:"Export interval for the metrics, in milliseconds."}),(0,i.jsx)(r.td,{children:"30000"})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"protocol"}),(0,i.jsxs)(r.td,{children:["The protocol that is used to send OpenTelemetry data. Possible values: ",(0,i.jsx)(r.code,{children:"grpc"}),", ",(0,i.jsx)(r.code,{children:"http/protobuf"}),"."]}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"grpc"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.ciphers"}),(0,i.jsx)(r.td,{children:"List of ciphers to enable, comma-separated. Empty for automatic cipher selection."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.clientAuth"}),(0,i.jsx)(r.td,{children:"Whether the SSL client authentication is enabled and whether it is mandatory."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.enabled"}),(0,i.jsx)(r.td,{children:"Defines if SSL is enabled."}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"false"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.keyStore.password"}),(0,i.jsx)(r.td,{children:"SSL keystore password."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.keyStore.path"}),(0,i.jsx)(r.td,{children:"Path to the SSL keystore."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.keyStore.type"}),(0,i.jsx)(r.td,{children:"Keystore type."}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"PKCS12"})})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.trustStore.password"}),(0,i.jsx)(r.td,{children:"Truststore password."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.trustStore.path"}),(0,i.jsx)(r.td,{children:"Path to the truststore."}),(0,i.jsx)(r.td,{})]}),(0,i.jsxs)(r.tr,{children:[(0,i.jsx)(r.td,{children:"ssl.trustStore.type"}),(0,i.jsx)(r.td,{children:"Truststore type."}),(0,i.jsx)(r.td,{children:(0,i.jsx)(r.code,{children:"PKCS12"})})]})]})]}),"\n",(0,i.jsx)(r.h4,{id:"connection-to-grafana",children:"Connection to Grafana"}),"\n",(0,i.jsx)(r.p,{children:"When connecting to Grafana Cloud, you need to use the protobuf protocol and pass the authorization header in the configuration:"}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-shell",children:'cluster config update ignite.metrics.exporters.test: {exporterName:otlp, endpoint:"https://otlp-gateway-prod-eu-west-2.grafana.net/otlp", protocol:"http/protobuf", headers {Authorization.header="Basic myBasicAuthKey"}}\n'})}),"\n",(0,i.jsx)(r.h4,{id:"connection-to-prometheus",children:"Connection to Prometheus"}),"\n",(0,i.jsxs)(r.p,{children:["When connecting to Prometheus, you need to use the protobuf protocol and send metrics to the ",(0,i.jsx)(r.code,{children:"/api/v1/otlp/v1/metrics"})," after the OTLP metrics receiver is enabled as described in ",(0,i.jsx)(r.a,{href:"https://prometheus.io/docs/guides/opentelemetry/",children:"Prometheus documentation"}),":"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-shell",children:'cluster config update ignite.metrics.exporters.test: {exporterName:otlp, endpoint:"http://localhost:9090/api/v1/otlp/v1/metrics", protocol:"http/protobuf"}\n'})})]})}function h(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/8826f367.3c8ad808.js b/docs/ignite3/assets/js/8826f367.3c8ad808.js deleted file mode 100644 index 13f5f5240f..0000000000 --- a/docs/ignite3/assets/js/8826f367.3c8ad808.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6755],{11470:(e,t,n)=>{n.d(t,{A:()=>E});var r=n(96540),i=n(34164),s=n(17559),a=n(23104),o=n(56347),c=n(205),l=n(57485),d=n(31682),u=n(70679);function h(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return h(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,d.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[t,n])}function x({value:e,tabValues:t}){return t.some(t=>t.value===e)}function f({queryString:e=!1,groupId:t}){const n=(0,o.W6)(),i=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(i),(0,r.useCallback)(e=>{if(!i)return;const t=new URLSearchParams(n.location.search);t.set(i,e),n.replace({...n.location,search:t.toString()})},[i,n])]}function g(e){const{defaultValue:t,queryString:n=!1,groupId:i}=e,s=p(e),[a,o]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s})),[l,d]=f({queryString:n,groupId:i}),[h,g]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,i]=(0,u.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&i.set(e)},[t,i])]}({groupId:i}),m=(()=>{const e=l??h;return x({value:e,tabValues:s})?e:null})();(0,c.A)(()=>{m&&o(m)},[m]);return{selectedValue:a,selectValue:(0,r.useCallback)(e=>{if(!x({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),g(e)},[d,g,s]),tabValues:s}}var m=n(92303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=n(74848);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),l=e=>{const t=e.currentTarget,i=o.indexOf(t),a=s[i].value;a!==n&&(c(t),r(a))},d=e=>{let t=null;switch(e.key){case"Enter":l(e);break;case"ArrowRight":{const n=o.indexOf(e.currentTarget)+1;t=o[n]??o[0];break}case"ArrowLeft":{const n=o.indexOf(e.currentTarget)-1;t=o[n]??o[o.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},e),children:s.map(({value:e,label:t,attributes:r})=>(0,b.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{o.push(e)},onKeyDown:d,onClick:l,...r,className:(0,i.A)("tabs__item",j.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function S({lazy:e,children:t,selectedValue:n}){const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:s.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function D(e){const t=g(e);return(0,b.jsxs)("div",{className:(0,i.A)(s.G.tabs.container,"tabs-container",j.tabList),children:[(0,b.jsx)(v,{...t,...e}),(0,b.jsx)(S,{...t,...e})]})}function E(e){const t=(0,m.A)();return(0,b.jsx)(D,{...e,children:h(e.children)},String(t))}},19365:(e,t,n)=>{n.d(t,{A:()=>a});n(96540);var r=n(34164);const i={tabItem:"tabItem_Ymn6"};var s=n(74848);function a({children:e,hidden:t,className:n}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(i.tabItem,n),hidden:t,children:e})}},28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var r=n(96540);const i={},s=r.createContext(i);function a(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:t},e.children)}},49017:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>c,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"develop/connect-to-ignite/odbc-connection-string","title":"ODBC Connection String","description":"Connection String Format","source":"@site/docs/develop/connect-to-ignite/odbc-connection-string.md","sourceDirName":"develop/connect-to-ignite","slug":"/develop/connect-to-ignite/odbc-connection-string","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"id":"odbc-connection-string","title":"ODBC Connection String","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"ODBC Driver","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc"},"next":{"title":"Querying and Modifying Data with ODBC","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data"}}');var i=n(74848),s=n(28453),a=n(11470),o=n(19365);const c={id:"odbc-connection-string",title:"ODBC Connection String",sidebar_position:3},l=void 0,d={},u=[{value:"Connection String Format",id:"connection-string-format",level:2},{value:"Supported Arguments",id:"supported-arguments",level:2},{value:"Connection String Samples",id:"connection-string-samples",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"connection-string-format",children:"Connection String Format"}),"\n",(0,i.jsx)(t.p,{children:"The ODBC Driver supports standard connection string format. Here is the formal syntax:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"connection-string ::= empty-string[;] | attribute[;] | attribute; connection-string\r\nempty-string ::=\r\nattribute ::= attribute-keyword=attribute-value | DRIVER=[{]attribute-value[}]\r\nattribute-keyword ::= identifier\r\nattribute-value ::= character-string\n"})}),"\n",(0,i.jsx)(t.p,{children:"In simple terms, an ODBC connection URL is a string with parameters of your choice separated by semicolons."}),"\n",(0,i.jsx)(t.h2,{id:"supported-arguments",children:"Supported Arguments"}),"\n",(0,i.jsxs)(t.p,{children:["The ODBC driver supports and uses several connection string/DSN arguments. All parameter names are case-insensitive. ",(0,i.jsx)(t.code,{children:"ADDRESS"}),", ",(0,i.jsx)(t.code,{children:"Address"}),", and ",(0,i.jsx)(t.code,{children:"address"})," all are valid parameter names and refer to the same parameter. If an argument is not specified, the default value is used. The exception to this rule is the ",(0,i.jsx)(t.code,{children:"ADDRESS"})," attribute. If it is not specified, ",(0,i.jsx)(t.code,{children:"SERVER"})," and ",(0,i.jsx)(t.code,{children:"PORT"})," attributes are used instead."]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Attribute keyword"}),(0,i.jsx)(t.th,{children:"Description"}),(0,i.jsx)(t.th,{children:"Default Value"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"ADDRESS"})}),(0,i.jsxs)(t.td,{children:["Address of the remote node to connect to. The format is: ",(0,i.jsx)(t.code,{children:"[:]"}),". For example: ",(0,i.jsx)(t.code,{children:"localhost"}),", ",(0,i.jsx)(t.code,{children:"example.com:12345"}),", ",(0,i.jsx)(t.code,{children:"127.0.0.1"}),", ",(0,i.jsx)(t.code,{children:"192.168.3.80:5893"}),". If this attribute is specified, then ",(0,i.jsx)(t.code,{children:"SERVER"})," and ",(0,i.jsx)(t.code,{children:"PORT"})," arguments are ignored."]}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SERVER"})}),(0,i.jsx)(t.td,{children:"Address of the node to connect to. This argument value is ignored if ADDRESS argument is specified."}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"PORT"})}),(0,i.jsxs)(t.td,{children:["Port on which ",(0,i.jsx)(t.code,{children:"OdbcProcessor"})," of the node is listening. This argument value is ignored if ",(0,i.jsx)(t.code,{children:"ADDRESS"})," argument is specified."]}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"10800"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"IDENTITY"}),(0,i.jsxs)(t.td,{children:["Identity to use for authentication. Depending on the authenticator used on the server side, it can be a user name or another unique identifier. See the ",(0,i.jsx)(t.a,{href:"/3.1.0/configure-and-operate/configuration/config-authentication",children:"Authentication"})," topic for details."]}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"SECRET"}),(0,i.jsxs)(t.td,{children:["Secret to use for authentication. Depending on the authenticator used on the server side, it can be a user password or another type of user-specific secret. See the ",(0,i.jsx)(t.a,{href:"/3.1.0/configure-and-operate/configuration/config-authentication",children:"Authentication"})," topic for details."]}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SCHEMA"})}),(0,i.jsx)(t.td,{children:"Schema name."}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"PUBLIC"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"PAGE_SIZE"})}),(0,i.jsx)(t.td,{children:"Number of rows returned in response to a fetching request to the data source. Default value should be fine in most cases. Setting a low value can result in slow data fetching while setting a high value can result in additional memory usage by the driver, and additional delay when the next page is being retrieved."}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"1024"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SSL_MODE"})}),(0,i.jsxs)(t.td,{children:["Determines whether the SSL connection should be negotiated with the server. Use ",(0,i.jsx)(t.code,{children:"require"})," or ",(0,i.jsx)(t.code,{children:"disable"})," mode as needed."]}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"disable"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SSL_KEY_FILE"})}),(0,i.jsx)(t.td,{children:"Specifies the path to the file containing the SSL server private key."}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SSL_CERT_FILE"})}),(0,i.jsx)(t.td,{children:"Specifies the path to the file containing the SSL server certificate."}),(0,i.jsx)(t.td,{children:"None."})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:(0,i.jsx)(t.code,{children:"SSL_CA_FILE"})}),(0,i.jsx)(t.td,{children:"Specifies the path to the file containing the SSL server certificate authority (CA)."}),(0,i.jsx)(t.td,{children:"None."})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"connection-string-samples",children:"Connection String Samples"}),"\n",(0,i.jsxs)(t.p,{children:["You can find samples of the connection string below. These strings can be used with ",(0,i.jsx)(t.code,{children:"SQLDriverConnect"})," ODBC call to establish connection with a node."]}),"\n",(0,i.jsxs)(a.A,{groupId:"odbc-samples",children:[(0,i.jsx)(o.A,{value:"schema",label:"Specific schema",children:(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"DRIVER={Apache Ignite 3};ADDRESS=localhost:10800;SCHEMA=yourSchemaName\n"})})}),(0,i.jsx)(o.A,{value:"default",label:"Default schema",children:(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"DRIVER={Apache Ignite 3};ADDRESS=localhost:10800\n"})})}),(0,i.jsx)(o.A,{value:"auth",label:"Authentication",children:(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"DRIVER={Apache Ignite 3};ADDRESS=localhost:10800;IDENTITY=yourid;SECRET=yoursecret\n"})})}),(0,i.jsx)(o.A,{value:"pagesize",label:"Custom page size",children:(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-text",children:"DRIVER={Apache Ignite 3};ADDRESS=localhost:10800;SCHEMA=yourSchemaName;PAGE_SIZE=4096\n"})})})]})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/88642a14.9fffa0ca.js b/docs/ignite3/assets/js/88642a14.9fffa0ca.js deleted file mode 100644 index f8df64384c..0000000000 --- a/docs/ignite3/assets/js/88642a14.9fffa0ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[325],{20995:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>o,contentTitle:()=>l,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"api-reference/native-clients/java/data-streamer-api","title":"Data Streamer API","description":"The Data Streamer API provides high-throughput data ingestion into Ignite tables. Applications stream data using reactive publishers that batch records for efficient network transmission and processing. This approach achieves higher performance than individual put operations.","source":"@site/docs/api-reference/native-clients/java/data-streamer-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/data-streamer-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Data Streamer API","id":"data-streamer-api","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Tables API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api"},"next":{"title":"SQL API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api"}}');var n=t(74848),i=t(28453);const s={title:"Data Streamer API",id:"data-streamer-api",sidebar_position:4},l="Data Streamer API",o={},c=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Basic Streaming",id:"basic-streaming",level:2},{value:"Stream Options",id:"stream-options",level:2},{value:"Operation Types",id:"operation-types",level:2},{value:"Custom Publishers",id:"custom-publishers",level:2},{value:"Receiver-Based Streaming",id:"receiver-based-streaming",level:2},{value:"Error Handling",id:"error-handling",level:2},{value:"Auto-Flush Interval",id:"auto-flush-interval",level:2},{value:"Key-Value View Streaming",id:"key-value-view-streaming",level:2},{value:"Performance Considerations",id:"performance-considerations",level:2},{value:"Reference",id:"reference",level:2},{value:"DataStreamerTarget Methods",id:"datastreamertarget-methods",level:3},{value:"DataStreamerOptions Configuration",id:"datastreameroptions-configuration",level:3},{value:"DataStreamerItem Operations",id:"datastreameritem-operations",level:3},{value:"DataStreamerReceiver Interface",id:"datastreamerreceiver-interface",level:3}];function u(e){const r={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"data-streamer-api",children:"Data Streamer API"})}),"\n",(0,n.jsx)(r.p,{children:"The Data Streamer API provides high-throughput data ingestion into Ignite tables. Applications stream data using reactive publishers that batch records for efficient network transmission and processing. This approach achieves higher performance than individual put operations."}),"\n",(0,n.jsx)(r.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,n.jsx)(r.p,{children:"Data streaming uses the Java Flow API for backpressure-aware data delivery. Publishers produce items that contain operation types and payloads. The streamer batches items, sends them to appropriate nodes, and executes operations in parallel across partitions."}),"\n",(0,n.jsx)(r.p,{children:"Both RecordView and KeyValueView implement DataStreamerTarget, enabling streaming to either view type. Configure streaming behavior through DataStreamerOptions to control batch sizes, parallelism, and retry behavior."}),"\n",(0,n.jsx)(r.h2,{id:"basic-streaming",children:"Basic Streaming"}),"\n",(0,n.jsx)(r.p,{children:"Stream data using a Flow publisher:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'RecordView view = table.recordView();\r\n\r\n// Create publisher\r\nList> items = Arrays.asList(\r\n DataStreamerItem.of(Tuple.create().set("id", 1).set("name", "Alice")),\r\n DataStreamerItem.of(Tuple.create().set("id", 2).set("name", "Bob")),\r\n DataStreamerItem.of(Tuple.create().set("id", 3).set("name", "Carol"))\r\n);\r\n\r\nSubmissionPublisher> publisher =\r\n new SubmissionPublisher<>();\r\n\r\n// Stream data\r\nCompletableFuture future = view.streamData(\r\n publisher,\r\n DataStreamerOptions.DEFAULT\r\n);\r\n\r\n// Submit items\r\nitems.forEach(publisher::submit);\r\npublisher.close();\r\n\r\nfuture.join();\n'})}),"\n",(0,n.jsx)(r.p,{children:"The operation completes when all items are processed."}),"\n",(0,n.jsx)(r.h2,{id:"stream-options",children:"Stream Options"}),"\n",(0,n.jsx)(r.p,{children:"Configure streaming behavior with options:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:"DataStreamerOptions options = DataStreamerOptions.builder()\r\n .pageSize(1000)\r\n .perPartitionParallelOperations(4)\r\n .autoFlushInterval(1000)\r\n .retryLimit(3)\r\n .build();\r\n\r\nCompletableFuture future = view.streamData(publisher, options);\n"})}),"\n",(0,n.jsx)(r.p,{children:"The pageSize parameter controls batch size. Higher values increase throughput but consume more memory. The perPartitionParallelOperations setting determines concurrent operations per partition."}),"\n",(0,n.jsx)(r.h2,{id:"operation-types",children:"Operation Types"}),"\n",(0,n.jsx)(r.p,{children:"Specify operation types for each item:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'List> items = Arrays.asList(\r\n DataStreamerItem.of(\r\n Tuple.create().set("id", 1).set("name", "Alice"),\r\n DataStreamerOperationType.PUT\r\n ),\r\n DataStreamerItem.of(\r\n Tuple.create().set("id", 2).set("status", "active"),\r\n DataStreamerOperationType.PUT\r\n ),\r\n DataStreamerItem.removed(\r\n Tuple.create().set("id", 3)\r\n ),\r\n DataStreamerItem.of(\r\n Tuple.create().set("id", 4).set("name", "David")\r\n )\r\n);\n'})}),"\n",(0,n.jsx)(r.p,{children:"Available operations:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:["PUT: Insert or update records (default when using ",(0,n.jsx)(r.code,{children:"of()"})," method)"]}),"\n",(0,n.jsxs)(r.li,{children:["REMOVE: Remove records (use ",(0,n.jsx)(r.code,{children:"removed()"})," method or explicit ",(0,n.jsx)(r.code,{children:"DataStreamerOperationType.REMOVE"}),")"]}),"\n"]}),"\n",(0,n.jsx)(r.h2,{id:"custom-publishers",children:"Custom Publishers"}),"\n",(0,n.jsx)(r.p,{children:"Implement custom publishers for streaming from external sources:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'class FilePublisher implements Flow.Publisher> {\r\n private final Path file;\r\n\r\n public FilePublisher(Path file) {\r\n this.file = file;\r\n }\r\n\r\n public void subscribe(Flow.Subscriber> subscriber) {\r\n subscriber.onSubscribe(new Flow.Subscription() {\r\n private BufferedReader reader;\r\n\r\n public void request(long n) {\r\n try {\r\n if (reader == null) {\r\n reader = Files.newBufferedReader(file);\r\n }\r\n\r\n for (long i = 0; i < n; i++) {\r\n String line = reader.readLine();\r\n if (line == null) {\r\n reader.close();\r\n subscriber.onComplete();\r\n return;\r\n }\r\n\r\n String[] parts = line.split(",");\r\n Tuple tuple = Tuple.create()\r\n .set("id", Integer.parseInt(parts[0]))\r\n .set("name", parts[1]);\r\n\r\n subscriber.onNext(DataStreamerItem.of(tuple));\r\n }\r\n } catch (IOException e) {\r\n subscriber.onError(e);\r\n }\r\n }\r\n\r\n public void cancel() {\r\n try {\r\n if (reader != null) {\r\n reader.close();\r\n }\r\n } catch (IOException e) {\r\n // Ignore\r\n }\r\n }\r\n });\r\n }\r\n}\n'})}),"\n",(0,n.jsx)(r.p,{children:"Publishers must respect backpressure signals to avoid overwhelming the system."}),"\n",(0,n.jsx)(r.h2,{id:"receiver-based-streaming",children:"Receiver-Based Streaming"}),"\n",(0,n.jsx)(r.p,{children:"Execute custom processing logic on server nodes using receivers:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'class AggregationReceiver\r\n implements DataStreamerReceiver {\r\n\r\n @Override\r\n public CompletableFuture> receive(\r\n List items,\r\n DataStreamerReceiverContext context,\r\n String arg\r\n ) {\r\n Table table = context.ignite().tables().table("aggregates");\r\n RecordView view = table.recordView();\r\n\r\n Map counts = new HashMap<>();\r\n for (Tuple item : items) {\r\n String category = item.stringValue("category");\r\n counts.merge(category, 1, Integer::sum);\r\n }\r\n\r\n for (Map.Entry entry : counts.entrySet()) {\r\n Tuple record = Tuple.create()\r\n .set("category", entry.getKey())\r\n .set("count", entry.getValue());\r\n view.put(null, record);\r\n }\r\n\r\n return CompletableFuture.completedFuture(\r\n Collections.singletonList(counts.size())\r\n );\r\n }\r\n}\n'})}),"\n",(0,n.jsx)(r.p,{children:"Register and use the receiver:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'DataStreamerReceiverDescriptor descriptor =\r\n DataStreamerReceiverDescriptor.builder(\r\n "com.example.AggregationReceiver"\r\n ).build();\r\n\r\nSubmissionPublisher publisher = new SubmissionPublisher<>();\r\n\r\nCompletableFuture future = view.streamData(\r\n publisher,\r\n descriptor,\r\n tuple -> tuple.value("id"),\r\n tuple -> tuple,\r\n "aggregation-arg",\r\n null,\r\n DataStreamerOptions.DEFAULT\r\n);\r\n\r\n// Submit items\r\nList items = Arrays.asList(\r\n Tuple.create().set("id", 1).set("category", "A"),\r\n Tuple.create().set("id", 2).set("category", "B")\r\n);\r\nitems.forEach(publisher::submit);\r\npublisher.close();\r\n\r\nfuture.join();\n'})}),"\n",(0,n.jsx)(r.p,{children:"Receivers process batches on server nodes, enabling custom logic like aggregations or complex transformations."}),"\n",(0,n.jsx)(r.h2,{id:"error-handling",children:"Error Handling"}),"\n",(0,n.jsx)(r.p,{children:"Handle streaming errors through the returned future:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'CompletableFuture future = view.streamData(publisher, options);\r\n\r\nfuture.exceptionally(ex -> {\r\n if (ex instanceof DataStreamerException) {\r\n System.err.println("Streaming failed: " + ex.getMessage());\r\n }\r\n return null;\r\n});\n'})}),"\n",(0,n.jsx)(r.p,{children:"Configure retry behavior through DataStreamerOptions.retryLimit to automatically retry failed batches."}),"\n",(0,n.jsx)(r.h2,{id:"auto-flush-interval",children:"Auto-Flush Interval"}),"\n",(0,n.jsx)(r.p,{children:"Configure periodic flushing for low-volume streams:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:"DataStreamerOptions options = DataStreamerOptions.builder()\r\n .autoFlushInterval(500)\r\n .build();\n"})}),"\n",(0,n.jsx)(r.p,{children:"The streamer flushes incomplete batches after the specified interval in milliseconds. This prevents data from remaining buffered indefinitely in low-throughput scenarios."}),"\n",(0,n.jsx)(r.h2,{id:"key-value-view-streaming",children:"Key-Value View Streaming"}),"\n",(0,n.jsx)(r.p,{children:"Stream to key-value views using Entry payloads:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'KeyValueView kvView = table.keyValueView();\r\n\r\nList>> items = Arrays.asList(\r\n DataStreamerItem.of(Map.entry(\r\n Tuple.create().set("id", 1),\r\n Tuple.create().set("name", "Alice")\r\n )),\r\n DataStreamerItem.of(Map.entry(\r\n Tuple.create().set("id", 2),\r\n Tuple.create().set("name", "Bob")\r\n ))\r\n);\r\n\r\nSubmissionPublisher>> publisher =\r\n new SubmissionPublisher<>();\r\n\r\nCompletableFuture future = kvView.streamData(publisher, DataStreamerOptions.DEFAULT);\r\n\r\nitems.forEach(publisher::submit);\r\npublisher.close();\r\n\r\nfuture.join();\n'})}),"\n",(0,n.jsx)(r.h2,{id:"performance-considerations",children:"Performance Considerations"}),"\n",(0,n.jsx)(r.p,{children:"Optimize streaming throughput by tuning configuration:"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:"DataStreamerOptions options = DataStreamerOptions.builder()\r\n .pageSize(10000)\r\n .perPartitionParallelOperations(8)\r\n .retryLimit(5)\r\n .build();\n"})}),"\n",(0,n.jsx)(r.p,{children:"Larger page sizes reduce per-batch overhead but increase memory usage. Higher parallelism improves throughput on multi-core systems but may cause resource contention."}),"\n",(0,n.jsx)(r.h2,{id:"reference",children:"Reference"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:["Streaming interface: ",(0,n.jsx)(r.code,{children:"org.apache.ignite.table.DataStreamerTarget"})]}),"\n",(0,n.jsxs)(r.li,{children:["Configuration: ",(0,n.jsx)(r.code,{children:"org.apache.ignite.table.DataStreamerOptions"})]}),"\n",(0,n.jsxs)(r.li,{children:["Stream items: ",(0,n.jsx)(r.code,{children:"org.apache.ignite.table.DataStreamerItem"})]}),"\n",(0,n.jsxs)(r.li,{children:["Custom processing: ",(0,n.jsx)(r.code,{children:"org.apache.ignite.table.DataStreamerReceiver"})]}),"\n",(0,n.jsxs)(r.li,{children:["Receiver context: ",(0,n.jsx)(r.code,{children:"org.apache.ignite.table.DataStreamerReceiverContext"})]}),"\n",(0,n.jsxs)(r.li,{children:["Receiver descriptor: ",(0,n.jsx)(r.code,{children:"org.apache.ignite.table.DataStreamerReceiverDescriptor"})]}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"datastreamertarget-methods",children:"DataStreamerTarget Methods"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"CompletableFuture streamData(Publisher>, DataStreamerOptions)"})," - Stream data to table"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:" CompletableFuture streamData(Publisher, DataStreamerReceiverDescriptor, Function, Function, A, Subscriber, DataStreamerOptions)"})," - Stream with custom receiver"]}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"datastreameroptions-configuration",children:"DataStreamerOptions Configuration"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"pageSize"})," - Number of items per batch (default: 1000)"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"perPartitionParallelOperations"})," - Concurrent operations per partition (default: 1)"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"autoFlushInterval"})," - Auto-flush interval in milliseconds (default: 5000)"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"retryLimit"})," - Number of retry attempts for failed batches (default: 16)"]}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"datastreameritem-operations",children:"DataStreamerItem Operations"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"PUT"})," - Insert or update record"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"REMOVE"})," - Remove record"]}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"datastreamerreceiver-interface",children:"DataStreamerReceiver Interface"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"CompletableFuture> receive(List, DataStreamerReceiverContext, A)"})," - Process batch on server"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"Marshaller payloadMarshaller()"})," - Custom payload serialization"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"Marshaller argumentMarshaller()"})," - Custom argument serialization"]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.code,{children:"Marshaller resultMarshaller()"})," - Custom result serialization"]}),"\n"]})]})}function d(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},28453:(e,r,t)=>{t.d(r,{R:()=>s,x:()=>l});var a=t(96540);const n={},i=a.createContext(n);function s(e){const r=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),a.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/8d621382.def80860.js b/docs/ignite3/assets/js/8d621382.def80860.js deleted file mode 100644 index 6fd0d91887..0000000000 --- a/docs/ignite3/assets/js/8d621382.def80860.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3517],{11470:(e,n,t)=>{t.d(n,{A:()=>k});var r=t(96540),s=t(34164),i=t(17559),a=t(23104),l=t(56347),c=t(205),o=t(57485),d=t(31682),u=t(70679);function h(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const t=(0,l.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,o.aZ)(s),(0,r.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,i=p(e),[a,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:i})),[o,d]=x({queryString:t,groupId:s}),[h,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,u.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),b=(()=>{const e=o??h;return g({value:e,tabValues:i})?e:null})();(0,c.A)(()=>{b&&l(b)},[b]);return{selectedValue:a,selectValue:(0,r.useCallback)(e=>{if(!g({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),m(e)},[d,m,i]),tabValues:i}}var b=t(92303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(74848);function f({className:e,block:n,selectedValue:t,selectValue:r,tabValues:i}){const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,a.a_)(),o=e=>{const n=e.currentTarget,s=l.indexOf(n),a=i[s].value;a!==t&&(c(n),r(a))},d=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:o,...r,className:(0,s.A)("tabs__item",j.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:t}){const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=i.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:i.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function _(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,s.A)(i.G.tabs.container,"tabs-container",j.tabList),children:[(0,v.jsx)(f,{...n,...e}),(0,v.jsx)(y,{...n,...e})]})}function k(e){const n=(0,b.A)();return(0,v.jsx)(_,{...e,children:h(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>a});t(96540);var r=t(34164);const s={tabItem:"tabItem_Ymn6"};var i=t(74848);function a({children:e,hidden:n,className:t}){return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(s.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>l});var r=t(96540);const s={},i=r.createContext(s);function a(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(i.Provider,{value:n},e.children)}},47709:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>c,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"developers-guide/clients/cpp","title":"C++ Client","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/clients/cpp.md","sourceDirName":"developers-guide/clients","slug":"/developers-guide/clients/cpp","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/cpp","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"C++ Client","sidebar_label":"C++"},"sidebar":"tutorialSidebar","previous":{"title":".NET","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/dotnet"},"next":{"title":"Python","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/python"}}');var s=t(74848),i=t(28453),a=t(11470),l=t(19365);const c={title:"C++ Client",sidebar_label:"C++"},o=void 0,d={},u=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Installation",id:"build-ref",level:3},{value:"Building C++ Client on CentOS 7 and RHEL 7",id:"building-c-client-on-centos-7-and-rhel-7",level:3},{value:"Client Connector Configuration",id:"client-connector-configuration",level:2},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Authentication",id:"authentication",level:2},{value:"User Object Serialization",id:"user-object-serialization",level:2},{value:"Limitations",id:"limitations",level:3},{value:"Usage Examples",id:"usage-examples",level:3},{value:"SQL API",id:"sql-api",level:2},{value:"SQL Scripts",id:"sql-scripts",level:3},{value:"Transactions",id:"transactions",level:2},{value:"Table API",id:"table-api",level:2},{value:"Getting a Table Instance",id:"getting-a-table-instance",level:3},{value:"Basic Table Operations",id:"basic-table-operations",level:3},{value:"Binary Record View",id:"binary-record-view",level:4},{value:"Record View",id:"record-view",level:4},{value:"Key-Value Binary View",id:"key-value-binary-view",level:4},{value:"Key-Value View",id:"key-value-view",level:4}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n","\n",(0,s.jsx)(n.p,{children:"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there is no separate Thin and Thick clients in Ignite 3. All clients are 'thin'."}),"\n",(0,s.jsx)(n.p,{children:"Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations."}),"\n",(0,s.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,s.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(n.p,{children:["To run C++ client, you need a C++ build environment to run the ",(0,s.jsx)(n.code,{children:"cmake"})," command:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"C++ compiler supporting C++ 17;"}),"\n",(0,s.jsx)(n.li,{children:"CMake 3.10+;"}),"\n",(0,s.jsx)(n.li,{children:"One of build systems: make, ninja, MS Visual Studio, or other."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"build-ref",children:"Installation"}),"\n",(0,s.jsx)(n.p,{children:"The source code of the C++ client comes with the Ignite 3 distribution. To build it, use the following commands:"}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsx)(l.A,{value:"Windows",label:"Windows",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bat",children:"mkdir cmake-build-release\r\ncd cmake-build-release\r\ncmake ..\r\ncmake --build . -j8\n"})})}),(0,s.jsx)(l.A,{value:"Linux",label:"Linux",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mkdir cmake-build-release\r\ncd cmake-build-release\r\ncmake .. -DCMAKE_BUILD_TYPE=Release\r\ncmake --build . -j8\n"})})}),(0,s.jsx)(l.A,{value:"MacOS",label:"MacOS",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mkdir cmake-build-release\r\ncd cmake-build-release\r\ncmake .. -DCMAKE_BUILD_TYPE=Release\r\ncmake --build . -j8\n"})})})]}),"\n",(0,s.jsx)(n.h3,{id:"building-c-client-on-centos-7-and-rhel-7",children:"Building C++ Client on CentOS 7 and RHEL 7"}),"\n",(0,s.jsx)(n.p,{children:"If you are running on older systems, you need to set up the environment in the following way:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.code,{children:"epel-release"})," and ",(0,s.jsx)(n.code,{children:"centos-release-scl"}),":"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"yum install epel-release centos-release-scl\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["Update yum and accept ",(0,s.jsx)(n.code,{children:"epel-release"})," keys:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"yum update\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"3",children:["\n",(0,s.jsxs)(n.li,{children:["Install the build tools from the main repository and ",(0,s.jsx)(n.code,{children:"devtoolset-11"}),":"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"yum install devtoolset-11-gcc devtoolset-11-gcc-c++ cmake3 git java-11-openjdk-devel gtest-devel gmock-devel\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"4",children:["\n",(0,s.jsxs)(n.li,{children:["Create and update alternatives for ",(0,s.jsx)(n.code,{children:"cmake"})," to force the use of ",(0,s.jsx)(n.code,{children:"cmake3"}),":","\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Create an alternative for ",(0,s.jsx)(n.code,{children:"cmake2"})," with priority 10:"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake 10 \\\r\n--slave /usr/local/bin/ctest ctest /usr/bin/ctest \\\r\n--slave /usr/local/bin/cpack cpack /usr/bin/cpack \\\r\n--slave /usr/local/bin/ccmake ccmake /usr/bin/ccmake \\\r\n--family cmake\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"2",children:["\n",(0,s.jsxs)(n.li,{children:["Create an alternative for ",(0,s.jsx)(n.code,{children:"cmake3"})," with priority 20:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake3 20 \\\r\n--slave /usr/local/bin/ctest ctest /usr/bin/ctest3 \\\r\n--slave /usr/local/bin/cpack cpack /usr/bin/cpack3 \\\r\n--slave /usr/local/bin/ccmake ccmake /usr/bin/ccmake3 \\\r\n--family cmake\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"3",children:["\n",(0,s.jsxs)(n.li,{children:["Check that the default alternative points to ",(0,s.jsx)(n.code,{children:"cmake3"}),":"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo alternatives --config cmake\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"5",children:["\n",(0,s.jsxs)(n.li,{children:["Enable the ",(0,s.jsx)(n.code,{children:"devtoolset-11"})," compiler and start bash with the updated PATH:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"scl enable devtoolset-11 bash\n"})}),"\n",(0,s.jsxs)(n.ol,{start:"6",children:["\n",(0,s.jsxs)(n.li,{children:["Start the ",(0,s.jsx)(n.a,{href:"#build-ref",children:"build"})," in the shell you have established."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"client-connector-configuration",children:"Client Connector Configuration"}),"\n",(0,s.jsxs)(n.p,{children:["Client connection parameters are controlled by the client connector configuration. By default, Ignite accepts client connections on port 10800. You can change the configuration for the node by using the ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool",children:"CLI tool"})," at any time."]}),"\n",(0,s.jsx)(n.p,{children:"Here is how the client connector configuration looks like in the JSON format."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"In Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'"ignite" : {\r\n "clientConnector" : {\r\n "port" : 10800,\r\n "idleTimeoutMillis" :3000,\r\n "sendServerExceptionStackTraceToClient" : true,\r\n "ssl" : {\r\n "enabled" : true,\r\n "clientAuth" : "require",\r\n "keyStore" : {\r\n "path" : "KEYSTORE_PATH",\r\n "password" : "SSL_STORE_PASS"\r\n },\r\n "trustStore" : {\r\n "path" : "TRUSTSTORE_PATH",\r\n "password" : "SSL_STORE_PASS"\r\n },\r\n },\r\n },\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"The table below covers the configuration for client connector:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Property"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"connectTimeoutMillis"}),(0,s.jsx)(n.td,{children:"5000"}),(0,s.jsx)(n.td,{children:"Connection attempt timeout, in milliseconds."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"idleTimeoutMillis"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"How long the client can be idle before the connection is dropped, in milliseconds. By default, there is no limit."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"metricsEnabled"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"false"})}),(0,s.jsx)(n.td,{children:"Defines if client metrics are collected."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"port"}),(0,s.jsx)(n.td,{children:"10800"}),(0,s.jsx)(n.td,{children:"The port the client connector will be listening to."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"sendServerExceptionStackTraceToClient"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"false"})}),(0,s.jsx)(n.td,{children:"Defines if cluster exceptions are sent to the client."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.ciphers"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"The cipher used for SSL communication."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.clientAuth"}),(0,s.jsx)(n.td,{}),(0,s.jsxs)(n.td,{children:["Type of client authentication used by clients. For more information, see ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls",children:"SSL/TLS"}),"."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.enabled"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Defines if SSL is enabled."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.keyStore.password"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"SSL keystore password."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.keyStore.path"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Path to the SSL keystore."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.keyStore.type"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"PKCS12"})}),(0,s.jsx)(n.td,{children:"The type of SSL keystore used."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.trustStore.password"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"SSL keystore password."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.trustStore.path"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Path to the SSL keystore."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.trustStore.type"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"PKCS12"})}),(0,s.jsx)(n.td,{children:"The type of SSL keystore used."})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"Here is how you can change the parameters:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"node config update clientConnector.port=10469\n"})}),"\n",(0,s.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,s.jsxs)(n.p,{children:["To initialize a client, use the ",(0,s.jsx)(n.code,{children:"IgniteClient"})," class, and provide it with the configuration:"]}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nignite_client_configuration cfg{"127.0.0.1"};\r\nauto client = ignite_client::start(cfg, std::chrono::seconds(5));\n'})})})}),"\n",(0,s.jsx)(n.h2,{id:"authentication",children:"Authentication"}),"\n",(0,s.jsxs)(n.p,{children:["To pass authentication information, pass it to ",(0,s.jsx)(n.code,{children:"IgniteClient"})," builder:"]}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto authenticator = std::make_shared("myUser", "myPassword");\r\n\r\nignite::ignite_client_configuration cfg{"127.0.0.1:10800"};\r\ncfg.set_authenticator(authenticator);\r\nauto client = ignite_client::start(std::move(cfg), std::chrono::seconds(30));\n'})})})}),"\n",(0,s.jsx)(n.h2,{id:"user-object-serialization",children:"User Object Serialization"}),"\n",(0,s.jsx)(n.p,{children:"Ignite supports mapping user objects to table tuples. This ensures that objects created in any programming language can be used for key-value operations directly."}),"\n",(0,s.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,s.jsx)(n.p,{children:"There are limitations to user types that can be used for such a mapping. Some limitations are common, and others are platform-specific due to the programming language used."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Only flat field structure is supported, meaning no nesting user objects. This is because Ignite tables, and therefore tuples have flat structure themselves;"}),"\n",(0,s.jsx)(n.li,{children:"Fields should be mapped to Ignite types;"}),"\n",(0,s.jsx)(n.li,{children:"All fields in user type should either be mapped to Table column or explicitly excluded;"}),"\n",(0,s.jsx)(n.li,{children:"All columns from Table should be mapped to some field in the user type;"}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"C++ only"}),": User has to provide marshalling functions explicitly as there is no reflection to generate them based on user type structure."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'struct account {\r\n account() = default;\r\n account(std::int64_t id) : id(id) {}\r\n account(std::int64_t id, std::int64_t balance) : id(id), balance(balance) {}\r\n\r\n std::int64_t id{0};\r\n std::int64_t balance{0};\r\n};\r\n\r\nnamespace ignite {\r\n\r\n template<>\r\n ignite_tuple convert_to_tuple(account &&value) {\r\n ignite_tuple tuple;\r\n\r\n tuple.set("id", value.id);\r\n tuple.set("balance", value.balance);\r\n\r\n return tuple;\r\n }\r\n\r\n template<>\r\n account convert_from_tuple(ignite_tuple&& value) {\r\n account res;\r\n\r\n res.id = value.get("id");\r\n\r\n // Sometimes only key columns are returned, i.e. "id",\r\n // so we have to check whether there are any other columns.\r\n if (value.column_count() > 1)\r\n res.balance = value.get("balance");\r\n\r\n return res;\r\n }\r\n\r\n} // namespace ignite\n'})})})}),"\n",(0,s.jsx)(n.h2,{id:"sql-api",children:"SQL API"}),"\n",(0,s.jsxs)(n.p,{children:["Ignite 3 is focused on SQL, and SQL API is the primary way to work with the data. You can read more about supported SQL statements in the ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl",children:"SQL Reference"})," section. Here is how you can send SQL requests:"]}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'result_set result = client.get_sql().execute(nullptr, {"select name from tbl where id = ?"}, {std::int64_t{42}});\r\nstd::vector page = result_set.current_page();\r\nignite_tuple& row = page.front();\n'})})})}),"\n",(0,s.jsx)(n.h3,{id:"sql-scripts",children:"SQL Scripts"}),"\n",(0,s.jsxs)(n.p,{children:["The default API executes SQL statements one at a time. If you want to execute large SQL statements, pass them to the ",(0,s.jsx)(n.code,{children:"executeScript()"})," method. These statements will be executed in order."]}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'std::string script = ""\r\n\t+ "CREATE TABLE IF NOT EXISTS Person (id int primary key, city_id int, name varchar, age int, company varchar);"\r\n\t+ "INSERT INTO Person (1,3, \'John\', 43, \'Sample\')";\r\n\r\nclient.get_sql().execute_script(script);\n'})})})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Execution of each statement is considered complete when the first page is ready to be returned. As a result, when working with large data sets, SELECT statement may be affected by later statements in the same script."})}),"\n",(0,s.jsx)(n.h2,{id:"transactions",children:"Transactions"}),"\n",(0,s.jsx)(n.p,{children:"All table operations in Ignite 3 are transactional. You can provide an explicit transaction as a first argument of any Table and SQL API call. If you do not provide an explicit transaction, an implicit one will be created for every call."}),"\n",(0,s.jsx)(n.p,{children:"Here is how you can provide a transaction explicitly:"}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto accounts = table.get_key_value_view();\r\n\r\naccount init_value(42, 16'000);\r\naccounts.put(nullptr, {42}, init_value);\r\n\r\nauto tx = client.get_transactions().begin();\r\n\r\nstd::optional res_account = accounts.get(&tx, {42});\r\nres_account->balance += 500;\r\naccounts.put(&tx, {42}, res_account);\r\n\r\nassert(accounts.get(&tx, {42})->balance == 16'500);\r\n\r\ntx.rollback();\r\n\r\nassert(accounts.get(&tx, {42})->balance == 16'000);\n"})})})}),"\n",(0,s.jsx)(n.h2,{id:"table-api",children:"Table API"}),"\n",(0,s.jsx)(n.p,{children:"To execute table operations on a specific table, you need to get a specific view of the table and use one of its methods. You can only create new tables by using SQL API."}),"\n",(0,s.jsx)(n.p,{children:"When working with tables, you can use built-in Tuple type, which is a set of key-value pairs underneath, or map the data to your own types for a strongly-typed access. Here is how you can work with tables:"}),"\n",(0,s.jsx)(n.h3,{id:"getting-a-table-instance",children:"Getting a Table Instance"}),"\n",(0,s.jsxs)(n.p,{children:["First, get an instance of the table. To obtain an instance of table, use the ",(0,s.jsx)(n.code,{children:"IgniteTables.table(String)"})," method. You can also use ",(0,s.jsx)(n.code,{children:"IgniteTables.tables()"})," method to list all existing tables."]}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nauto table_api = client.get_tables();\r\nstd::vector
                                                              existing_tables = table_api.get_tables();\r\ntable first_table = existing_tables.front();\r\n\r\nstd::optional
                                                              my_table = table_api.get_table("MY_TABLE");\n'})})})}),"\n",(0,s.jsx)(n.h3,{id:"basic-table-operations",children:"Basic Table Operations"}),"\n",(0,s.jsx)(n.p,{children:"Once you've got a table you need to get a specific view to choose how you want to operate table records."}),"\n",(0,s.jsx)(n.h4,{id:"binary-record-view",children:"Binary Record View"}),"\n",(0,s.jsx)(n.p,{children:"A binary record view. It can be used to operate table tuples directly."}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'record_view view = table.get_record_binary_view();\r\n\r\nignite_tuple record{\r\n {"id", 42},\r\n {"name", "John Doe"}\r\n};\r\n\r\nview.upsert(nullptr, record);\r\nstd::optional res_record = view.get(nullptr, {"id", 42});\r\n\r\nassert(res_record.has_value());\r\nassert(res_record->column_count() == 2);\r\nassert(res_record->get("id") == 42);\r\nassert(res_record->get("name") == "John Doe");\n'})})})}),"\n",(0,s.jsx)(n.h4,{id:"record-view",children:"Record View"}),"\n",(0,s.jsx)(n.p,{children:"A record view mapped to a user type. It can be used to operate table using user objects which are mapped to table tuples."}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'record_view view = table.get_record_view();\r\n\r\nperson record(42, "John Doe");\r\n\r\nview.upsert(nullptr, record);\r\nstd::optional res_record = view.get(nullptr, person{42});\r\n\r\nassert(res.has_value());\r\nassert(res->id == 42);\r\nassert(res->name == "John Doe");\n'})})})}),"\n",(0,s.jsx)(n.h4,{id:"key-value-binary-view",children:"Key-Value Binary View"}),"\n",(0,s.jsx)(n.p,{children:"A binary key-value view. It can be used to operate table using key and value tuples separately."}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'key_value_view kv_view = table.get_key_value_binary_view();\r\n\r\nignite_tuple key_tuple{{"id", 42}};\r\nignite_tuple val_tuple{{"name", "John Doe"}};\r\n\r\nkv_view.put(nullptr, key_tuple, val_tuple);\r\nstd::optional res_tuple = kv_view.get(nullptr, key_tuple);\r\n\r\nassert(res_tuple.has_value());\r\nassert(res_tuple->column_count() == 2);\r\nassert(res_tuple->get("id") == 42);\r\nassert(res_tuple->get("name") == "John Doe");\n'})})})}),"\n",(0,s.jsx)(n.h4,{id:"key-value-view",children:"Key-Value View"}),"\n",(0,s.jsx)(n.p,{children:"A key-value view with user objects. It can be used to operate table using key and value user objects mapped to table tuples."}),"\n",(0,s.jsx)(a.A,{groupId:"programming-languages",children:(0,s.jsx)(l.A,{value:"C++",label:"C++",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'key_value_view kv_view = table.get_key_value_view();\r\n\r\nkv_view.put(nullptr, {42}, {"John Doe"});\r\nstd::optional res = kv_view.get(nullptr, {42});\r\n\r\nassert(res.has_value());\r\nassert(res->id == 42);\r\nassert(res->name == "John Doe");\n'})})})})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/8e496006.2170c59f.js b/docs/ignite3/assets/js/8e496006.2170c59f.js deleted file mode 100644 index 9f3394748e..0000000000 --- a/docs/ignite3/assets/js/8e496006.2170c59f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1175],{28453:(n,e,r)=>{r.d(e,{R:()=>a,x:()=>o});var i=r(96540);const t={},s=i.createContext(t);function a(n){const e=i.useContext(s);return i.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(t):n.components||t:a(n.components),i.createElement(s.Provider,{value:e},n.children)}},88127:(n,e,r)=>{r.r(e),r.d(e,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"understand/core-concepts/transactions-and-mvcc","title":"Transactions and MVCC","description":"Ignite 3 provides ACID transactions using Multi-Version Concurrency Control (MVCC) combined with Two-Phase Locking (2PL). All tables are transactional by default with serializable isolation.","source":"@site/docs/understand/core-concepts/transactions-and-mvcc.md","sourceDirName":"understand/core-concepts","slug":"/understand/core-concepts/transactions-and-mvcc","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"id":"transactions-and-mvcc","title":"Transactions and MVCC","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Tables and Schemas","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas"},"next":{"title":"Distribution and Colocation","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation"}}');var t=r(74848),s=r(28453);const a={id:"transactions-and-mvcc",title:"Transactions and MVCC",sidebar_position:3},o=void 0,l={},c=[{value:"Transaction Model Overview",id:"transaction-model-overview",level:2},{value:"Multi-Version Concurrency Control",id:"multi-version-concurrency-control",level:2},{value:"Version Chains",id:"version-chains",level:3},{value:"Write Intents",id:"write-intents",level:3},{value:"Visibility Rules",id:"visibility-rules",level:3},{value:"Hybrid Timestamps",id:"hybrid-timestamps",level:2},{value:"Transaction Isolation",id:"transaction-isolation",level:2},{value:"Read-Write Transactions",id:"read-write-transactions",level:3},{value:"Read-Only Transactions",id:"read-only-transactions",level:3},{value:"Deadlock Prevention",id:"deadlock-prevention",level:2},{value:"Transaction Lifecycle",id:"transaction-lifecycle",level:2},{value:"Read-Write Transaction Flow",id:"read-write-transaction-flow",level:3},{value:"Two-Phase Commit Protocol",id:"two-phase-commit-protocol",level:3},{value:"Transaction Coordinator",id:"transaction-coordinator",level:3},{value:"Version Garbage Collection",id:"version-garbage-collection",level:2},{value:"Transaction Options",id:"transaction-options",level:2},{value:"Design Constraints",id:"design-constraints",level:2},{value:"Related Topics",id:"related-topics",level:2}];function d(n){const e={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...n.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(e.p,{children:"Ignite 3 provides ACID transactions using Multi-Version Concurrency Control (MVCC) combined with Two-Phase Locking (2PL). All tables are transactional by default with serializable isolation."}),"\n",(0,t.jsx)(e.h2,{id:"transaction-model-overview",children:"Transaction Model Overview"}),"\n",(0,t.jsx)(e.mermaid,{value:'flowchart TB\r\n subgraph "Transaction Types"\r\n RW["Read-Write Transaction
                                                              Acquires locks
                                                              Creates write intents
                                                              Serializable isolation"]\r\n RO["Read-Only Transaction
                                                              No locks
                                                              Snapshot isolation
                                                              Point-in-time reads"]\r\n end\r\n\r\n subgraph "Concurrency Control"\r\n MVCC["MVCC
                                                              Version chains
                                                              Timestamp ordering"]\r\n Locks["2PL
                                                              Lock acquisition
                                                              WAIT_DIE deadlock prevention"]\r\n end\r\n\r\n RW --\x3e Locks\r\n RW --\x3e MVCC\r\n RO --\x3e MVCC'}),"\n",(0,t.jsx)(e.p,{children:"Key characteristics:"}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsx)(e.li,{children:"All transactions are serializable for read-write operations"}),"\n",(0,t.jsx)(e.li,{children:"Read-only transactions use snapshot isolation without locking"}),"\n",(0,t.jsx)(e.li,{children:"WAIT_DIE algorithm prevents deadlocks"}),"\n",(0,t.jsx)(e.li,{children:"Two-phase commit (2PC) coordinates distributed transactions"}),"\n"]}),"\n",(0,t.jsx)(e.h2,{id:"multi-version-concurrency-control",children:"Multi-Version Concurrency Control"}),"\n",(0,t.jsx)(e.p,{children:"MVCC maintains multiple versions of each row, allowing concurrent readers and writers without blocking."}),"\n",(0,t.jsx)(e.h3,{id:"version-chains",children:"Version Chains"}),"\n",(0,t.jsx)(e.p,{children:"Each row has a version chain storing all versions from newest to oldest:"}),"\n",(0,t.jsx)(e.mermaid,{value:'flowchart LR\r\n subgraph "Version Chain for Key 42"\r\n V3["Version 3
                                                              ts: 1000
                                                              value: 300"]\r\n V2["Version 2
                                                              ts: 800
                                                              value: 200"]\r\n V1["Version 1
                                                              ts: 500
                                                              value: 100"]\r\n end\r\n\r\n Head([Head]) --\x3e V3\r\n V3 --\x3e V2\r\n V2 --\x3e V1\r\n V1 --\x3e Null([null])'}),"\n",(0,t.jsx)(e.p,{children:"Each version contains:"}),"\n",(0,t.jsxs)(e.table,{children:[(0,t.jsx)(e.thead,{children:(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.th,{children:"Field"}),(0,t.jsx)(e.th,{children:"Description"})]})}),(0,t.jsxs)(e.tbody,{children:[(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"Timestamp"}),(0,t.jsx)(e.td,{children:"Hybrid timestamp when committed (null if uncommitted)"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"Transaction ID"}),(0,t.jsx)(e.td,{children:"ID of owning transaction (for uncommitted versions)"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"Value"}),(0,t.jsx)(e.td,{children:"Binary row data (empty for tombstones/deletions)"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"Next link"}),(0,t.jsx)(e.td,{children:"Pointer to previous version"})]})]})]}),"\n",(0,t.jsx)(e.h3,{id:"write-intents",children:"Write Intents"}),"\n",(0,t.jsx)(e.p,{children:"Uncommitted changes are stored as write intents at the head of the version chain:"}),"\n",(0,t.jsx)(e.mermaid,{value:'flowchart LR\r\n subgraph "Version Chain with Write Intent"\r\n WI["Write Intent
                                                              txId: tx-123
                                                              value: 350"]\r\n V3["Committed
                                                              ts: 1000
                                                              value: 300"]\r\n V2["Committed
                                                              ts: 800
                                                              value: 200"]\r\n end\r\n\r\n Head([Head]) --\x3e WI\r\n WI --\x3e|"uncommitted"| V3\r\n V3 --\x3e V2'}),"\n",(0,t.jsx)(e.p,{children:"Write intents track:"}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsx)(e.li,{children:"Transaction ID of the writer"}),"\n",(0,t.jsx)(e.li,{children:"Commit partition ID for transaction state lookup"}),"\n",(0,t.jsx)(e.li,{children:"The uncommitted value"}),"\n"]}),"\n",(0,t.jsx)(e.p,{children:"On commit, the write intent receives a timestamp and becomes a regular committed version. On abort, the write intent is removed."}),"\n",(0,t.jsx)(e.h3,{id:"visibility-rules",children:"Visibility Rules"}),"\n",(0,t.jsx)(e.p,{children:"When reading a row, transactions see different versions based on their type and timestamp:"}),"\n",(0,t.jsxs)(e.table,{children:[(0,t.jsx)(e.thead,{children:(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.th,{children:"Scenario"}),(0,t.jsx)(e.th,{children:"Read-Write Transaction"}),(0,t.jsx)(e.th,{children:"Read-Only Transaction"})]})}),(0,t.jsxs)(e.tbody,{children:[(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"Only write intent exists"}),(0,t.jsx)(e.td,{children:"Sees write intent (if own tx)"}),(0,t.jsx)(e.td,{children:"Blocks or sees nothing"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"Write intent + older commit"}),(0,t.jsx)(e.td,{children:"Sees write intent (if own tx) or waits"}),(0,t.jsx)(e.td,{children:"Sees older commit"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"Committed version newer than read timestamp"}),(0,t.jsx)(e.td,{children:"Sees it"}),(0,t.jsx)(e.td,{children:"Sees older version"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"All commits older than read timestamp"}),(0,t.jsx)(e.td,{children:"Sees newest"}),(0,t.jsx)(e.td,{children:"Sees version at timestamp"})]})]})]}),"\n",(0,t.jsx)(e.p,{children:"Read-only transactions always read at their creation timestamp, providing a consistent snapshot."}),"\n",(0,t.jsx)(e.h2,{id:"hybrid-timestamps",children:"Hybrid Timestamps"}),"\n",(0,t.jsx)(e.p,{children:"Ignite uses hybrid logical clocks combining physical time with logical counters:"}),"\n",(0,t.jsx)(e.mermaid,{value:'flowchart LR\r\n subgraph "Hybrid Timestamp (64 bits)"\r\n P["Physical Time
                                                              48 bits
                                                              milliseconds since epoch"]\r\n L["Logical Counter
                                                              16 bits
                                                              event ordering"]\r\n end\r\n\r\n P --- L'}),"\n",(0,t.jsx)(e.p,{children:"Hybrid timestamps provide:"}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"Causality"}),": Events on the same node are ordered correctly"]}),"\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"Approximate wall-clock"}),": Physical component enables time-based queries"]}),"\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"Coordination-free generation"}),": Nodes generate timestamps locally"]}),"\n"]}),"\n",(0,t.jsx)(e.p,{children:"The epoch starts at January 1, 2021. The logical counter ensures ordering when multiple events occur within the same millisecond."}),"\n",(0,t.jsx)(e.h2,{id:"transaction-isolation",children:"Transaction Isolation"}),"\n",(0,t.jsx)(e.h3,{id:"read-write-transactions",children:"Read-Write Transactions"}),"\n",(0,t.jsx)(e.p,{children:"Read-write transactions use serializable isolation through Two-Phase Locking:"}),"\n",(0,t.jsxs)(e.ol,{children:["\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"Growing phase"}),": Acquire locks before accessing data"]}),"\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"Shrinking phase"}),": Release all locks at commit/abort"]}),"\n"]}),"\n",(0,t.jsx)(e.mermaid,{value:"sequenceDiagram\r\n participant TX as Transaction\r\n participant LM as Lock Manager\r\n participant ST as Storage\r\n\r\n TX->>LM: Acquire lock (key 42)\r\n LM--\x3e>TX: Lock granted\r\n TX->>ST: Read key 42\r\n ST--\x3e>TX: Value\r\n TX->>ST: Write key 42\r\n TX->>TX: Commit\r\n TX->>LM: Release all locks"}),"\n",(0,t.jsx)(e.p,{children:"Lock modes form a compatibility matrix:"}),"\n",(0,t.jsxs)(e.table,{children:[(0,t.jsx)(e.thead,{children:(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.th,{children:"Lock"}),(0,t.jsx)(e.th,{children:"IS"}),(0,t.jsx)(e.th,{children:"IX"}),(0,t.jsx)(e.th,{children:"S"}),(0,t.jsx)(e.th,{children:"SIX"}),(0,t.jsx)(e.th,{children:"X"})]})}),(0,t.jsxs)(e.tbody,{children:[(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:(0,t.jsx)(e.strong,{children:"IS"})}),(0,t.jsx)(e.td,{children:"Yes"}),(0,t.jsx)(e.td,{children:"Yes"}),(0,t.jsx)(e.td,{children:"Yes"}),(0,t.jsx)(e.td,{children:"Yes"}),(0,t.jsx)(e.td,{children:"No"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:(0,t.jsx)(e.strong,{children:"IX"})}),(0,t.jsx)(e.td,{children:"Yes"}),(0,t.jsx)(e.td,{children:"Yes"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:(0,t.jsx)(e.strong,{children:"S"})}),(0,t.jsx)(e.td,{children:"Yes"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"Yes"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:(0,t.jsx)(e.strong,{children:"SIX"})}),(0,t.jsx)(e.td,{children:"Yes"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:(0,t.jsx)(e.strong,{children:"X"})}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"}),(0,t.jsx)(e.td,{children:"No"})]})]})]}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"IS"})," (Intention Shared): Intent to read descendants"]}),"\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"IX"})," (Intention Exclusive): Intent to write descendants"]}),"\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"S"})," (Shared): Read lock"]}),"\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"SIX"})," (Shared Intention Exclusive): Read lock with intent to write descendants"]}),"\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.strong,{children:"X"})," (Exclusive): Write lock"]}),"\n"]}),"\n",(0,t.jsx)(e.h3,{id:"read-only-transactions",children:"Read-Only Transactions"}),"\n",(0,t.jsx)(e.p,{children:"Read-only transactions bypass locking entirely:"}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsx)(e.li,{children:"Fixed read timestamp assigned at creation"}),"\n",(0,t.jsx)(e.li,{children:"Read from any replica (not just primary)"}),"\n",(0,t.jsx)(e.li,{children:"No partition enlistment or coordination"}),"\n",(0,t.jsx)(e.li,{children:"Cannot modify data"}),"\n"]}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-java",children:"var tx = client.transactions().begin(\r\n new TransactionOptions().readOnly(true)\r\n);\r\n\r\n// Reads see consistent snapshot at transaction start time\r\nAccount account = accounts.get(tx, 42);\r\n\r\ntx.commit(); // No-op for read-only\n"})}),"\n",(0,t.jsx)(e.h2,{id:"deadlock-prevention",children:"Deadlock Prevention"}),"\n",(0,t.jsx)(e.p,{children:"Ignite uses the WAIT_DIE algorithm to prevent deadlocks without detection cycles:"}),"\n",(0,t.jsx)(e.mermaid,{value:'flowchart TB\r\n subgraph "WAIT_DIE Decision"\r\n Check{Requesting TX
                                                              older than holder?}\r\n Wait[Wait for lock]\r\n Die[Abort and retry]\r\n end\r\n\r\n Check --\x3e|Yes| Wait\r\n Check --\x3e|No| Die'}),"\n",(0,t.jsx)(e.p,{children:"When a transaction requests a lock held by another:"}),"\n",(0,t.jsxs)(e.table,{children:[(0,t.jsx)(e.thead,{children:(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.th,{children:"Requester Age"}),(0,t.jsx)(e.th,{children:"Action"})]})}),(0,t.jsxs)(e.tbody,{children:[(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"Older than holder"}),(0,t.jsx)(e.td,{children:"Wait for lock release"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"Younger than holder"}),(0,t.jsx)(e.td,{children:"Abort immediately, retry with same timestamp"})]})]})]}),"\n",(0,t.jsx)(e.p,{children:"This prevents circular waits because younger transactions always yield to older ones. Retrying with the same timestamp ensures the transaction eventually becomes the oldest and succeeds."}),"\n",(0,t.jsx)(e.h2,{id:"transaction-lifecycle",children:"Transaction Lifecycle"}),"\n",(0,t.jsx)(e.h3,{id:"read-write-transaction-flow",children:"Read-Write Transaction Flow"}),"\n",(0,t.jsx)(e.mermaid,{value:"stateDiagram-v2\r\n [*] --\x3e PENDING: begin()\r\n PENDING --\x3e PENDING: read/write operations\r\n PENDING --\x3e FINISHING: commit()/rollback()\r\n FINISHING --\x3e COMMITTED: 2PC success\r\n FINISHING --\x3e ABORTED: 2PC failure or rollback\r\n PENDING --\x3e ABORTED: conflict/timeout\r\n COMMITTED --\x3e [*]\r\n ABORTED --\x3e [*]"}),"\n",(0,t.jsx)(e.p,{children:"State descriptions:"}),"\n",(0,t.jsxs)(e.table,{children:[(0,t.jsx)(e.thead,{children:(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.th,{children:"State"}),(0,t.jsx)(e.th,{children:"Description"})]})}),(0,t.jsxs)(e.tbody,{children:[(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"PENDING"}),(0,t.jsx)(e.td,{children:"Active transaction, operations in progress"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"FINISHING"}),(0,t.jsx)(e.td,{children:"Coordinator initiated commit/rollback"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"COMMITTED"}),(0,t.jsx)(e.td,{children:"Successfully committed, changes visible"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"ABORTED"}),(0,t.jsx)(e.td,{children:"Rolled back, changes discarded"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:"ABANDONED"}),(0,t.jsx)(e.td,{children:"Coordinator lost, awaiting recovery"})]})]})]}),"\n",(0,t.jsx)(e.h3,{id:"two-phase-commit-protocol",children:"Two-Phase Commit Protocol"}),"\n",(0,t.jsx)(e.p,{children:"Distributed transactions use 2PC for atomic commitment:"}),"\n",(0,t.jsx)(e.mermaid,{value:"sequenceDiagram\r\n participant C as Coordinator\r\n participant P1 as Partition 1\r\n participant P2 as Partition 2\r\n\r\n Note over C: Phase 1: Prepare\r\n C->>P1: Prepare (write intents)\r\n C->>P2: Prepare (write intents)\r\n P1--\x3e>C: Prepared\r\n P2--\x3e>C: Prepared\r\n\r\n Note over C: Phase 2: Commit\r\n C->>P1: Commit (apply timestamp)\r\n C->>P2: Commit (apply timestamp)\r\n P1--\x3e>C: Committed\r\n P2--\x3e>C: Committed\r\n\r\n Note over C: Cleanup\r\n C->>P1: Release locks\r\n C->>P2: Release locks"}),"\n",(0,t.jsx)(e.p,{children:"If any partition fails to prepare, the coordinator aborts all participants."}),"\n",(0,t.jsx)(e.h3,{id:"transaction-coordinator",children:"Transaction Coordinator"}),"\n",(0,t.jsx)(e.p,{children:"The node that begins the transaction becomes its coordinator, responsible for:"}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsx)(e.li,{children:"Tracking enlisted partitions"}),"\n",(0,t.jsx)(e.li,{children:"Assigning a commit partition for state storage"}),"\n",(0,t.jsx)(e.li,{children:"Orchestrating 2PC protocol"}),"\n",(0,t.jsx)(e.li,{children:"Handling failures and timeouts"}),"\n"]}),"\n",(0,t.jsx)(e.p,{children:"If the coordinator fails:"}),"\n",(0,t.jsxs)(e.ol,{children:["\n",(0,t.jsx)(e.li,{children:"Transaction enters ABANDONED state"}),"\n",(0,t.jsx)(e.li,{children:"Orphan detection triggers after timeout"}),"\n",(0,t.jsx)(e.li,{children:"Write intents are resolved based on commit partition state"}),"\n",(0,t.jsx)(e.li,{children:"Locks are released"}),"\n"]}),"\n",(0,t.jsx)(e.h2,{id:"version-garbage-collection",children:"Version Garbage Collection"}),"\n",(0,t.jsx)(e.p,{children:"Old versions accumulate in version chains. The garbage collector removes versions older than the low watermark:"}),"\n",(0,t.jsx)(e.mermaid,{value:'flowchart LR\r\n subgraph "Before GC"\r\n V4["ts: 1200"]\r\n V3["ts: 1000"]\r\n V2["ts: 800"]\r\n V1["ts: 500"]\r\n end\r\n\r\n subgraph "After GC (watermark: 900)"\r\n V4a["ts: 1200"]\r\n V3a["ts: 1000"]\r\n end\r\n\r\n V4 --\x3e V3 --\x3e V2 --\x3e V1\r\n V4a --\x3e V3a'}),"\n",(0,t.jsx)(e.p,{children:"Low watermark considerations:"}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsx)(e.li,{children:"Default: 600,000 ms (10 minutes)"}),"\n",(0,t.jsx)(e.li,{children:"Increasing allows longer-running read-only transactions"}),"\n",(0,t.jsx)(e.li,{children:"Higher values require more storage for old versions"}),"\n",(0,t.jsx)(e.li,{children:"Active transactions prevent GC of versions they might need"}),"\n"]}),"\n",(0,t.jsx)(e.h2,{id:"transaction-options",children:"Transaction Options"}),"\n",(0,t.jsx)(e.p,{children:"Configure transactions at creation:"}),"\n",(0,t.jsx)(e.pre,{children:(0,t.jsx)(e.code,{className:"language-java",children:"// Read-write with timeout\r\nvar rwTx = client.transactions().begin(\r\n new TransactionOptions()\r\n .timeoutMillis(30000) // 30 second timeout\r\n);\r\n\r\n// Read-only\r\nvar roTx = client.transactions().begin(\r\n new TransactionOptions()\r\n .readOnly(true)\r\n);\n"})}),"\n",(0,t.jsxs)(e.table,{children:[(0,t.jsx)(e.thead,{children:(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.th,{children:"Option"}),(0,t.jsx)(e.th,{children:"Default"}),(0,t.jsx)(e.th,{children:"Description"})]})}),(0,t.jsxs)(e.tbody,{children:[(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:(0,t.jsx)(e.code,{children:"readOnly"})}),(0,t.jsx)(e.td,{children:"false"}),(0,t.jsx)(e.td,{children:"Enable read-only mode"})]}),(0,t.jsxs)(e.tr,{children:[(0,t.jsx)(e.td,{children:(0,t.jsx)(e.code,{children:"timeoutMillis"})}),(0,t.jsx)(e.td,{children:"0 (none)"}),(0,t.jsx)(e.td,{children:"Auto-rollback after timeout"})]})]})]}),"\n",(0,t.jsx)(e.h2,{id:"design-constraints",children:"Design Constraints"}),"\n",(0,t.jsxs)(e.ol,{children:["\n",(0,t.jsxs)(e.li,{children:["\n",(0,t.jsxs)(e.p,{children:[(0,t.jsx)(e.strong,{children:"Primary replica writes"}),": All read-write operations go through the partition's primary replica"]}),"\n"]}),"\n",(0,t.jsxs)(e.li,{children:["\n",(0,t.jsxs)(e.p,{children:[(0,t.jsx)(e.strong,{children:"Lock granularity"}),": Locks are per-key, not per-row or per-table"]}),"\n"]}),"\n",(0,t.jsxs)(e.li,{children:["\n",(0,t.jsxs)(e.p,{children:[(0,t.jsx)(e.strong,{children:"No savepoints"}),": Partial rollback within a transaction is not supported"]}),"\n"]}),"\n",(0,t.jsxs)(e.li,{children:["\n",(0,t.jsxs)(e.p,{children:[(0,t.jsx)(e.strong,{children:"Clock synchronization"}),": Nodes must have synchronized clocks (within ",(0,t.jsx)(e.code,{children:"schemaSync.maxClockSkewMillis"}),")"]}),"\n"]}),"\n",(0,t.jsxs)(e.li,{children:["\n",(0,t.jsxs)(e.p,{children:[(0,t.jsx)(e.strong,{children:"Single commit partition"}),": Each transaction uses one partition for state, creating a coordination point"]}),"\n"]}),"\n",(0,t.jsxs)(e.li,{children:["\n",(0,t.jsxs)(e.p,{children:[(0,t.jsx)(e.strong,{children:"Write intent resolution"}),": Encountering another transaction's write intent may require waiting or aborting"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(e.h2,{id:"related-topics",children:"Related Topics"}),"\n",(0,t.jsxs)(e.ul,{children:["\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.a,{href:"/3.1.0/develop/work-with-data/transactions",children:"Performing Transactions"})," for API usage"]}),"\n",(0,t.jsxs)(e.li,{children:[(0,t.jsx)(e.a,{href:"/3.1.0/understand/core-concepts/data-partitioning",children:"Data Partitioning"})," for version storage details"]}),"\n"]})]})}function h(n={}){const{wrapper:e}={...(0,s.R)(),...n.components};return e?(0,t.jsx)(e,{...n,children:(0,t.jsx)(d,{...n})}):d(n)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/8f944727.ca012add.js b/docs/ignite3/assets/js/8f944727.ca012add.js deleted file mode 100644 index ff500b4c1b..0000000000 --- a/docs/ignite3/assets/js/8f944727.ca012add.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3164],{5119:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"configure-and-operate/configuration/config-ssl-tls","title":"SSL/TLS","description":"This page explains how to configure SSL/TLS encryption between the cluster nodes (server and client) and the clients that connect to your cluster.","source":"@site/docs/configure-and-operate/configuration/ssl-tls.md","sourceDirName":"configure-and-operate/configuration","slug":"/configure-and-operate/configuration/config-ssl-tls","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"config-ssl-tls","title":"SSL/TLS","sidebar_label":"SSL/TLS"},"sidebar":"tutorialSidebar","previous":{"title":"Authentication","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication"},"next":{"title":"Metrics","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration"}}');var i=t(74848),o=t(28453);const s={id:"config-ssl-tls",title:"SSL/TLS",sidebar_label:"SSL/TLS"},a=void 0,c={},l=[{value:"Considerations",id:"considerations",level:2},{value:"REST",id:"rest",level:2},{value:"Clients and JDBC",id:"clients-and-jdbc",level:2},{value:"Server-side Configuration",id:"server-side-configuration",level:3},{value:"Client Configuration",id:"client-configuration",level:2},{value:"Java",id:"java",level:3},{value:".NET",id:"net",level:3},{value:"CLI",id:"cli",level:3},{value:"Network Configuration",id:"network-configuration",level:2},{value:"SSL Client Authentication (mTLS Support)",id:"ssl-client-authentication-mtls-support",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"This page explains how to configure SSL/TLS encryption between the cluster nodes (server and client) and the clients that connect to your cluster."}),"\n",(0,i.jsx)(n.h2,{id:"considerations",children:"Considerations"}),"\n",(0,i.jsx)(n.p,{children:"All internal connections in the cluster context, as well as cluster's user interaction interfaces, are SSL-enabled. The communication categories are as follows:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Between the user and the cluster (node): REST"}),"\n",(0,i.jsx)(n.li,{children:"Between the user and the platform clients"}),"\n",(0,i.jsx)(n.li,{children:"Between nodes: Network (Messaging, Scalecube)"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"All SSL configurations activities are performed at the node level."}),"\n",(0,i.jsx)(n.p,{children:"Apache Ignite does not support direct paths to SSL certificates. Instead, it utilizes PKCS12 and JKS keystore."}),"\n",(0,i.jsx)(n.h2,{id:"rest",children:"REST"}),"\n",(0,i.jsx)(n.p,{children:"The standard implementation of SSL for REST involves configuring a secure connection on a separate port. Apache Ignite supports HTTP and HTTPS, each on its own port."}),"\n",(0,i.jsx)(n.p,{children:"The Apache Ignite 3 REST security configuration in the JSON format is provided below."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "rest" : {\r\n "dualProtocol" : false,\r\n "httpToHttpsRedirection" : false,\r\n "port" : 10300,\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "require",\r\n "enabled" : true,\r\n "keyStore" : {\r\n "password" : "may be empty",\r\n "path" : "must not be empty",\r\n "type" : "PKCS12"\r\n },\r\n "port" : 10400,\r\n "trustStore" : {\r\n "password" : "may be empty",\r\n "path" : "must not be empty",\r\n "type" : "PKCS12"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"clients-and-jdbc",children:"Clients and JDBC"}),"\n",(0,i.jsxs)(n.p,{children:["Apache Ignite 3 Client implementation is based on the Netty framework, which supports configuration for security connections via ",(0,i.jsx)(n.code,{children:"SSLContextBuilder"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"server-side-configuration",children:"Server-side Configuration"}),"\n",(0,i.jsx)(n.p,{children:"The default way to configure SSL on the server side is to update the configuration with SSL properties. The example below is in the JSON format."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "clientConnector" : {\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "require",\r\n "enabled" : true,\r\n "keyStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n },\r\n "trustStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["If you have enabled SSL for ",(0,i.jsx)(n.code,{children:"clientConnector"}),", and want to use JDBC, set the corresponding properties in your code:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'var url =\r\n "jdbc:ignite:thin://{address}:{port}"\r\n + "?sslEnabled=true"\r\n + "&trustStorePath=" + trustStorePath\r\n + "&trustStoreType=JKS"\r\n + "&trustStorePassword=" + password\r\n + "&clientAuth=require"\r\n + "&keyStorePath=" + keyStorePath\r\n + "&keyStoreType=PKCS12"\r\n + "&keyStorePassword=" + password;\r\n try (Connection conn = DriverManager.getConnection(url)) {\r\n // Other actions.\r\n }\n'})}),"\n",(0,i.jsx)(n.h2,{id:"client-configuration",children:"Client Configuration"}),"\n",(0,i.jsx)(n.h3,{id:"java",children:"Java"}),"\n",(0,i.jsxs)(n.p,{children:["To enable SSL in your Java clients, use the ",(0,i.jsx)(n.code,{children:"IgniteClient"})," class and pass the ssl configuration to it:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'var sslConfiguration = SslConfiguration.builder()\r\n .enabled(true)\r\n .ciphers("TLS_AES_256_GCM_SHA384")\r\n .trustStorePath(trustStorePath)\r\n .trustStorePassword(password)\r\n .keyStorePath(keyStorePath)\r\n .keyStorePassword(password)\r\n .build();\r\n\r\ntry (IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .ssl(sslConfiguration)\r\n .build();\r\n)\n'})}),"\n",(0,i.jsx)(n.h3,{id:"net",children:".NET"}),"\n",(0,i.jsxs)(n.p,{children:["Add the ",(0,i.jsx)(n.code,{children:"IgniteClientConfiguration.SslStreamFactory"})," property of type ",(0,i.jsx)(n.code,{children:"ISslStreamFactory"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Provide a ",(0,i.jsx)(n.a,{href:"https://github.com/apache/ignite/blob/66f43a4bee163aadb3ad731f6eb9a6dfde9faa73/modules/platforms/dotnet/Apache.Ignite.Core/Client/SslStreamFactory.cs",children:"predefined implementation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Use the base class library ",(0,i.jsx)(n.code,{children:"SslStream"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Basic usage without client authorization:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var cfg = new IgniteClientConfiguration { SslStreamFactory = new() }\n"})}),"\n",(0,i.jsx)(n.h3,{id:"cli",children:"CLI"}),"\n",(0,i.jsxs)(n.p,{children:["To SSL on the CLI side, use the ",(0,i.jsx)(n.code,{children:"cli config set"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"cli config set cli.trust-store.type=\r\ncli config set cli.trust-store.path=\r\ncli config set cli.trust-store.password=\n"})}),"\n",(0,i.jsx)(n.p,{children:"Store the CLI security configuration in a separate file with permission settings that protect it from unauthorized read/write operations. This configuration file must match profiles from the common configuration file."}),"\n",(0,i.jsx)(n.h2,{id:"network-configuration",children:"Network Configuration"}),"\n",(0,i.jsx)(n.p,{children:"The node network is based on the Netty framework. The configuration is the same as described for the Apache Ignite Client part except for the part that addresses the Apache Ignite 3 configuration."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "network" : {\r\n "ssl" : {\r\n "ciphers" : "",\r\n "enabled" : true,\r\n "keyStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n },\r\n "trustStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"ssl-client-authentication-mtls-support",children:"SSL Client Authentication (mTLS Support)"}),"\n",(0,i.jsx)(n.p,{children:"Optionally, the connections you utilize can support the client authentication feature. Configure it separately for each connection on the server side."}),"\n",(0,i.jsx)(n.p,{children:"Two-way authentication requires that both server and client have certificates they reciprocally trust. The client generates a private key, stores it in its keystore, and gets it signed by an entity the server's truststore trusts."}),"\n",(0,i.jsxs)(n.p,{children:["To support client authentication, a connection must include the ",(0,i.jsx)(n.code,{children:"clientAuth"}),", ",(0,i.jsx)(n.code,{children:"trustStore"})," and ",(0,i.jsx)(n.code,{children:"keyStore"})," properties. Here is an example of a possible client configuration. The example below is in the JSON format."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "clientConnector" : {\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "require",\r\n "enabled" : true,\r\n "keyStore" : {\r\n "type" : "PKCS12",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n },\r\n "trustStore" : {\r\n "type" : "JKS",\r\n "path" : "must not be empty",\r\n "password" : "may be empty"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/8f9fabaf.37d12b3b.js b/docs/ignite3/assets/js/8f9fabaf.37d12b3b.js deleted file mode 100644 index 5659e07954..0000000000 --- a/docs/ignite3/assets/js/8f9fabaf.37d12b3b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5448],{28453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>l});var i=t(96540);const n={},d=i.createContext(n);function r(e){const s=i.useContext(d);return i.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(d.Provider,{value:s},e.children)}},68524:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>c,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"developers-guide/sql/system-views","title":"System Views","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/sql/system-views.md","sourceDirName":"developers-guide/sql","slug":"/developers-guide/sql/system-views","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/system-views","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"System Views","sidebar_label":"System Views"},"sidebar":"tutorialSidebar","previous":{"title":"JDBC Driver","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver"},"next":{"title":"ODBC Driver","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver"}}');var n=t(74848),d=t(28453);const r={title:"System Views",sidebar_label:"System Views"},l=void 0,c={},h=[{value:"Getting Data",id:"getting-data",level:2},{value:"Available Views",id:"available-views",level:2},{value:"SYSTEM_VIEWS",id:"system_views",level:3},{value:"SYSTEM_VIEW_COLUMNS",id:"system_view_columns",level:3},{value:"SYSTEM.ZONES",id:"systemzones",level:3}];function a(e){const s={a:"a",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:["\n",(0,n.jsx)(s.p,{children:"Ignite provides a number of built-in SQL views that provide information on the cluster's state and provide real-time insight into the status of its components. These views are available in the SYSTEM schema."}),"\n",(0,n.jsx)(s.h2,{id:"getting-data",children:"Getting Data"}),"\n",(0,n.jsx)(s.p,{children:"You access system views in Ignite by using SQL and selecting data from the system view like you would from any other table. For example, you can get a list of all available system views in the following way:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sql",children:"SELECT id, schema, name FROM system.system_views WHERE type = 'NODE'\n"})}),"\n",(0,n.jsxs)(s.p,{children:["You can also use joins to combine data from multiple views. The example below returns all columns of a view that was found in the ",(0,n.jsx)(s.code,{children:"SYSTEM_VIEWS"})," view:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sql",children:"SELECT svc.*\r\n FROM system.system_view_columns svc\r\n JOIN system.system_views sv ON svc.view_id = sv.id\r\n WHERE sv.name = 'SYSTEM_VIEWS'\n"})}),"\n",(0,n.jsx)(s.h2,{id:"available-views",children:"Available Views"}),"\n",(0,n.jsx)(s.h3,{id:"system_views",children:"SYSTEM_VIEWS"}),"\n",(0,n.jsx)(s.p,{children:"Describes available system views."}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Column"}),(0,n.jsx)(s.th,{children:"Data Type"}),(0,n.jsx)(s.th,{children:"Description"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"ID"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"System view ID."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"SCHEMA"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsxs)(s.td,{children:["Name of the schema used. Default is ",(0,n.jsx)(s.code,{children:"SYSTEM"}),"."]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"NAME"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"System view name."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"TYPE"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsxs)(s.td,{children:["System view type. Possible values:",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),"* NODE - The view provides node-specific information. Data will be collected from all nodes, and represented in the view.",(0,n.jsx)("br",{}),"* CLUSTER - The view provides cluster-wide information. Data will be collected from one node, chosen to represent the cluster."]})]})]})]}),"\n",(0,n.jsx)(s.h3,{id:"system_view_columns",children:"SYSTEM_VIEW_COLUMNS"}),"\n",(0,n.jsx)(s.p,{children:"Describes available system view columns."}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Column"}),(0,n.jsx)(s.th,{children:"Data Type"}),(0,n.jsx)(s.th,{children:"Description"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"VIEW_ID"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"System view ID."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"NAME"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"Column name."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"TYPE"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsxs)(s.td,{children:["Column type. Can by any of the ",(0,n.jsx)(s.a,{href:"/docs/ignite3/3.0.0/sql-reference/data-types",children:"supported types"}),"."]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"NULLABLE"}),(0,n.jsx)(s.td,{children:"BOOLEAN"}),(0,n.jsx)(s.td,{children:"Defines if the column can be empty."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"PRECISION"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"Maximum number of digits."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"SCALE"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"Maximum number of decimal places."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"LENGTH"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"Maximum length of the value. Symbols for string values or bytes for binary values."})]})]})]}),"\n",(0,n.jsx)(s.h3,{id:"systemzones",children:"SYSTEM.ZONES"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Column"}),(0,n.jsx)(s.th,{children:"Data Type"}),(0,n.jsx)(s.th,{children:"Description"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"NAME"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"The name of the distribution zone."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"PARTITIONS"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"The number of partitions in the distribution zone."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"REPLICAS"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"The number of copies of each partition in the distribution zone."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"DATA_NODES_AUTO_ADJUST_SCALE_UP"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"The delay in seconds between the new node joining and the start of data zone adjustment."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"DATA_NODES_AUTO_ADJUST_SCALE_DOWN"}),(0,n.jsx)(s.td,{children:"INT32"}),(0,n.jsx)(s.td,{children:"The delay in seconds between the node leaving the cluster and the start of data zone adjustment."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"DATA_NODES_FILTER"}),(0,n.jsx)(s.td,{children:"STRING"}),(0,n.jsx)(s.td,{children:"The filter that specifies what nodes will be used by the distribution zone."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"IS_DEFAULT_ZONE"}),(0,n.jsx)(s.td,{children:"BOOLEAN"}),(0,n.jsx)(s.td,{children:"Defines if the data zone is used by default."})]})]})]})]})}function o(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/90a0f442.bb76f16b.js b/docs/ignite3/assets/js/90a0f442.bb76f16b.js deleted file mode 100644 index 0641af0a1a..0000000000 --- a/docs/ignite3/assets/js/90a0f442.bb76f16b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9459],{14667:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>c,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"configure-and-operate/reference/cli-configuration","title":"CLI Configuration Parameters","description":"CLI Configuration Parameters","source":"@site/docs/configure-and-operate/reference/cli-configuration.md","sourceDirName":"configure-and-operate/reference","slug":"/configure-and-operate/reference/cli-configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"cli-configuration","title":"CLI Configuration Parameters","sidebar_label":"CLI Configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Cluster Configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration"},"next":{"title":"Storage Profiles","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles"}}');var r=i(74848),s=i(28453);const c={id:"cli-configuration",title:"CLI Configuration Parameters",sidebar_label:"CLI Configuration"},l=void 0,o={},a=[{value:"CLI Configuration Parameters",id:"cli-configuration-parameters",level:2},{value:"Configuration Profiles",id:"configuration-profiles",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h2,{id:"cli-configuration-parameters",children:"CLI Configuration Parameters"}),"\n",(0,r.jsx)(t.p,{children:"The Apache Ignite CLI supports various configuration parameters:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"ignite.jdbc.key-store.path=\r\nignite.cluster-endpoint-url=http://localhost:10300\r\nignite.jdbc.client-auth=\r\nignite.rest.key-store.password=\r\nignite.jdbc.key-store.password=\r\nignite.cli.sql.multiline=true\r\nignite.cli.syntax-highlighting=true\r\nignite.rest.trust-store.path=\r\nignite.jdbc.trust-store.password=\r\nignite.auth.basic.username=\r\nignite.jdbc-url=jdbc:ignite:thin://127.0.0.1:10800\r\nignite.rest.key-store.path=\r\nignite.rest.trust-store.password=\r\nignite.jdbc.trust-store.path=\r\nignite.auth.basic.password=\n"})}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Property"}),(0,r.jsx)(t.th,{children:"Default"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.jdbc.key-store.path"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"Path to the JDBC keystore file."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.cluster-endpoint-url"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"http://127.0.1.1:10300",children:"http://127.0.1.1:10300"})}),(0,r.jsx)(t.td,{children:"Default cluster endpoint URL."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.jdbc.client-auth"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"If JDBC client authorization is enabled in CLI."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.rest.key-store.password"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"REST keystore password."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.jdbc.key-store.password"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"JDBC keystore password."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.cli.sql.multiline"}),(0,r.jsx)(t.td,{children:"true"}),(0,r.jsx)(t.td,{children:"Enables multiline input mode for SQL commands in the CLI."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.cli.syntax-highlighting"}),(0,r.jsx)(t.td,{children:"true"}),(0,r.jsx)(t.td,{children:"Enables syntax highlighting in CLI output."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.rest.trust-store.path"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"REST truststore path."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.jdbc.trust-store.password"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"JDBC truststore password."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.auth.basic.username"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"Basic authentication username."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.jdbc-url"}),(0,r.jsx)(t.td,{children:"jdbc:ignite:thin://127.0.0.1:10800"}),(0,r.jsx)(t.td,{children:"Default JDBC URL."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.rest.key-store.path"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"REST keystore path."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.rest.trust-store.password"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"REST truststore password."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.jdbc.trust-store.path"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"JDBC truststore path."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignite.auth.basic.password"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"Basic authentication password."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"configuration-profiles",children:"Configuration Profiles"}),"\n",(0,r.jsxs)(t.p,{children:["Apache Ignite ",(0,r.jsx)(t.a,{href:"/3.1.0/tools/cli-commands#interactive-cli-mode",children:"CLI"})," supports configuration profiles to manage different sets of settings."]}),"\n",(0,r.jsx)(t.p,{children:"Use the following commands to create and manage profiles:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Create a new configuration profile:"}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cli config create \n"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Switch to an existing profile:"}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cli config activate \n"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Display all available profiles:"}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cli config list\n"})}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Display the currently used profile with all custom settings:"}),"\n"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cli config show\n"})}),"\n",(0,r.jsx)(t.p,{children:"Each profile stores its own CLI-specific settings, allowing isolated configurations for different use cases."})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>c,x:()=>l});var n=i(96540);const r={},s=n.createContext(r);function c(e){const t=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/9185a77c.4330d176.js b/docs/ignite3/assets/js/9185a77c.4330d176.js deleted file mode 100644 index 9399529526..0000000000 --- a/docs/ignite3/assets/js/9185a77c.4330d176.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6210],{26215:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>t,metadata:()=>l,toc:()=>o});const l=JSON.parse('{"id":"api-reference/native-clients/java/tables-api","title":"Tables API","description":"The Tables API provides structured access to data stored in Ignite tables. Applications interact with tables through views that offer different perspectives on the data: record views for full row operations and key-value views for key-based access patterns.","source":"@site/docs/api-reference/native-clients/java/tables-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/tables-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Tables API","id":"tables-api","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Server API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api"},"next":{"title":"Data Streamer API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api"}}');var i=r(74848),a=r(28453);const t={title:"Tables API",id:"tables-api",sidebar_position:3},s="Tables API",c={},o=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Table Discovery",id:"table-discovery",level:2},{value:"Record View",id:"record-view",level:2},{value:"Typed Record View",id:"typed-record-view",level:2},{value:"Key-Value View",id:"key-value-view",level:2},{value:"Typed Key-Value View",id:"typed-key-value-view",level:2},{value:"Batch Operations",id:"batch-operations",level:2},{value:"Key-Value Batch Operations",id:"key-value-batch-operations",level:2},{value:"Conditional Operations",id:"conditional-operations",level:2},{value:"Asynchronous Operations",id:"asynchronous-operations",level:2},{value:"Partition Information",id:"partition-information",level:2},{value:"Tuple Construction",id:"tuple-construction",level:2},{value:"Tuple Value Access",id:"tuple-value-access",level:2},{value:"Reference",id:"reference",level:2},{value:"IgniteTables Methods",id:"ignitetables-methods",level:3},{value:"Table View Methods",id:"table-view-methods",level:3},{value:"RecordView CRUD Methods",id:"recordview-crud-methods",level:3},{value:"KeyValueView Methods",id:"keyvalueview-methods",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"tables-api",children:"Tables API"})}),"\n",(0,i.jsx)(n.p,{children:"The Tables API provides structured access to data stored in Ignite tables. Applications interact with tables through views that offer different perspectives on the data: record views for full row operations and key-value views for key-based access patterns."}),"\n",(0,i.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,i.jsx)(n.p,{children:"Tables store data in rows with typed columns. The API provides three access patterns through views. RecordView treats each row as a complete record. KeyValueView separates rows into key and value portions. Both support binary Tuple access and typed object mapping."}),"\n",(0,i.jsx)(n.p,{children:"Operations execute within optional transaction contexts. Pass null for auto-commit behavior or provide a Transaction for multi-operation atomicity."}),"\n",(0,i.jsx)(n.h2,{id:"table-discovery",children:"Table Discovery"}),"\n",(0,i.jsx)(n.p,{children:"Access tables through the tables manager:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'Table users = ignite.tables().table("users");\r\nif (users == null) {\r\n System.out.println("Table does not exist");\r\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"For qualified names with schemas:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'Table products = ignite.tables().table(QualifiedName.of("inventory", "products"));\n'})}),"\n",(0,i.jsx)(n.p,{children:"List all tables asynchronously:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"CompletableFuture> tablesFuture = ignite.tables().tablesAsync();\r\ntablesFuture.thenAccept(tables -> {\r\n for (Table table : tables) {\r\n System.out.println(table.name());\r\n }\r\n});\n"})}),"\n",(0,i.jsx)(n.h2,{id:"record-view",children:"Record View"}),"\n",(0,i.jsx)(n.p,{children:"RecordView operations work with complete rows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'RecordView view = table.recordView();\r\n\r\n// Insert or update\r\nTuple record = Tuple.create()\r\n .set("id", 1)\r\n .set("name", "Alice")\r\n .set("age", 30);\r\nview.upsert(null, record);\r\n\r\n// Retrieve\r\nTuple key = Tuple.create().set("id", 1);\r\nTuple result = view.get(null, key);\r\nSystem.out.println(result.stringValue("name"));\r\n\r\n// Check existence\r\nboolean exists = view.contains(null, key);\r\n\r\n// Delete\r\nboolean deleted = view.delete(null, key);\n'})}),"\n",(0,i.jsx)(n.p,{children:"Pass null as the transaction parameter for operations outside transactions."}),"\n",(0,i.jsx)(n.h2,{id:"typed-record-view",children:"Typed Record View"}),"\n",(0,i.jsx)(n.p,{children:"Map rows to Java objects using typed views:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'public class User {\r\n public int id;\r\n public String name;\r\n public int age;\r\n}\r\n\r\nRecordView view = table.recordView(User.class);\r\n\r\nUser user = new User();\r\nuser.id = 1;\r\nuser.name = "Alice";\r\nuser.age = 30;\r\n\r\nview.upsert(null, user);\r\n\r\nUser key = new User();\r\nkey.id = 1;\r\nUser retrieved = view.get(null, key);\n'})}),"\n",(0,i.jsx)(n.p,{children:"The view automatically maps between object fields and table columns."}),"\n",(0,i.jsx)(n.h2,{id:"key-value-view",children:"Key-Value View"}),"\n",(0,i.jsx)(n.p,{children:"KeyValueView separates key and value portions:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'KeyValueView view = table.keyValueView();\r\n\r\nTuple key = Tuple.create().set("id", 1);\r\nTuple value = Tuple.create()\r\n .set("name", "Alice")\r\n .set("age", 30);\r\n\r\nview.put(null, key, value);\r\n\r\nTuple retrieved = view.get(null, key);\r\nSystem.out.println(retrieved.stringValue("name"));\r\n\r\n// Check for null vs missing\r\nNullableValue nullable = view.getNullable(null, key);\r\nif (nullable != null) {\r\n System.out.println("Found: " + nullable.get());\r\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"NullableValue distinguishes between missing entries and entries with null values."}),"\n",(0,i.jsx)(n.h2,{id:"typed-key-value-view",children:"Typed Key-Value View"}),"\n",(0,i.jsx)(n.p,{children:"Map keys and values to separate types:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'public class ProductKey {\r\n public int id;\r\n}\r\n\r\npublic class ProductValue {\r\n public String name;\r\n public double price;\r\n}\r\n\r\nKeyValueView view =\r\n table.keyValueView(ProductKey.class, ProductValue.class);\r\n\r\nProductKey key = new ProductKey();\r\nkey.id = 100;\r\n\r\nProductValue value = new ProductValue();\r\nvalue.name = "Widget";\r\nvalue.price = 29.99;\r\n\r\nview.put(null, key, value);\r\n\r\nProductValue retrieved = view.get(null, key);\n'})}),"\n",(0,i.jsx)(n.h2,{id:"batch-operations",children:"Batch Operations"}),"\n",(0,i.jsx)(n.p,{children:"Process multiple records in single operations:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'RecordView view = table.recordView();\r\n\r\nList records = Arrays.asList(\r\n Tuple.create().set("id", 1).set("name", "Alice"),\r\n Tuple.create().set("id", 2).set("name", "Bob"),\r\n Tuple.create().set("id", 3).set("name", "Carol")\r\n);\r\n\r\nview.upsertAll(null, records);\r\n\r\nList keys = Arrays.asList(\r\n Tuple.create().set("id", 1),\r\n Tuple.create().set("id", 2)\r\n);\r\n\r\nList results = view.getAll(null, keys);\n'})}),"\n",(0,i.jsx)(n.p,{children:"Batch operations reduce network overhead for multiple operations."}),"\n",(0,i.jsx)(n.h2,{id:"key-value-batch-operations",children:"Key-Value Batch Operations"}),"\n",(0,i.jsx)(n.p,{children:"Similar batch support for key-value views:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'KeyValueView view = table.keyValueView();\r\n\r\nMap entries = new HashMap<>();\r\nentries.put(\r\n Tuple.create().set("id", 1),\r\n Tuple.create().set("name", "Alice")\r\n);\r\nentries.put(\r\n Tuple.create().set("id", 2),\r\n Tuple.create().set("name", "Bob")\r\n);\r\n\r\nview.putAll(null, entries);\r\n\r\nCollection keys = Arrays.asList(\r\n Tuple.create().set("id", 1),\r\n Tuple.create().set("id", 2)\r\n);\r\n\r\nMap results = view.getAll(null, keys);\n'})}),"\n",(0,i.jsx)(n.h2,{id:"conditional-operations",children:"Conditional Operations"}),"\n",(0,i.jsx)(n.p,{children:"Execute operations based on current values:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'KeyValueView view = table.keyValueView();\r\n\r\nTuple key = Tuple.create().set("id", 1);\r\nTuple oldValue = Tuple.create().set("status", "pending");\r\nTuple newValue = Tuple.create().set("status", "active");\r\n\r\n// Replace only if current value matches\r\nboolean replaced = view.replace(null, key, oldValue, newValue);\r\n\r\nif (replaced) {\r\n System.out.println("Value updated");\r\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Conditional operations provide atomic compare-and-set semantics."}),"\n",(0,i.jsx)(n.h2,{id:"asynchronous-operations",children:"Asynchronous Operations"}),"\n",(0,i.jsx)(n.p,{children:"All operations support asynchronous execution:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'RecordView view = table.recordView();\r\n\r\nTuple record = Tuple.create()\r\n .set("id", 1)\r\n .set("name", "Alice");\r\n\r\nCompletableFuture upsertFuture = view.upsertAsync(null, record);\r\n\r\nTuple key = Tuple.create().set("id", 1);\r\nCompletableFuture getFuture = view.getAsync(null, key);\r\n\r\ngetFuture.thenAccept(result -> {\r\n System.out.println(result.stringValue("name"));\r\n});\n'})}),"\n",(0,i.jsx)(n.p,{children:"Asynchronous operations return immediately without blocking the calling thread."}),"\n",(0,i.jsx)(n.h2,{id:"partition-information",children:"Partition Information"}),"\n",(0,i.jsx)(n.p,{children:"Access partition metadata through the partition manager:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'PartitionManager partitions = table.partitionManager();\r\nCompletableFuture partition =\r\n partitions.partitionAsync(Tuple.create().set("id", 1));\r\n\r\npartition.thenAccept(p -> {\r\n System.out.println("Record belongs to partition: " + p.id());\r\n});\n'})}),"\n",(0,i.jsx)(n.p,{children:"Partition information enables colocated compute operations."}),"\n",(0,i.jsx)(n.h2,{id:"tuple-construction",children:"Tuple Construction"}),"\n",(0,i.jsx)(n.p,{children:"Create tuples with various approaches:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'// Empty tuple\r\nTuple tuple1 = Tuple.create();\r\n\r\n// With capacity hint\r\nTuple tuple2 = Tuple.create(10);\r\n\r\n// From map\r\nMap data = new HashMap<>();\r\ndata.put("id", 1);\r\ndata.put("name", "Alice");\r\nTuple tuple3 = Tuple.create(data);\r\n\r\n// Copy existing\r\nTuple tuple4 = Tuple.copy(tuple3);\n'})}),"\n",(0,i.jsx)(n.p,{children:"Set values by name:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'Tuple tuple = Tuple.create()\r\n .set("id", 1)\r\n .set("name", "Alice")\r\n .set("age", 30)\r\n .set("balance", 1000.50)\r\n .set("created", LocalDateTime.now());\n'})}),"\n",(0,i.jsx)(n.h2,{id:"tuple-value-access",children:"Tuple Value Access"}),"\n",(0,i.jsx)(n.p,{children:"Retrieve values by column name with type-specific methods:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'int id = tuple.intValue("id");\r\nString name = tuple.stringValue("name");\r\nInteger age = tuple.value("age");\r\nLocalDateTime created = tuple.value("created");\r\n\r\n// Access by index\r\nObject value = tuple.value(0);\r\nString columnName = tuple.columnName(0);\r\nint columnIndex = tuple.columnIndex("name");\n'})}),"\n",(0,i.jsx)(n.p,{children:"Type-specific accessors avoid boxing for primitive types."}),"\n",(0,i.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Table management: ",(0,i.jsx)(n.code,{children:"org.apache.ignite.table.IgniteTables"})]}),"\n",(0,i.jsxs)(n.li,{children:["Table interface: ",(0,i.jsx)(n.code,{children:"org.apache.ignite.table.Table"})]}),"\n",(0,i.jsxs)(n.li,{children:["Record access: ",(0,i.jsx)(n.code,{children:"org.apache.ignite.table.RecordView"})]}),"\n",(0,i.jsxs)(n.li,{children:["Key-value access: ",(0,i.jsx)(n.code,{children:"org.apache.ignite.table.KeyValueView"})]}),"\n",(0,i.jsxs)(n.li,{children:["Binary records: ",(0,i.jsx)(n.code,{children:"org.apache.ignite.table.Tuple"})]}),"\n",(0,i.jsxs)(n.li,{children:["Partition info: ",(0,i.jsx)(n.code,{children:"org.apache.ignite.table.partition.PartitionManager"})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"ignitetables-methods",children:"IgniteTables Methods"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"List
                                                              tables()"})," - Get all tables synchronously"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CompletableFuture> tablesAsync()"})," - Get all tables asynchronously"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Table table(String name)"})," - Get table by simple name"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Table table(QualifiedName name)"})," - Get table by qualified name"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CompletableFuture
                                                              tableAsync(String name)"})," - Get table asynchronously"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CompletableFuture
                                                              tableAsync(QualifiedName name)"})," - Get table asynchronously with qualified name"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"table-view-methods",children:"Table View Methods"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"RecordView recordView()"})," - Get binary record view"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"RecordView recordView(Class)"})," - Get typed record view"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"RecordView recordView(Mapper)"})," - Get record view with custom mapper"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"KeyValueView keyValueView()"})," - Get binary key-value view"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"KeyValueView keyValueView(Class, Class)"})," - Get typed key-value view"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"KeyValueView keyValueView(Mapper, Mapper)"})," - Get key-value view with custom mappers"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"recordview-crud-methods",children:"RecordView CRUD Methods"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"R get(Transaction, R keyRec)"})," - Get record by key"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CompletableFuture getAsync(Transaction, R keyRec)"})," - Async get"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"List getAll(Transaction, Collection)"})," - Get multiple records"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CompletableFuture> getAllAsync(Transaction, Collection)"})," - Async get multiple"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"boolean contains(Transaction, R keyRec)"})," - Check existence"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void upsert(Transaction, R rec)"})," - Insert or update record"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CompletableFuture upsertAsync(Transaction, R rec)"})," - Async upsert"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void upsertAll(Transaction, Collection)"})," - Insert or update multiple"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"boolean delete(Transaction, R keyRec)"})," - Delete record"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CompletableFuture deleteAsync(Transaction, R keyRec)"})," - Async delete"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"keyvalueview-methods",children:"KeyValueView Methods"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"V get(Transaction, K key)"})," - Get value by key"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CompletableFuture getAsync(Transaction, K key)"})," - Async get"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"NullableValue getNullable(Transaction, K key)"})," - Get with null distinction"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Map getAll(Transaction, Collection)"})," - Get multiple values"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void put(Transaction, K key, V value)"})," - Put key-value pair"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CompletableFuture putAsync(Transaction, K key, V value)"})," - Async put"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void putAll(Transaction, Map)"})," - Put multiple pairs"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"boolean replace(Transaction, K key, V old, V new)"})," - Conditional replace"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void remove(Transaction, K key)"})," - Remove by key"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void removeAll(Transaction, Collection)"})," - Remove multiple"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>s});var l=r(96540);const i={},a=l.createContext(i);function t(e){const n=l.useContext(a);return l.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),l.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/91920555.5c84e5e0.js b/docs/ignite3/assets/js/91920555.5c84e5e0.js deleted file mode 100644 index c2ac2a6d2a..0000000000 --- a/docs/ignite3/assets/js/91920555.5c84e5e0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5859],{28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var s=t(96540);const i={},l=s.createContext(i);function r(e){const n=s.useContext(l);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(l.Provider,{value:n},e.children)}},59296:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"develop/connect-to-ignite/jdbc","title":"JDBC Driver","description":"Apache Ignite is shipped with JDBC driver that allows processing of distributed data using standard SQL statements like SELECT, INSERT, UPDATE, or DELETE directly from the JDBC side. The name of the driver\'s class is org.apache.ignite.jdbc.IgniteJdbcDriver.","source":"@site/docs/develop/connect-to-ignite/jdbc.md","sourceDirName":"develop/connect-to-ignite","slug":"/develop/connect-to-ignite/jdbc","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"id":"jdbc","title":"JDBC Driver","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Connect to Ignite","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/"},"next":{"title":"ODBC Driver","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc"}}');var i=t(74848),l=t(28453);const r={id:"jdbc",title:"JDBC Driver",sidebar_position:1},a=void 0,c={},d=[{value:"Setting Up",id:"setting-up",level:2},{value:"Parameter Precedence",id:"parameter-precedence",level:3},{value:"Performing Transactions",id:"performing-transactions",level:2},{value:"Unsupported Mandatory JDBC Features",id:"unsupported-mandatory-jdbc-features",level:2},{value:"Unsupported Optional JDBC Features",id:"unsupported-optional-jdbc-features",level:2},{value:"JDBC Features with Limited Support",id:"jdbc-features-with-limited-support",level:2}];function o(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["Apache Ignite is shipped with JDBC driver that allows processing of distributed data using standard SQL statements like ",(0,i.jsx)(n.code,{children:"SELECT"}),", ",(0,i.jsx)(n.code,{children:"INSERT"}),", ",(0,i.jsx)(n.code,{children:"UPDATE"}),", or ",(0,i.jsx)(n.code,{children:"DELETE"})," directly from the JDBC side. The name of the driver's class is ",(0,i.jsx)(n.code,{children:"org.apache.ignite.jdbc.IgniteJdbcDriver"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"This implementation of JDBC driver does not support:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Multiple endpoints"}),"\n",(0,i.jsx)(n.li,{children:"JDBC connection pools"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"See also:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#unsupported-mandatory-jdbc-features",children:"Unsupported Mandatory JDBC Features"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#unsupported-optional-jdbc-features",children:"Unsupported Optional JDBC Features"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#jdbc-features-with-limited-support",children:"JDBC Features with Limited Support"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"setting-up",children:"Setting Up"}),"\n",(0,i.jsxs)(n.p,{children:["JDBC driver uses the client connector to work with the cluster. For more information on configuring client connector, see ",(0,i.jsx)(n.a,{href:"/3.1.0/develop/ignite-clients/",children:"Client Connector Configuration"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"The JDBC connector needs to be included from Maven:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-xml",children:"\r\n org.apache.ignite\r\n ignite-jdbc\r\n {version}\r\n\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Here is how you can open a JDBC connection to the cluster node listening on IP address ",(0,i.jsx)(n.code,{children:"127.0.0.1"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800");\n'})}),"\n",(0,i.jsx)(n.p,{children:"The driver connects to one of the cluster nodes and forwards all the queries to it for final execution. The node handles the query distribution and the result's aggregations. Then the result is sent back to the client application."}),"\n",(0,i.jsx)(n.p,{children:"The JDBC connection string can have an optional list of name-value pairs as parameters after the '?' delimiter. Name and value are separated by the '=' symbol and multiple properties are separated either by an '&' or a ';'. Separate sign can't be mixed and should be either semicolon or ampersand sign."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"jdbc:ignite:thin://host[:port][,host[:port][/schema][[?parameter1=value1][¶meter2=value2],...]]\r\njdbc:ignite:thin://host[:port][,host[:port][/schema][[?parameter1=value1][;parameter2=value2],...]]\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"host"})," is required and defines the host of the cluster node to connect to."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"port"})," is the port to use to open the connection. 10800 is used by default if this parameter is omitted."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"schema"})," is the schema name to access. PUBLIC is used by default. This name should correspond to the SQL ANSI-99 standard. Non-quoted identifiers are not case sensitive. Quoted identifiers are case sensitive. When semicolon format is used, the schema may be defined as a parameter with name schema."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"parameters"})," are optional parameters. The following parameters are available:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"connectionTimeZone"})," - Client connection time-zone ID. This property can be used by the client to change the time zone of the session on the server. Affects the interpretation of dates in queries that do not specify the time zone explicitly. If not set, system default on client timezone will be used."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"queryTimeout"})," - Number of seconds the driver will wait for a ",(0,i.jsx)(n.code,{children:"Statement"})," object to execute. 0 means there is no limit. Default value: ",(0,i.jsx)(n.code,{children:"0"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"connectionTimeout"})," - Number of milliseconds JDBC client will wait for server to respond. 0 means there is no limit. Default value: ",(0,i.jsx)(n.code,{children:"0"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"reconnectThrottlingPeriod"})," - Reconnect throttling period, in milliseconds. 0 means there is no limit. Default value: ",(0,i.jsx)(n.code,{children:"30_000"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"reconnectThrottlingRetries"})," - Reconnect throttling retries. 0 means there is no limit. Default value: ",(0,i.jsx)(n.code,{children:"3"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"username"})," - username for basic authentication to the cluster."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"password"})," - user password for basic authentication to the cluster."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"sslEnabled"})," - Determines if SSL is enabled. Possible values: ",(0,i.jsx)(n.code,{children:"true"}),", ",(0,i.jsx)(n.code,{children:"false"}),". Default value: ",(0,i.jsx)(n.code,{children:"false"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"trustStorePath"})," - Path to trust store on client side."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"trustStorePassword"})," - Trust store password."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"keyStorePath"})," - Path to key store on client side."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"keyStorePassword"})," - Key store password."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"clientAuth"})," - SSL client authentication. Possible values: ",(0,i.jsx)(n.code,{children:"NONE"}),", ",(0,i.jsx)(n.code,{children:"OPTIONAL"}),", ",(0,i.jsx)(n.code,{children:"REQUIRE"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ciphers"})," - comma-separated SSL ciphers list."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"parameter-precedence",children:"Parameter Precedence"}),"\n",(0,i.jsx)(n.p,{children:"If the same parameters are passed by using different means, the JDBC driver prioritizes them in the following way:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["API arguments passed in the ",(0,i.jsx)(n.code,{children:"Connection"})," objects"]}),"\n",(0,i.jsx)(n.li,{children:"Last instance of the parameter in the connection string"}),"\n",(0,i.jsx)(n.li,{children:"Properties object passed during connection"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"performing-transactions",children:"Performing Transactions"}),"\n",(0,i.jsxs)(n.p,{children:["With the JDBC driver, you can perform ",(0,i.jsx)(n.code,{children:"commit"})," and ",(0,i.jsx)(n.code,{children:"rollback"})," transactions. For more information about transactions, see ",(0,i.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/transactions",children:"Performing Transactions"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Here is how you can commit a transaction:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'// Open the JDBC connection.\r\nConnection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800");\r\n\r\n// Commit a transaction\r\nconn.commit();\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can also configure Apache Ignite to automatically commit transactions by using the ",(0,i.jsx)(n.code,{children:"setAutoCommit()"})," method."]}),"\n",(0,i.jsx)(n.p,{children:"Here is how you can rollback a transaction:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"conn.rollback();\n"})}),"\n",(0,i.jsx)(n.h2,{id:"unsupported-mandatory-jdbc-features",children:"Unsupported Mandatory JDBC Features"}),"\n",(0,i.jsx)(n.p,{children:"The following mandatory JDBC features are currently not supported (sorted alphabetically):"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#clearWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#getWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#prepareCall"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#getParameterMetaData"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setAsciiStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setBinaryStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#clearWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getAsciiStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getBinaryStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#setFetchDirection"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#clearWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#getWarnings"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setEscapeProcessing"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setFetchDirection"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setMaxFieldSize"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"unsupported-optional-jdbc-features",children:"Unsupported Optional JDBC Features"}),"\n",(0,i.jsx)(n.p,{children:"The following optional JDBC features are currently not supported (sorted alphabetically):"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createArrayOf"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createBlob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createNClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createSQLXML"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#createStruct"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#getTypeMap"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#releaseSavepoint"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#setSavepoint"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Connection#setTypeMap"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Driver#getParentLogger"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#getMetaData"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setArray"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setBlob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setNCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setNClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setRef"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setRowId"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setSQLXML"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setUnicodeStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.PreparedStatement#setURL"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#cancelRowUpdates"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#deleteRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getArray"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getBlob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getNCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getNClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getRef"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getRowId"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getSQLXML"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#getUnicodeStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#insertRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#moveToInsertRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#refreshRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateArray"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateAsciiStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBigDecimal"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBinaryStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBlob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBoolean"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateByte"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateBytes"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateDate"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateDouble"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateFloat"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateInt"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateLong"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateNCharacterStream"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateNClob"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateNString"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateNull"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateObject"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateRef"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateRow"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateRowId"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateShort"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateSQLXML"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateString"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateTime"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.ResultSet#updateTimestamp"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#getGeneratedKeys"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setCursorName"}),"\n",(0,i.jsx)(n.li,{children:"java.sql.Statement#setPoolable"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"jdbc-features-with-limited-support",children:"JDBC Features with Limited Support"}),"\n",(0,i.jsx)(n.p,{children:"The following JDBC features are supported only in specific cases:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Feature"}),(0,i.jsx)(n.th,{children:"Supported Cases"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Connection#prepareStatement"}),(0,i.jsx)(n.td,{children:"autoGeneratedKeys=Statement.NO_GENERATED_KEYS, resultSetType=ResultSet.TYPE_FORWARD_ONLY, resultSetConcurrency=ResultSet.CONCUR_READ_ONLY, null or empty columnIndexes, and null or empty columnNames."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Connection#rollback"}),(0,i.jsx)(n.td,{children:"Without savepoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Statement#execute"}),(0,i.jsx)(n.td,{children:"autoGeneratedKeys=Statement.NO_GENERATED_KEYS, null or empty columnIndexes, and null or empty columnNames."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Statement#executeUpdate"}),(0,i.jsx)(n.td,{children:"autoGeneratedKeys=Statement.NO_GENERATED_KEYS, null or empty columnIndexes, and null or empty columnNames."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"java.sql.Statement#getMoreResults"}),(0,i.jsx)(n.td,{children:"current=Statement.CLOSE_CURRENT_RESULT."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/936721b0.9816993c.js b/docs/ignite3/assets/js/936721b0.9816993c.js deleted file mode 100644 index df5d84932a..0000000000 --- a/docs/ignite3/assets/js/936721b0.9816993c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[179],{28453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>l});var s=r(96540);const i={},a=s.createContext(i);function t(e){const n=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(a.Provider,{value:n},e.children)}},77222:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"understand/core-concepts/tables-and-schemas","title":"Tables and Schemas","description":"Tables are the primary data structure in Ignite 3. Unlike Ignite 2\'s cache-based model with Binary Objects, Ignite 3 stores data in tables with SQL-compatible schemas. This unifies the SQL and Key-Value APIs under a single data model.","source":"@site/docs/understand/core-concepts/tables-and-schemas.md","sourceDirName":"understand/core-concepts","slug":"/understand/core-concepts/tables-and-schemas","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"id":"tables-and-schemas","title":"Tables and Schemas","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"What is Apache Ignite 3?","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite"},"next":{"title":"Transactions and MVCC","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc"}}');var i=r(74848),a=r(28453);const t={id:"tables-and-schemas",title:"Tables and Schemas",sidebar_position:2},l=void 0,c={},d=[{value:"Architecture Overview",id:"architecture-overview",level:2},{value:"Schema Structure",id:"schema-structure",level:2},{value:"Column Types",id:"column-types",level:2},{value:"Fixed-Length Types",id:"fixed-length-types",level:3},{value:"Variable-Length Types",id:"variable-length-types",level:3},{value:"Primary Keys",id:"primary-keys",level:2},{value:"Schema Versioning",id:"schema-versioning",level:2},{value:"Table Views",id:"table-views",level:2},{value:"RecordView",id:"recordview",level:3},{value:"KeyValueView",id:"keyvalueview",level:3},{value:"Tuple Views",id:"tuple-views",level:3},{value:"Binary Row Format",id:"binary-row-format",level:2},{value:"Catalog Management",id:"catalog-management",level:2},{value:"Design Constraints",id:"design-constraints",level:2},{value:"Related Topics",id:"related-topics",level:2}];function o(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Tables are the primary data structure in Ignite 3. Unlike Ignite 2's cache-based model with Binary Objects, Ignite 3 stores data in tables with SQL-compatible schemas. This unifies the SQL and Key-Value APIs under a single data model."}),"\n",(0,i.jsx)(n.h2,{id:"architecture-overview",children:"Architecture Overview"}),"\n",(0,i.jsx)(n.p,{children:"The table system consists of three layers:"}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Public API Layer"\r\n Table[Table Interface]\r\n RV[RecordView]\r\n KV[KeyValueView]\r\n TV[TupleView]\r\n end\r\n\r\n subgraph "Schema Layer"\r\n SD[SchemaDescriptor]\r\n Col[Column Definitions]\r\n Marsh[Marshallers]\r\n end\r\n\r\n subgraph "Catalog Layer"\r\n Cat[Catalog]\r\n CTD[CatalogTableDescriptor]\r\n CSV[CatalogSchemaVersions]\r\n end\r\n\r\n subgraph "Storage Layer"\r\n IT[InternalTable]\r\n Part[Partitions]\r\n BR[BinaryRow]\r\n end\r\n\r\n Table --\x3e RV & KV & TV\r\n RV & KV & TV --\x3e Marsh\r\n Marsh --\x3e SD\r\n SD --\x3e Col\r\n CTD --\x3e CSV\r\n Cat --\x3e CTD\r\n IT --\x3e Part\r\n Part --\x3e BR\r\n SD -.-> CTD'}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Catalog Layer"}),": Maintains versioned metadata for schemas, tables, indexes, and distribution zones"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Schema Layer"}),": Defines column types, handles binary serialization, and manages schema evolution"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Storage Layer"}),": Manages partitioned data storage using binary row format"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"schema-structure",children:"Schema Structure"}),"\n",(0,i.jsxs)(n.p,{children:["Each table has a ",(0,i.jsx)(n.code,{children:"SchemaDescriptor"})," that defines its structure. The descriptor maintains multiple column orderings:"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Ordering"}),(0,i.jsx)(n.th,{children:"Purpose"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Row position"}),(0,i.jsx)(n.td,{children:"Full row serialization order"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Key position"}),(0,i.jsx)(n.td,{children:"Primary key columns only"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Value position"}),(0,i.jsx)(n.td,{children:"Non-key columns only"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Colocation position"}),(0,i.jsx)(n.td,{children:"Columns used for partition assignment"})]})]})]}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "SchemaDescriptor"\r\n direction TB\r\n V[Version: 1]\r\n\r\n subgraph "Column Orderings"\r\n RP["Row: [id, name, balance, region]"]\r\n KP["Key: [id]"]\r\n VP["Value: [name, balance, region]"]\r\n CP["Colocation: [id]"]\r\n end\r\n end'}),"\n",(0,i.jsxs)(n.p,{children:["The schema tracks column positions across these orderings. A column absent from a specific ordering has position ",(0,i.jsx)(n.code,{children:"-1"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"column-types",children:"Column Types"}),"\n",(0,i.jsx)(n.p,{children:"Ignite 3 supports two categories of native types:"}),"\n",(0,i.jsx)(n.h3,{id:"fixed-length-types",children:"Fixed-Length Types"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Size (bytes)"}),(0,i.jsx)(n.th,{children:"Java Mapping"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"BOOLEAN"}),(0,i.jsx)(n.td,{children:"1"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"boolean"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT8"}),(0,i.jsx)(n.td,{children:"1"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"byte"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT16"}),(0,i.jsx)(n.td,{children:"2"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"short"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT32"}),(0,i.jsx)(n.td,{children:"4"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"int"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT64"}),(0,i.jsx)(n.td,{children:"8"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"long"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"FLOAT"}),(0,i.jsx)(n.td,{children:"4"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"float"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DOUBLE"}),(0,i.jsx)(n.td,{children:"8"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"double"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"UUID"}),(0,i.jsx)(n.td,{children:"16"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"java.util.UUID"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DATE"}),(0,i.jsx)(n.td,{children:"3"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"java.time.LocalDate"})})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"variable-length-types",children:"Variable-Length Types"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Max Size"}),(0,i.jsx)(n.th,{children:"Java Mapping"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"STRING"}),(0,i.jsx)(n.td,{children:"65536 (default)"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"String"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"BYTES"}),(0,i.jsx)(n.td,{children:"65536 (default)"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"byte[]"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DECIMAL"}),(0,i.jsx)(n.td,{children:"precision/scale"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"BigDecimal"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"TIME"}),(0,i.jsx)(n.td,{children:"precision (0-9)"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"java.time.LocalTime"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DATETIME"}),(0,i.jsx)(n.td,{children:"precision (0-9)"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"java.time.LocalDateTime"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"TIMESTAMP"}),(0,i.jsx)(n.td,{children:"precision (0-9)"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"java.time.Instant"})})]})]})]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Ignite 3 requires JavaTime API for temporal types. Legacy types like ",(0,i.jsx)(n.code,{children:"java.util.Date"}),", ",(0,i.jsx)(n.code,{children:"java.sql.Date"}),", ",(0,i.jsx)(n.code,{children:"java.sql.Time"}),", and ",(0,i.jsx)(n.code,{children:"java.sql.Timestamp"})," are not supported."]})}),"\n",(0,i.jsx)(n.h2,{id:"primary-keys",children:"Primary Keys"}),"\n",(0,i.jsx)(n.p,{children:"Every table requires a primary key. Ignite 3 supports two primary key types:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Hash Primary Key"}),": Uses hash-based partitioning for data distribution"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Sorted Primary Key"}),": Uses range-based partitioning with collation ordering"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Primary key constraints:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"All primary key columns must be non-nullable"}),"\n",(0,i.jsx)(n.li,{children:"No duplicate columns allowed in key definition"}),"\n",(0,i.jsx)(n.li,{children:"All key columns must exist in the table schema"}),"\n",(0,i.jsx)(n.li,{children:"A primary key index is automatically created"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE accounts (\r\n account_id INT PRIMARY KEY,\r\n name VARCHAR(100),\r\n balance DECIMAL(10, 2)\r\n);\n"})}),"\n",(0,i.jsx)(n.p,{children:"For composite keys:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE order_items (\r\n order_id INT,\r\n item_id INT,\r\n quantity INT,\r\n PRIMARY KEY (order_id, item_id)\r\n);\n"})}),"\n",(0,i.jsx)(n.h2,{id:"schema-versioning",children:"Schema Versioning"}),"\n",(0,i.jsxs)(n.p,{children:["Ignite 3 uses append-only schema versioning. Each ",(0,i.jsx)(n.code,{children:"ALTER TABLE"})," operation increments the catalog version and creates a new schema version for the table."]}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Schema Evolution"\r\n V1["Version 1
                                                              [id, name]"]\r\n V2["Version 2
                                                              [id, name, email]"]\r\n V3["Version 3
                                                              [id, name, email, status]"]\r\n end\r\n\r\n V1 --\x3e|"ALTER TABLE
                                                              ADD email"| V2\r\n V2 --\x3e|"ALTER TABLE
                                                              ADD status"| V3'}),"\n",(0,i.jsx)(n.p,{children:"Key versioning behaviors:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Immutable versions"}),": Schema versions are never modified after creation"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Consecutive numbering"}),": Versions increment by 1 with no gaps"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Column mapper"}),": Tracks transformations between versions for automatic data migration"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Binary row versioning"}),": Each stored row carries its schema version"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["When reading data written with an older schema version, Ignite automatically upgrades the row using the ",(0,i.jsx)(n.code,{children:"ColumnMapper"}),". New columns receive their default values."]}),"\n",(0,i.jsx)(n.h2,{id:"table-views",children:"Table Views"}),"\n",(0,i.jsx)(n.p,{children:"Tables expose multiple view abstractions for different access patterns:"}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n T[Table]\r\n\r\n subgraph "Record Views"\r\n TRV["Tuple RecordView
                                                              (schema-less)"]\r\n PRV["POJO RecordView
                                                              (type-mapped)"]\r\n end\r\n\r\n subgraph "Key-Value Views"\r\n TKV["Tuple KeyValueView
                                                              (schema-less)"]\r\n PKV["POJO KeyValueView
                                                              (type-mapped)"]\r\n end\r\n\r\n T --\x3e TRV & PRV\r\n T --\x3e TKV & PKV'}),"\n",(0,i.jsx)(n.h3,{id:"recordview",children:"RecordView"}),"\n",(0,i.jsx)(n.p,{children:"Works with complete row records containing all fields including the primary key:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'RecordView accounts = table.recordView(Account.class);\r\n\r\nAccount account = new Account(123, "John Doe", 1000.00);\r\naccounts.insert(null, account);\r\n\r\nAccount retrieved = accounts.get(null, new Account(123));\n'})}),"\n",(0,i.jsx)(n.h3,{id:"keyvalueview",children:"KeyValueView"}),"\n",(0,i.jsx)(n.p,{children:"Separates keys from values. Use this when the primary key is not logically part of the domain object:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'KeyValueView accounts = table.keyValueView(\r\n Mapper.of(Long.class),\r\n Mapper.of(Account.class)\r\n);\r\n\r\naccounts.put(null, 123L, new Account("John Doe", 1000.00));\r\nAccount account = accounts.get(null, 123L);\n'})}),"\n",(0,i.jsx)(n.h3,{id:"tuple-views",children:"Tuple Views"}),"\n",(0,i.jsx)(n.p,{children:"For schema-less access without predefined classes:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'RecordView view = table.recordView();\r\n\r\nTuple record = Tuple.create()\r\n .set("id", 123)\r\n .set("name", "John Doe")\r\n .set("balance", 1000.00);\r\n\r\nview.insert(null, record);\n'})}),"\n",(0,i.jsx)(n.h2,{id:"binary-row-format",children:"Binary Row Format"}),"\n",(0,i.jsx)(n.p,{children:"Data is stored in a compact binary format optimized for zero-copy reads:"}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "BinaryRow Structure"\r\n SV[Schema Version
                                                              2 bytes]\r\n NB[Null Bitmap]\r\n FD[Fixed-Length Data]\r\n VO[Variable Offsets]\r\n VD[Variable Data]\r\n end\r\n\r\n SV --\x3e NB --\x3e FD --\x3e VO --\x3e VD'}),"\n",(0,i.jsx)(n.p,{children:"The format supports:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Null tracking"}),": Bitmap indicates null columns without storing placeholder data"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Direct access"}),": Fixed-length columns accessed by offset without deserialization"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Variable-length efficiency"}),": Offset table enables direct access to variable columns"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"catalog-management",children:"Catalog Management"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"Catalog"})," maintains an immutable snapshot of the distributed schema at a specific version:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'// Tables are created via SQL\r\nclient.sql().execute(null,\r\n "CREATE TABLE accounts (" +\r\n " id INT PRIMARY KEY," +\r\n " name VARCHAR(100)," +\r\n " balance DECIMAL(10,2)" +\r\n ") WITH PRIMARY_ZONE=\'default\'"\r\n);\r\n\r\n// Access table via API\r\nTable accounts = client.tables().table("accounts");\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Schema operations use ",(0,i.jsx)(n.code,{children:"CatalogCommand"})," implementations:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CreateTableCommand"}),": Creates new table with schema"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"AlterTableAddColumnCommand"}),": Adds columns to existing table"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"AlterTableDropColumnCommand"}),": Removes columns"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"DropTableCommand"}),": Removes table"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"All catalog operations are atomic and version-tracked."}),"\n",(0,i.jsx)(n.h2,{id:"design-constraints",children:"Design Constraints"}),"\n",(0,i.jsx)(n.p,{children:"When working with tables:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Table creation requires SQL"}),": The Table API only provides read and write operations. Use SQL DDL to create, alter, or drop tables."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Schema version continuity"}),": Schema versions must increment consecutively. Early versions may be pruned but intermediate versions cannot be skipped."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Primary key immutability"}),": Primary key columns cannot be modified after table creation."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Nullable inference"}),": Primary key columns are automatically non-nullable. Including nullable columns in a primary key raises a validation error."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Type constraints"}),": Variable-length types have maximum length constraints. DECIMAL requires explicit precision and scale."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"related-topics",children:"Related Topics"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/table-api",children:"Table API"})," for working with table views"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"Distribution Zones"})," for partition configuration"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/3.1.0/sql/reference/data-types-and-functions/data-types",children:"Data Types"})," for SQL type mappings"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/948ed64f.2804041f.js b/docs/ignite3/assets/js/948ed64f.2804041f.js deleted file mode 100644 index d5720c5ccb..0000000000 --- a/docs/ignite3/assets/js/948ed64f.2804041f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4821],{11470:(e,r,n)=>{n.d(r,{A:()=>f});var t=n(96540),l=n(34164),a=n(17559),s=n(23104),i=n(56347),o=n(205),c=n(57485),u=n(31682),d=n(70679);function h(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:r}=e;return!!r&&"object"==typeof r&&"value"in r}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:r,children:n}=e;return(0,t.useMemo)(()=>{const e=r??function(e){return h(e).map(({props:{value:e,label:r,attributes:n,default:t}})=>({value:e,label:r,attributes:n,default:t}))}(n);return function(e){const r=(0,u.XI)(e,(e,r)=>e.value===r.value);if(r.length>0)throw new Error(`Docusaurus error: Duplicate values "${r.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[r,n])}function b({value:e,tabValues:r}){return r.some(r=>r.value===e)}function m({queryString:e=!1,groupId:r}){const n=(0,i.W6)(),l=function({queryString:e=!1,groupId:r}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:e,groupId:r});return[(0,c.aZ)(l),(0,t.useCallback)(e=>{if(!l)return;const r=new URLSearchParams(n.location.search);r.set(l,e),n.replace({...n.location,search:r.toString()})},[l,n])]}function j(e){const{defaultValue:r,queryString:n=!1,groupId:l}=e,a=p(e),[s,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:r}){if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!b({value:e,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${r.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=r.find(e=>e.default)??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:r,tabValues:a})),[c,u]=m({queryString:n,groupId:l}),[h,j]=function({groupId:e}){const r=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,l]=(0,d.Dv)(r);return[n,(0,t.useCallback)(e=>{r&&l.set(e)},[r,l])]}({groupId:l}),g=(()=>{const e=c??h;return b({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{g&&i(g)},[g]);return{selectedValue:s,selectValue:(0,t.useCallback)(e=>{if(!b({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),j(e)},[u,j,a]),tabValues:a}}var g=n(92303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=n(74848);function w({className:e,block:r,selectedValue:n,selectValue:t,tabValues:a}){const i=[],{blockElementScrollPositionUntilNextRender:o}=(0,s.a_)(),c=e=>{const r=e.currentTarget,l=i.indexOf(r),s=a[l].value;s!==n&&(o(r),t(s))},u=e=>{let r=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const n=i.indexOf(e.currentTarget)+1;r=i[n]??i[0];break}case"ArrowLeft":{const n=i.indexOf(e.currentTarget)-1;r=i[n]??i[i.length-1];break}}r?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":r},e),children:a.map(({value:e,label:r,attributes:t})=>(0,v.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{i.push(e)},onKeyDown:u,onClick:c,...t,className:(0,l.A)("tabs__item",x.tabItem,t?.className,{"tabs__item--active":n===e}),children:r??e},e))})}function y({lazy:e,children:r,selectedValue:n}){const a=(Array.isArray(r)?r:[r]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===n);return e?(0,t.cloneElement)(e,{className:(0,l.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,r)=>(0,t.cloneElement)(e,{key:r,hidden:e.props.value!==n}))})}function C(e){const r=j(e);return(0,v.jsxs)("div",{className:(0,l.A)(a.G.tabs.container,"tabs-container",x.tabList),children:[(0,v.jsx)(w,{...r,...e}),(0,v.jsx)(y,{...r,...e})]})}function f(e){const r=(0,g.A)();return(0,v.jsx)(C,{...e,children:h(e.children)},String(r))}},19365:(e,r,n)=>{n.d(r,{A:()=>s});n(96540);var t=n(34164);const l={tabItem:"tabItem_Ymn6"};var a=n(74848);function s({children:e,hidden:r,className:n}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,t.A)(l.tabItem,n),hidden:r,children:e})}},28453:(e,r,n)=>{n.d(r,{R:()=>s,x:()=>i});var t=n(96540);const l={},a=t.createContext(l);function s(e){const r=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),t.createElement(a.Provider,{value:r},e.children)}},80767:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>u,contentTitle:()=>c,default:()=>p,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"develop/work-with-data/serialization","title":"Object Serialization","description":"Apache Ignite provides a way to serialize your java objects and types and send the data between servers and clients.","source":"@site/docs/develop/work-with-data/serialization.md","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/serialization","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/serialization","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"serialization","title":"Object Serialization"},"sidebar":"tutorialSidebar","previous":{"title":"Distributed Computing","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/compute"},"next":{"title":"Code Deployment","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/code-deployment"}}');var l=n(74848),a=n(28453),s=n(11470),i=n(19365);const o={id:"serialization",title:"Object Serialization"},c=void 0,u={},d=[{value:"Native Types",id:"native-types",level:2},{value:"Tuples",id:"tuples",level:2},{value:"User Objects",id:"user-objects",level:2},{value:"Server-Side",id:"server-side",level:3},{value:"Client-Side",id:"client-side",level:3}];function h(e){const r={code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(r.p,{children:"Apache Ignite provides a way to serialize your java objects and types and send the data between servers and clients."}),"\n",(0,l.jsx)(r.h2,{id:"native-types",children:"Native Types"}),"\n",(0,l.jsx)(r.p,{children:"Apache Ignite handles native type serialization automatically. For example, the following Compute job accepts an Integer and returns an Integer:"}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class IntegerComputeJob implements ComputeJob {\r\n @Override\r\n public @Nullable CompletableFuture executeAsync(\r\n JobExecutionContext context, @Nullable Integer arg\r\n ) {\r\n return completedFuture(arg - 1);\r\n }\r\n}\n"})}),"\n",(0,l.jsx)(r.p,{children:"Since both the argument and the result are native types and are serialized automatically, you do not need any additional code to handle the serialization:"}),"\n",(0,l.jsxs)(s.A,{children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("address/to/cluster:port").build()) {\r\nInteger result = client.compute().execute(\r\nJobTarget.anyNode(client.clusterNodes()),\r\nJobDescriptor.builder(IntegerComputeJob.class).build(),\r\n1\r\n);\r\n}\n'})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:'using var client = await IgniteClient.StartAsync(\r\n new IgniteClientConfiguration("address/to/cluster:port"));\r\n\r\nIJobExecution jobExec = await client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(await client.GetClusterNodesAsync()),\r\n new JobDescriptor("org.example.IntegerComputeJob"),\r\n 1);\r\n\r\nint result = await jobExec.GetResultAsync();\n'})})})]}),"\n",(0,l.jsx)(r.h2,{id:"tuples",children:"Tuples"}),"\n",(0,l.jsx)(r.p,{children:"Apache Ignite is designed around working with Tuples, and handles tuple serialization automatically. For example, the following Job accepts Tuple and returns Tuple:"}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:'class TupleComputeJob implements ComputeJob {\r\n @Override\r\n public @Nullable CompletableFuture executeAsync(JobExecutionContext context, @Nullable Tuple arg) {\r\n Tuple resultTuple = Tuple.copy(arg);\r\n resultTuple.set("col", "new value");\r\n\r\n return completedFuture(resultTuple);\r\n }\r\n}\n'})}),"\n",(0,l.jsx)(r.p,{children:"Since both the argument and the result are tuples, they are serialized automatically, and you do not need to handle serialization:"}),"\n",(0,l.jsxs)(s.A,{children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("address/to/cluster:port").build()) {\r\nTuple resultTuple = client.compute().execute(\r\nJobTarget.anyNode(client.clusterNodes()),\r\nJobDescriptor.builder(TupleComputeJob.class).build(),\r\nTuple.create().set("col", "value")\r\n);\r\n}\n'})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:'using var client = await IgniteClient.StartAsync(\r\n new IgniteClientConfiguration("address/to/cluster:port"));\r\n\r\nIJobExecution jobExec = await client.Compute.SubmitAsync(\r\n JobTarget.AnyNode(await client.GetClusterNodesAsync()),\r\n new JobDescriptor("org.example.TupleComputeJob"),\r\n new IgniteTuple { ["col"] = "value" });\r\n\r\nIIgniteTuple result = await jobExec.GetResultAsync();\n'})})})]}),"\n",(0,l.jsx)(r.h2,{id:"user-objects",children:"User Objects"}),"\n",(0,l.jsx)(r.p,{children:"User objects are marshalled automatically in the following way:"}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsx)(r.li,{children:"If a custom marshaller is defined, it is used."}),"\n",(0,l.jsx)(r.li,{children:"If no marshaller is defined, user Java objects are marshalled to binary tuples."}),"\n",(0,l.jsx)(r.li,{children:"If there are nested objects, they are recursively marshalled to tuples."}),"\n"]}),"\n",(0,l.jsxs)(r.p,{children:["Below is an example of user objects marshalled with custom logic (using JSON serialization with ",(0,l.jsx)(r.code,{children:"ObjectMapper"}),", but you can do whatever you think is good for your use case)."]}),"\n",(0,l.jsx)(r.p,{children:"Let's start with Compute job definition that should be a part of the same deployment unit."}),"\n",(0,l.jsx)(r.h3,{id:"server-side",children:"Server-Side"}),"\n",(0,l.jsx)(r.p,{children:"The code below shows how to handle marshalling on a server, so that it can properly send the data to the clients and receive their responses:"}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsxs)(r.li,{children:["\n",(0,l.jsx)(r.p,{children:"This is the custom object that we will be using as an argument the job:"}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class ArgumentCustomServerObject {\r\n int arg1;\r\n String arg2;\r\n}\n"})}),"\n"]}),"\n",(0,l.jsxs)(r.li,{children:["\n",(0,l.jsxs)(r.p,{children:["We need to define a marshaller for it using the ",(0,l.jsx)(r.code,{children:"ObjectMapper"})," object:"]}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"final ObjectMapper MAPPER = new ObjectMapper();\r\n\r\nclass ArgumentCustomServerObjectMarshaller implements Marshaller {\r\n @Override\r\n public byte @Nullable [] marshal(@Nullable ArgumentCustomServerObject object) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.writeValueAsBytes(object);\r\n } catch (JsonProcessingException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n\r\n @Override\r\n public @Nullable ArgumentCustomServerObject unmarshal(byte @Nullable [] raw) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.readValue(raw, ArgumentCustomServerObject.class);\r\n } catch (IOException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n}\n"})}),"\n"]}),"\n",(0,l.jsxs)(r.li,{children:["\n",(0,l.jsx)(r.p,{children:"Let's also create another object that will be used to store Compute job results, and the corresponding marshaller:"}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class ResultCustomServerObject {\r\n int res1;\r\n String res2;\r\n long res3;\r\n}\r\n\r\nclass ResultCustomServerObjectMarshaller implements Marshaller {\r\n @Override\r\n public byte @Nullable [] marshal(@Nullable ResultCustomServerObject object) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.writeValueAsBytes(object);\r\n } catch (JsonProcessingException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n\r\n @Override\r\n public @Nullable ResultCustomServerObject unmarshal(byte @Nullable [] raw) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.readValue(raw, ResultCustomServerObject.class);\r\n } catch (IOException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n}\n"})}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(r.p,{children:["The marshallers above define how to represent corresponding objects as ",(0,l.jsx)(r.code,{children:"byte[]"}),", and how to read these objects from ",(0,l.jsx)(r.code,{children:"byte[]"}),". However, defining these classes does not enable custom serialization, as you need to specify the marshaller to use when serializing objects. In Apache Ignite, this is done by overriding two methods in Compute job definition to use them as factory methods for marshallers:"]}),"\n",(0,l.jsx)(r.p,{children:"The code below provides an example of implementing marshallers in a compute job:"}),"\n",(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class PojoComputeJob implements ComputeJob {\r\n\r\n @Override\r\n public @Nullable CompletableFuture executeAsync(\r\n JobExecutionContext context,\r\n @Nullable ArgumentCustomServerObject arg\r\n ) {\r\n ResultCustomServerObject res = new ResultCustomServerObject();\r\n res.res1 = arg.arg1;\r\n res.res2 = arg.arg2;\r\n res.res3 = 1;\r\n\r\n return completedFuture(res);\r\n }\r\n\r\n @Override\r\n public Marshaller inputMarshaller() {\r\n return new ArgumentCustomServerObjectMarshaller();\r\n }\r\n\r\n @Override\r\n public Marshaller resultMarshaller() {\r\n return new ResultCustomServerObjectMarshaller();\r\n }\r\n}\n"})}),"\n",(0,l.jsx)(r.p,{children:"With this, the Apache Ignite server will be able to handle marshalling the required objects to sending them to clients, and unmarshalling the client responses."}),"\n",(0,l.jsx)(r.h3,{id:"client-side",children:"Client-Side"}),"\n",(0,l.jsx)(r.p,{children:"On the client side, largely the same code is required to handle the incoming objects and to marshal the response:"}),"\n",(0,l.jsxs)(r.ul,{children:["\n",(0,l.jsxs)(r.li,{children:["\n",(0,l.jsx)(r.p,{children:"Define the custom object that is used for compute job:"}),"\n",(0,l.jsxs)(s.A,{children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class ArgumentCustomClientObject {\r\nint arg1;\r\nString arg2;\r\n}\n"})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:"record ArgumentCustomClientObject(int arg1, string arg2);\n"})})})]}),"\n"]}),"\n",(0,l.jsxs)(r.li,{children:["\n",(0,l.jsx)(r.p,{children:"Define the marshaller for the object:"}),"\n",(0,l.jsxs)(s.A,{children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"final ObjectMapper MAPPER = new ObjectMapper();\r\n\r\nclass ArgumentCustomClientObjectMarshaller implements Marshaller {\r\n@Override\r\npublic byte @Nullable [] marshal(@Nullable ArgumentCustomClientObject object) throws UnsupportedObjectTypeMarshallingException {\r\ntry {\r\nreturn MAPPER.writeValueAsBytes(object);\r\n} catch (JsonProcessingException e) {\r\nthrow new RuntimeException(e);\r\n}\r\n}\r\n\r\n @Override\r\n public @Nullable ArgumentCustomClientObject unmarshal(byte @Nullable [] raw) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.readValue(raw, ArgumentCustomClientObject.class);\r\n } catch (IOException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n}\n"})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:"class MyJsonMarshaller : IMarshaller\r\n{\r\n public void Marshal(T obj, IBufferWriter writer)\r\n {\r\n using var utf8JsonWriter = new Utf8JsonWriter(writer);\r\n JsonSerializer.Serialize(utf8JsonWriter, obj);\r\n }\r\n\r\n public T Unmarshal(ReadOnlySpan bytes) =>\r\n JsonSerializer.Deserialize(bytes)!;\r\n}\n"})})})]}),"\n"]}),"\n",(0,l.jsxs)(r.li,{children:["\n",(0,l.jsx)(r.p,{children:"Do the same for the result object:"}),"\n",(0,l.jsxs)(s.A,{children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:"class ResultCustomClientObject {\r\nint res1;\r\nString res2;\r\nlong res3;\r\n}\r\n\r\n\r\nclass ResultCustomClientObjectMarshaller implements Marshaller {\r\n@Override\r\npublic byte @Nullable [] marshal(@Nullable ResultCustomClientObject object) throws UnsupportedObjectTypeMarshallingException {\r\ntry {\r\nreturn MAPPER.writeValueAsBytes(object);\r\n} catch (JsonProcessingException e) {\r\nthrow new RuntimeException(e);\r\n}\r\n}\r\n\r\n @Override\r\n public @Nullable ResultCustomClientObject unmarshal(byte @Nullable [] raw) throws UnsupportedObjectTypeMarshallingException {\r\n try {\r\n return MAPPER.readValue(raw, ResultCustomClientObject.class);\r\n } catch (IOException e) {\r\n throw new RuntimeException(e);\r\n }\r\n }\r\n}\r\n\r\n// ....\n"})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:"record ResultCustomClientObject(int res1, string res2, long res3);\r\n\r\n// Use the same generic MyJsonMarshaller class (see above) for the result object.\n"})})})]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(r.p,{children:"Now that all marshallers are defined, you can start working with the custom objects and handle marshalling of arguments and results in your compute jobs:"}),"\n",(0,l.jsxs)(s.A,{children:[(0,l.jsx)(i.A,{value:"java",label:"Java",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder().addresses("address/to/cluster:port").build()) {\r\n// Marshalling example of pojo.\r\nResultCustomClientObject resultPojo = client.compute().execute(\r\nJobTarget.anyNode(client.clusterNodes()),\r\nJobDescriptor.builder(PojoComputeJob.class.getName())\r\n.argumentMarshaller(new ArgumentCustomClientObjectMarshaller())\r\n.resultMarshaller(new ResultCustomClientObjectMarshaller())\r\n.build(),\r\nnew ArgumentCustomClientObject()\r\n);\r\n}\n'})})}),(0,l.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,l.jsx)(r.pre,{children:(0,l.jsx)(r.code,{className:"language-csharp",children:'using var client = await IgniteClient.StartAsync(\r\nnew IgniteClientConfiguration("address/to/cluster:port"));\r\n\r\nIJobExecution jobExec = await client.Compute.SubmitAsync(\r\nJobTarget.AnyNode(await client.GetClusterNodesAsync()),\r\nnew JobDescriptor("org.example.PojoComputeJob")\r\n{\r\nArgMarshaller = new MyJsonMarshaller(),\r\nResultMarshaller = new MyJsonMarshaller()\r\n},\r\nnew ArgumentCustomClientObject(1, "abc"));\r\n\r\nResultCustomClientObject result = await jobExec.GetResultAsync();\n'})})})]})]})}function p(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,l.jsx)(r,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/967c1bfd.113deaa7.js b/docs/ignite3/assets/js/967c1bfd.113deaa7.js deleted file mode 100644 index 5438d56766..0000000000 --- a/docs/ignite3/assets/js/967c1bfd.113deaa7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2355],{28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var r=t(96540);const s={},o=r.createContext(s);function i(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:n},e.children)}},98415:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"api-reference/native-clients/cpp/compute-api","title":"Compute API","description":"The Compute API executes distributed compute jobs across cluster nodes. It supports single-node execution, multi-node execution, colocated execution, and broadcast patterns.","source":"@site/docs/api-reference/native-clients/cpp/compute-api.md","sourceDirName":"api-reference/native-clients/cpp","slug":"/api-reference/native-clients/cpp/compute-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"Compute API","id":"compute-api","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Transactions API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api"},"next":{"title":"Network API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api"}}');var s=t(74848),o=t(28453);const i={title:"Compute API",id:"compute-api",sidebar_position:5},a="Compute API",c={},l=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Job Execution Model",id:"job-execution-model",level:3},{value:"Job Targeting",id:"job-targeting",level:3},{value:"Job Descriptors",id:"job-descriptors",level:3},{value:"Execution Handles",id:"execution-handles",level:3},{value:"Broadcast Execution",id:"broadcast-execution",level:3},{value:"Basic Usage",id:"basic-usage",level:2},{value:"Getting Cluster Nodes",id:"getting-cluster-nodes",level:3},{value:"Submitting Jobs",id:"submitting-jobs",level:3},{value:"Async Submission",id:"async-submission",level:3},{value:"Job Targets",id:"job-targets",level:2},{value:"Single Node Target",id:"single-node-target",level:3},{value:"Any Node Target",id:"any-node-target",level:3},{value:"Colocated Target",id:"colocated-target",level:3},{value:"Job Descriptors",id:"job-descriptors-1",level:2},{value:"Building Descriptors",id:"building-descriptors",level:3},{value:"Descriptor Components",id:"descriptor-components",level:3},{value:"Job Execution",id:"job-execution",level:2},{value:"Monitoring Execution",id:"monitoring-execution",level:3},{value:"Retrieving Results",id:"retrieving-results",level:3},{value:"Execution Information",id:"execution-information",level:3},{value:"Job Control",id:"job-control",level:2},{value:"Cancelling Jobs",id:"cancelling-jobs",level:3},{value:"Changing Priority",id:"changing-priority",level:3},{value:"Broadcast Execution",id:"broadcast-execution-1",level:2},{value:"Broadcasting to Multiple Nodes",id:"broadcasting-to-multiple-nodes",level:3},{value:"Async Broadcast",id:"async-broadcast",level:3},{value:"Processing Broadcast Results",id:"processing-broadcast-results",level:3},{value:"Binary Arguments",id:"binary-arguments",level:2},{value:"Passing Primitive Arguments",id:"passing-primitive-arguments",level:3},{value:"Passing Complex Arguments",id:"passing-complex-arguments",level:3},{value:"No Argument Jobs",id:"no-argument-jobs",level:3},{value:"Error Handling",id:"error-handling",level:2},{value:"Handling Job Errors",id:"handling-job-errors",level:3},{value:"Handling Submission Errors",id:"handling-submission-errors",level:3},{value:"Use Cases",id:"use-cases",level:2},{value:"Map-Reduce Pattern",id:"map-reduce-pattern",level:3},{value:"Colocated Processing",id:"colocated-processing",level:3},{value:"Batch Job Submission",id:"batch-job-submission",level:3},{value:"Reference",id:"reference",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"compute-api",children:"Compute API"})}),"\n",(0,s.jsx)(n.p,{children:"The Compute API executes distributed compute jobs across cluster nodes. It supports single-node execution, multi-node execution, colocated execution, and broadcast patterns."}),"\n",(0,s.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,s.jsx)(n.h3,{id:"job-execution-model",children:"Job Execution Model"}),"\n",(0,s.jsx)(n.p,{children:"Jobs are Java classes deployed on cluster nodes. The C++ client submits job execution requests with binary arguments. The server executes the job and returns results as binary objects."}),"\n",(0,s.jsx)(n.h3,{id:"job-targeting",children:"Job Targeting"}),"\n",(0,s.jsx)(n.p,{children:"Jobs execute on specific nodes based on targeting strategies:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Single Node"})," - Execute on one specific node"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Any Node"})," - Execute on any node from a set"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Colocated"})," - Execute on the node containing table partition data"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Broadcast"})," - Execute on all nodes in a set"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"job-descriptors",children:"Job Descriptors"}),"\n",(0,s.jsx)(n.p,{children:"Job descriptors specify the job class name, deployment units, and execution options. Deployment units identify code locations on the cluster. Execution options configure priority and other runtime parameters."}),"\n",(0,s.jsx)(n.h3,{id:"execution-handles",children:"Execution Handles"}),"\n",(0,s.jsx)(n.p,{children:"Submit operations return execution handles. Handles provide job monitoring, result retrieval, priority changes, and cancellation. Results become available after job completion."}),"\n",(0,s.jsx)(n.h3,{id:"broadcast-execution",children:"Broadcast Execution"}),"\n",(0,s.jsx)(n.p,{children:"Broadcast submits a single job to multiple nodes. It returns a broadcast execution handle containing individual execution handles for each node."}),"\n",(0,s.jsx)(n.h2,{id:"basic-usage",children:"Basic Usage"}),"\n",(0,s.jsx)(n.h3,{id:"getting-cluster-nodes",children:"Getting Cluster Nodes"}),"\n",(0,s.jsx)(n.p,{children:"Retrieve cluster topology:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nauto nodes = client.get_cluster_nodes();\r\n\r\nfor (const auto& node : nodes) {\r\n std::cout << "Node: " << node.get_name() << std::endl;\r\n std::cout << "ID: " << node.get_id() << std::endl;\r\n std::cout << "Address: " << node.get_address().host\r\n << ":" << node.get_address().port << std::endl;\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"submitting-jobs",children:"Submitting Jobs"}),"\n",(0,s.jsx)(n.p,{children:"Submit a job to any node:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto compute = client.get_compute();\r\nauto nodes = client.get_cluster_nodes();\r\n\r\nauto descriptor = job_descriptor::builder("com.example.MyJob").build();\r\nauto target = job_target::any_node(nodes);\r\n\r\nbinary_object arg; // Job argument\r\nauto execution = compute.submit(target, descriptor, arg);\r\n\r\nauto result = execution.get_result();\r\nif (result.has_value()) {\r\n // Process result\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"async-submission",children:"Async Submission"}),"\n",(0,s.jsx)(n.p,{children:"Submit without blocking:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"compute.submit_async(target, descriptor, arg,\r\n [](ignite_result result) {\r\n if (!result.has_error()) {\r\n auto execution = std::move(result).value();\r\n // Use execution handle\r\n }\r\n });\n"})}),"\n",(0,s.jsx)(n.h2,{id:"job-targets",children:"Job Targets"}),"\n",(0,s.jsx)(n.h3,{id:"single-node-target",children:"Single Node Target"}),"\n",(0,s.jsx)(n.p,{children:"Execute on a specific node:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto nodes = client.get_cluster_nodes();\r\nauto target_node = nodes[0];\r\n\r\nauto target = job_target::node(target_node);\r\nauto execution = compute.submit(target, descriptor, arg);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"any-node-target",children:"Any Node Target"}),"\n",(0,s.jsx)(n.p,{children:"Execute on any node from a set:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto nodes = client.get_cluster_nodes();\r\nauto target = job_target::any_node(nodes);\r\n\r\nauto execution = compute.submit(target, descriptor, arg);\n"})}),"\n",(0,s.jsx)(n.p,{children:"Create from vector:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"std::vector node_list = {node1, node2, node3};\r\nauto target = job_target::any_node(node_list);\n"})}),"\n",(0,s.jsx)(n.p,{children:"Create from set:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"std::set node_set = {node1, node2, node3};\r\nauto target = job_target::any_node(node_set);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"colocated-target",children:"Colocated Target"}),"\n",(0,s.jsx)(n.p,{children:"Execute on the node containing table data:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'ignite_tuple key{{"id", 42}};\r\nauto target = job_target::colocated("accounts", key);\r\n\r\nauto execution = compute.submit(target, descriptor, arg);\n'})}),"\n",(0,s.jsx)(n.p,{children:"Use qualified table names:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'qualified_name table_name = qualified_name::parse("my_schema.accounts");\r\nauto target = job_target::colocated(table_name, key);\n'})}),"\n",(0,s.jsx)(n.p,{children:"Colocated execution minimizes network overhead by running compute jobs where data resides."}),"\n",(0,s.jsx)(n.h2,{id:"job-descriptors-1",children:"Job Descriptors"}),"\n",(0,s.jsx)(n.h3,{id:"building-descriptors",children:"Building Descriptors"}),"\n",(0,s.jsx)(n.p,{children:"Create a basic descriptor:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto descriptor = job_descriptor::builder("com.example.MyJob").build();\n'})}),"\n",(0,s.jsx)(n.p,{children:"Add deployment units:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'std::vector units{\r\n {"my-app", "1.0.0"},\r\n {"my-lib", "2.1.0"}\r\n};\r\n\r\nauto descriptor = job_descriptor::builder("com.example.MyJob")\r\n .deployment_units(units)\r\n .build();\n'})}),"\n",(0,s.jsx)(n.p,{children:"Add execution options:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'job_execution_options opts;\r\nopts.priority(10);\r\n\r\nauto descriptor = job_descriptor::builder("com.example.MyJob")\r\n .execution_options(opts)\r\n .build();\n'})}),"\n",(0,s.jsx)(n.h3,{id:"descriptor-components",children:"Descriptor Components"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Job Class Name"})," - Fully qualified Java class name implementing the compute job interface"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Deployment Units"})," - List of units containing job code and dependencies"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Execution Options"})," - Priority and other runtime configuration"]}),"\n",(0,s.jsx)(n.h2,{id:"job-execution",children:"Job Execution"}),"\n",(0,s.jsx)(n.h3,{id:"monitoring-execution",children:"Monitoring Execution"}),"\n",(0,s.jsx)(n.p,{children:"Check job state:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto execution = compute.submit(target, descriptor, arg);\r\n\r\nauto state = execution.get_state();\r\nif (state.has_value()) {\r\n // Examine state\r\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"Get state asynchronously:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"execution.get_state_async([](ignite_result> result) {\r\n if (!result.has_error()) {\r\n auto state = std::move(result).value();\r\n if (state.has_value()) {\r\n // Examine state\r\n }\r\n }\r\n});\n"})}),"\n",(0,s.jsx)(n.p,{children:"State may be unavailable if the job has expired from the execution history."}),"\n",(0,s.jsx)(n.h3,{id:"retrieving-results",children:"Retrieving Results"}),"\n",(0,s.jsx)(n.p,{children:"Get result (blocks until completion):"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto result = execution.get_result();\r\n\r\nif (result.has_value()) {\r\n auto data = result.value();\r\n // Process binary object\r\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"Get result asynchronously:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"execution.get_result_async([](ignite_result> result) {\r\n if (!result.has_error()) {\r\n auto obj = std::move(result).value();\r\n if (obj.has_value()) {\r\n // Process result\r\n }\r\n }\r\n});\n"})}),"\n",(0,s.jsx)(n.h3,{id:"execution-information",children:"Execution Information"}),"\n",(0,s.jsx)(n.p,{children:"Access execution metadata:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto job_id = execution.get_id();\r\nauto node = execution.get_node();\r\n\r\nstd::cout << "Job ID: " << job_id << std::endl;\r\nstd::cout << "Executing on: " << node.get_name() << std::endl;\n'})}),"\n",(0,s.jsx)(n.h2,{id:"job-control",children:"Job Control"}),"\n",(0,s.jsx)(n.h3,{id:"cancelling-jobs",children:"Cancelling Jobs"}),"\n",(0,s.jsx)(n.p,{children:"Cancel a running job:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto execution = compute.submit(target, descriptor, arg);\r\n\r\nauto result = execution.cancel();\r\n\r\nswitch (result) {\r\n case job_execution::operation_result::SUCCESS:\r\n std::cout << "Job cancelled" << std::endl;\r\n break;\r\n case job_execution::operation_result::INVALID_STATE:\r\n std::cout << "Job already completed" << std::endl;\r\n break;\r\n case job_execution::operation_result::NOT_FOUND:\r\n std::cout << "Job not found" << std::endl;\r\n break;\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Cancel asynchronously:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"execution.cancel_async([](ignite_result result) {\r\n if (!result.has_error()) {\r\n auto status = result.value();\r\n // Check status\r\n }\r\n});\n"})}),"\n",(0,s.jsx)(n.h3,{id:"changing-priority",children:"Changing Priority"}),"\n",(0,s.jsx)(n.p,{children:"Modify job execution priority:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto execution = compute.submit(target, descriptor, arg);\r\n\r\nauto result = execution.change_priority(5);\r\n\r\nif (result == job_execution::operation_result::SUCCESS) {\r\n std::cout << "Priority changed" << std::endl;\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Change priority asynchronously:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"execution.change_priority_async(5,\r\n [](ignite_result result) {\r\n // Handle result\r\n });\n"})}),"\n",(0,s.jsx)(n.p,{children:"Higher priority values execute before lower priority jobs in the queue."}),"\n",(0,s.jsx)(n.h2,{id:"broadcast-execution-1",children:"Broadcast Execution"}),"\n",(0,s.jsx)(n.h3,{id:"broadcasting-to-multiple-nodes",children:"Broadcasting to Multiple Nodes"}),"\n",(0,s.jsx)(n.p,{children:"Execute on all nodes in a set:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto nodes = client.get_cluster_nodes();\r\nstd::set node_set(nodes.begin(), nodes.end());\r\n\r\nauto target = broadcast_job_target::nodes(node_set);\r\nauto broadcast = compute.submit_broadcast(target, descriptor, arg);\n"})}),"\n",(0,s.jsx)(n.p,{children:"Broadcast to a single node:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto target = broadcast_job_target::node(specific_node);\r\nauto broadcast = compute.submit_broadcast(target, descriptor, arg);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"async-broadcast",children:"Async Broadcast"}),"\n",(0,s.jsx)(n.p,{children:"Submit broadcast without blocking:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"compute.submit_broadcast_async(target, descriptor, arg,\r\n [](ignite_result result) {\r\n if (!result.has_error()) {\r\n auto broadcast = std::move(result).value();\r\n // Use broadcast execution\r\n }\r\n });\n"})}),"\n",(0,s.jsx)(n.h3,{id:"processing-broadcast-results",children:"Processing Broadcast Results"}),"\n",(0,s.jsx)(n.p,{children:"Access individual executions:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'auto broadcast = compute.submit_broadcast(target, descriptor, arg);\r\nauto executions = broadcast.get_job_executions();\r\n\r\nfor (auto& exec_result : executions) {\r\n if (exec_result.has_value()) {\r\n auto execution = exec_result.value();\r\n auto result = execution.get_result();\r\n\r\n if (result.has_value()) {\r\n std::cout << "Node " << execution.get_node().get_name()\r\n << " result: " << /* process result */ << std::endl;\r\n }\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Each execution in the broadcast operates independently. Retrieve results individually from each execution handle."}),"\n",(0,s.jsx)(n.h2,{id:"binary-arguments",children:"Binary Arguments"}),"\n",(0,s.jsx)(n.h3,{id:"passing-primitive-arguments",children:"Passing Primitive Arguments"}),"\n",(0,s.jsx)(n.p,{children:"Jobs accept binary_object arguments. Wrap primitive values:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"binary_object arg(42); // Integer argument\r\nauto execution = compute.submit(target, descriptor, arg);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"passing-complex-arguments",children:"Passing Complex Arguments"}),"\n",(0,s.jsx)(n.p,{children:"Create binary objects from serialized data:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"// Serialize your data structure to bytes\r\nstd::vector data = serialize_my_data(my_object);\r\nbinary_object arg(data);\r\n\r\nauto execution = compute.submit(target, descriptor, arg);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"no-argument-jobs",children:"No Argument Jobs"}),"\n",(0,s.jsx)(n.p,{children:"Pass empty binary object for jobs without arguments:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"binary_object empty_arg;\r\nauto execution = compute.submit(target, descriptor, empty_arg);\n"})}),"\n",(0,s.jsx)(n.h2,{id:"error-handling",children:"Error Handling"}),"\n",(0,s.jsx)(n.h3,{id:"handling-job-errors",children:"Handling Job Errors"}),"\n",(0,s.jsx)(n.p,{children:"Job execution errors propagate to the client:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'try {\r\n auto result = execution.get_result();\r\n // Process result\r\n} catch (const ignite_error& e) {\r\n std::cerr << "Job failed: " << e.what_str() << std::endl;\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"With async operations:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'execution.get_result_async([](ignite_result> result) {\r\n if (result.has_error()) {\r\n std::cerr << "Error: " << result.error().what_str() << std::endl;\r\n } else {\r\n // Process result\r\n }\r\n});\n'})}),"\n",(0,s.jsx)(n.h3,{id:"handling-submission-errors",children:"Handling Submission Errors"}),"\n",(0,s.jsx)(n.p,{children:"Handle submission failures:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'try {\r\n auto execution = compute.submit(target, descriptor, arg);\r\n} catch (const ignite_error& e) {\r\n std::cerr << "Submission failed: " << e.what_str() << std::endl;\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Common errors include missing deployment units, invalid job class names, and network failures."}),"\n",(0,s.jsx)(n.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,s.jsx)(n.h3,{id:"map-reduce-pattern",children:"Map-Reduce Pattern"}),"\n",(0,s.jsx)(n.p,{children:"Submit jobs to multiple nodes and aggregate results:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"auto nodes = client.get_cluster_nodes();\r\nstd::vector executions;\r\n\r\n// Map: Submit jobs to all nodes\r\nfor (const auto& node : nodes) {\r\n auto target = job_target::node(node);\r\n executions.push_back(compute.submit(target, map_job, arg));\r\n}\r\n\r\n// Reduce: Collect and aggregate results\r\nstd::vector results;\r\nfor (auto& execution : executions) {\r\n auto result = execution.get_result();\r\n if (result.has_value()) {\r\n results.push_back(result.value());\r\n }\r\n}\r\n\r\nauto final_result = reduce(results);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"colocated-processing",children:"Colocated Processing"}),"\n",(0,s.jsx)(n.p,{children:"Process data where it resides:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:'// Execute compute job on the node containing this key\r\nignite_tuple key{{"customer_id", 12345}};\r\nauto target = job_target::colocated("orders", key);\r\n\r\nauto descriptor = job_descriptor::builder("com.example.OrderProcessor").build();\r\nauto execution = compute.submit(target, descriptor, arg);\r\n\r\nauto result = execution.get_result();\n'})}),"\n",(0,s.jsx)(n.h3,{id:"batch-job-submission",children:"Batch Job Submission"}),"\n",(0,s.jsx)(n.p,{children:"Submit multiple jobs in parallel:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-cpp",children:"std::vector executions;\r\n\r\nfor (const auto& work_item : work_items) {\r\n auto execution = compute.submit(target, descriptor, work_item);\r\n executions.push_back(std::move(execution));\r\n}\r\n\r\n// Wait for all to complete\r\nfor (auto& execution : executions) {\r\n execution.get_result();\r\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/cppdoc/",children:"C++ API Documentation"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"../../../develop/work-with-data/compute",children:"Compute Concept"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"./client-api",children:"Client API"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"./network-api",children:"Network API"})}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/994e0b8f.d38139f0.js b/docs/ignite3/assets/js/994e0b8f.d38139f0.js deleted file mode 100644 index 5e0526be81..0000000000 --- a/docs/ignite3/assets/js/994e0b8f.d38139f0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1232],{28453:(e,r,n)=>{n.d(r,{R:()=>a,x:()=>o});var i=n(96540);const t={},s=i.createContext(t);function a(e){const r=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(s.Provider,{value:r},e.children)}},96729:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"understand/architecture/storage-engines/aipersist","title":"AIPersist Storage Engine","description":"The AIPersist engine (aipersist) provides durable storage using B+ tree data structures with checkpoint-based persistence. Data is stored in partition files on disk with an in-memory page cache for fast access. This is the default storage engine.","source":"@site/docs/understand/architecture/storage-engines/aipersist.md","sourceDirName":"understand/architecture/storage-engines","slug":"/understand/architecture/storage-engines/aipersist","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"id":"aipersist","title":"AIPersist Storage Engine","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"AIMemory Storage Engine","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem"},"next":{"title":"RocksDB Storage Engine","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb"}}');var t=n(74848),s=n(28453);const a={id:"aipersist",title:"AIPersist Storage Engine",sidebar_position:1},o="AIPersist Storage Engine",c={},d=[{value:"Storage Architecture",id:"storage-architecture",level:2},{value:"Checkpointing",id:"checkpointing",level:2},{value:"Write Throttling",id:"write-throttling",level:2},{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Configuration Example",id:"configuration-example",level:2},{value:"Usage",id:"usage",level:2}];function l(e){const r={code:"code",h1:"h1",h2:"h2",header:"header",li:"li",mermaid:"mermaid",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"aipersist-storage-engine",children:"AIPersist Storage Engine"})}),"\n",(0,t.jsxs)(r.p,{children:["The AIPersist engine (",(0,t.jsx)(r.code,{children:"aipersist"}),") provides durable storage using B+ tree data structures with checkpoint-based persistence. Data is stored in partition files on disk with an in-memory page cache for fast access. This is the default storage engine."]}),"\n",(0,t.jsx)(r.h2,{id:"storage-architecture",children:"Storage Architecture"}),"\n",(0,t.jsx)(r.mermaid,{value:'flowchart TB\r\n subgraph "Memory"\r\n PC[Page Cache]\r\n CB[Checkpoint Buffer]\r\n DP[Dirty Pages]\r\n end\r\n\r\n subgraph "Disk Storage"\r\n subgraph "Partition Files"\r\n PF1[table-1/part-0.bin]\r\n PF2[table-1/part-1.bin]\r\n PF3[table-1/part-2.bin]\r\n end\r\n subgraph "Delta Files"\r\n DF1[part-0-delta-0.bin]\r\n DF2[part-0-delta-1.bin]\r\n end\r\n end\r\n\r\n subgraph "Data Structures"\r\n VCT[VersionChainTree
                                                              Row Data]\r\n SIT[SortedIndexTree]\r\n HIT[HashIndexTree]\r\n IMT[IndexMetaTree]\r\n end\r\n\r\n PC --\x3e DP\r\n DP --\x3e CB\r\n CB --\x3e|"Checkpoint"| PF1 & PF2 & PF3\r\n PF1 --\x3e DF1 & DF2\r\n PC --\x3e VCT & SIT & HIT & IMT'}),"\n",(0,t.jsx)(r.p,{children:"Storage organization:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["Each partition stored in a separate file: ",(0,t.jsx)(r.code,{children:"table-{tableId}/part-{partitionId}.bin"})]}),"\n",(0,t.jsx)(r.li,{children:"Delta files capture incremental changes between checkpoints"}),"\n",(0,t.jsx)(r.li,{children:"B+ trees store version chains (row data), sorted indexes, hash indexes, and metadata"}),"\n",(0,t.jsx)(r.li,{children:"Default page size: 16 KB"}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"checkpointing",children:"Checkpointing"}),"\n",(0,t.jsx)(r.p,{children:"Checkpointing flushes dirty pages from memory to partition files on disk. This process ensures durability and enables crash recovery."}),"\n",(0,t.jsx)(r.mermaid,{value:"sequenceDiagram\r\n participant App as Application\r\n participant PC as Page Cache\r\n participant CB as Checkpoint Buffer\r\n participant CP as Checkpoint Writer\r\n participant Disk as Partition Files\r\n\r\n App->>PC: Write Operation\r\n PC->>PC: Mark Page Dirty\r\n\r\n Note over CP: Checkpoint Interval (default: 180s)\r\n\r\n CP->>PC: Begin Checkpoint\r\n PC->>CB: Copy Dirty Pages\r\n CP->>Disk: Write Pages\r\n\r\n alt Page Modified During Checkpoint\r\n App->>PC: Update Page\r\n PC->>CB: Copy Previous State\r\n end\r\n\r\n CP->>Disk: Finalize Checkpoint\r\n CP->>CB: Clear Buffer"}),"\n",(0,t.jsx)(r.p,{children:"Checkpoint configuration:"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Default"}),(0,t.jsx)(r.th,{children:"Description"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"intervalMillis"})}),(0,t.jsx)(r.td,{children:"180000"}),(0,t.jsx)(r.td,{children:"Time between checkpoints (3 minutes)"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"intervalDeviationPercent"})}),(0,t.jsx)(r.td,{children:"40"}),(0,t.jsx)(r.td,{children:"Random deviation to prevent synchronized checkpoints"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"checkpointThreads"})}),(0,t.jsx)(r.td,{children:"-"}),(0,t.jsx)(r.td,{children:"Number of checkpoint writer threads"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"compactionThreads"})}),(0,t.jsx)(r.td,{children:"-"}),(0,t.jsx)(r.td,{children:"Number of compaction threads"})]})]})]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"# Configure checkpoint interval to 2 minutes\r\nnode config update ignite.storage.engines.aipersist.checkpoint.intervalMillis=120000\n"})}),"\n",(0,t.jsx)(r.h2,{id:"write-throttling",children:"Write Throttling"}),"\n",(0,t.jsx)(r.p,{children:"When the checkpoint buffer reaches two-thirds capacity (66.7%), write throttling activates to prevent buffer overflow."}),"\n",(0,t.jsx)(r.mermaid,{value:'flowchart LR\r\n subgraph "Checkpoint Buffer State"\r\n direction TB\r\n G[0-66%
                                                              Normal]\r\n Y[66-90%
                                                              Throttled]\r\n R[90-100%
                                                              Heavy Throttling]\r\n end\r\n\r\n G --\x3e|"Buffer fills"| Y\r\n Y --\x3e|"Buffer fills"| R\r\n R --\x3e|"Checkpoint completes"| G'}),"\n",(0,t.jsx)(r.p,{children:"Throttling behavior:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"Below 66%: Normal operation, no throttling"}),"\n",(0,t.jsx)(r.li,{children:"66% to 90%: Progressive throttling, checkpoint priority increases"}),"\n",(0,t.jsx)(r.li,{children:"Above 90%: Heavy throttling, updates significantly delayed"}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"Write throttling indicates either slow disk I/O or excessive write rate. Monitor throttling metrics to identify bottlenecks."}),"\n",(0,t.jsx)(r.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Property"}),(0,t.jsx)(r.th,{children:"Default"}),(0,t.jsx)(r.th,{children:"Description"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"engine"})}),(0,t.jsx)(r.td,{children:"-"}),(0,t.jsxs)(r.td,{children:["Must be ",(0,t.jsx)(r.code,{children:'"aipersist"'})]})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:(0,t.jsx)(r.code,{children:"sizeBytes"})}),(0,t.jsx)(r.td,{children:"Dynamic"}),(0,t.jsxs)(r.td,{children:["Storage size. Defaults to ",(0,t.jsx)(r.code,{children:"max(256 MB, 20% of physical RAM)"})]})]})]})]}),"\n",(0,t.jsx)(r.h2,{id:"configuration-example",children:"Configuration Example"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-json",children:'{\r\n "ignite": {\r\n "storage": {\r\n "profiles": [\r\n {\r\n "engine": "aipersist",\r\n "name": "persistent_profile",\r\n "sizeBytes": 2147483648\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:'# CLI equivalent\r\nnode config update "ignite.storage.profiles:{persistent_profile{engine:aipersist,sizeBytes:2147483648}}"\n'})}),"\n",(0,t.jsx)(r.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"default"})," profile uses aipersist automatically. For custom profiles:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-sql",children:"-- Create a zone with the persistent profile\r\nCREATE ZONE transaction_zone\r\n WITH PARTITIONS=25, REPLICAS=3,\r\n STORAGE PROFILES ['persistent_profile'];\r\n\r\n-- Create a durable table\r\nCREATE TABLE orders (\r\n order_id BIGINT PRIMARY KEY,\r\n customer_id INT,\r\n total DECIMAL(15,2),\r\n created_at TIMESTAMP\r\n) ZONE transaction_zone STORAGE PROFILE 'persistent_profile';\n"})})]})}function h(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/9a925e23.c8e1a236.js b/docs/ignite3/assets/js/9a925e23.c8e1a236.js deleted file mode 100644 index 8c67d09665..0000000000 --- a/docs/ignite3/assets/js/9a925e23.c8e1a236.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2527],{26:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"quick-start/getting-started-guide","title":"Getting Started With Apache Ignite 3","description":"{/*","source":"@site/versioned_docs/version-3.0.0/quick-start/getting-started-guide.md","sourceDirName":"quick-start","slug":"/quick-start/getting-started-guide","permalink":"/docs/ignite3/3.0.0/quick-start/getting-started-guide","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Getting Started With Apache Ignite 3","sidebar_label":"Getting Started"},"sidebar":"tutorialSidebar","previous":{"title":"Migration From Apache Ignite 2","permalink":"/docs/ignite3/3.0.0/installation/migration-from-ai2/"},"next":{"title":"Getting Started","permalink":"/docs/ignite3/3.0.0/quick-start/getting-started-guide"}}');var r=t(74848),l=t(28453),s=t(11470),a=t(19365);const o={title:"Getting Started With Apache Ignite 3",sidebar_label:"Getting Started"},d=void 0,c={},h=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Install Ignite",id:"install-ignite",level:2},{value:"Start Ignite Node",id:"start-ignite-node",level:2},{value:"Start the Ignite CLI",id:"start-the-ignite-cli",level:2},{value:"Initialize Your Cluster",id:"initialize-your-cluster",level:2},{value:"Run SQL Statements Against the Cluster",id:"run-sql-statements-against-the-cluster",level:2},{value:"Stop the Node",id:"stop-the-node",level:2},{value:"Extended Cluster Startup Tutorial",id:"extended-cluster-startup-tutorial",level:2},{value:"Optional: Starting Multiple Ignite Nodes in Docker",id:"optional-starting-multiple-ignite-nodes-in-docker",level:3},{value:"Optional: Start Multiple Ignite Nodes on Different Hosts",id:"optional-start-multiple-ignite-nodes-on-different-hosts",level:3},{value:"List all Nodes in NodeFinder",id:"list-all-nodes-in-nodefinder",level:4},{value:"Change Node Names",id:"change-node-names",level:4},{value:"Start all Nodes",id:"start-all-nodes",level:4},{value:"Initialize Your Cluster",id:"initialize-your-cluster-1",level:4},{value:"Next Steps",id:"next-steps",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n","\n",(0,r.jsx)(n.p,{children:"This guide shows you how to start working with Ignite. In this guide, we will download Ignite from the website, install it, start the database and perform some simple SQL queries by using the provided CLI tool."}),"\n",(0,r.jsxs)(n.p,{children:["We will be using the ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/installation/installing-using-zip",children:"zip archive"})," to demonstrate how to use Ignite. When using ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/installation/deb-rpm",children:"deb or rpm packages"}),", or when running Ignite in Docker, some steps may be different."]}),"\n",(0,r.jsxs)(n.p,{children:["If you are more comfortable with running the database from Java code, you can try ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/quick-start/embedded-mode",children:"starting Ignite from code"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"This section describes the platform requirements for machines running Ignite. Ignite system requirements scale depending on the size of the cluster."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Requirement"}),(0,r.jsx)(n.th,{children:"Details"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"JDK"}),(0,r.jsx)(n.td,{children:"11 and later"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"OS"}),(0,r.jsx)(n.td,{children:"Linux (Debian and Red Hat flavours), Windows 10 or 11"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ISA"}),(0,r.jsx)(n.td,{children:"x86 or x64"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"install-ignite",children:"Install Ignite"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://ignite.apache.org/download.cgi",children:"Download"})," Ignite from the website. This archive contains everything related to the Ignite database itself."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Also from the same page, download the ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool",children:"Ignite command line interface"}),". This tool is the main way of interacting with Ignite database and will be used in the tutorial."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Unpack the downloaded archives:"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"unix",label:"Unix",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"unzip ignite3-3.0.0.zip\n"})})}),(0,r.jsx)(a.A,{value:"powershell",label:"Windows (PowerShell)",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"Expand-Archive ignite3-3.0.0.zip -DestinationPath .\n"})})}),(0,r.jsx)(a.A,{value:"cmd",label:"Windows (CMD)",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"unzip -xf ignite3-3.0.0.zip\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Now you should have the ",(0,r.jsx)(n.code,{children:"ignite3-db-3.0.0"})," and ",(0,r.jsx)(n.code,{children:"ignite3-cli-3.0.0"})," directories that we will be using in this tutorial, and the license file provided via e-mail."]}),"\n",(0,r.jsx)(n.h2,{id:"start-ignite-node",children:"Start Ignite Node"}),"\n",(0,r.jsxs)(n.p,{children:["Ignite is a distributed database, that runs on a collection of ",(0,r.jsx)(n.strong,{children:"nodes"}),". Ignite database instances that contain data. When running Ignite, you would typically run multiple nodes, a ",(0,r.jsx)(n.strong,{children:"cluster"}),", that shares information and evenly distributes data across its nodes. In this part of the tutorial, we will only run one node, but a later part shows how you can start multiple."]}),"\n",(0,r.jsx)(n.p,{children:"To start a locally running node:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Navigate to the ",(0,r.jsx)(n.code,{children:"ignite3-db-3.0.0"})," directory."]}),"\n",(0,r.jsxs)(n.li,{children:["Run the ",(0,r.jsx)(n.code,{children:"ignite3db"})," script:"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"linux",label:"Linux",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"bin/ignite3db\n"})})}),(0,r.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"You need to install Java in the Bash environment to run Ignite on Windows."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"bash bin\\ignite3db\n"})})]})]}),"\n",(0,r.jsx)(n.h2,{id:"start-the-ignite-cli",children:"Start the Ignite CLI"}),"\n",(0,r.jsxs)(n.p,{children:["The primary means of interacting with your nodes and cluster is the ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool",children:"Ignite CLI"}),". It can connect to a node running on a local or remote machine, and is the main tool that is used to manually configure and manage the database. In this example, we will be connecting to a local node."]}),"\n",(0,r.jsx)(n.p,{children:"To start the Ignite CLI:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Navigate to the ",(0,r.jsx)(n.code,{children:"ignite3-cli-3.0.0"})," directory."]}),"\n",(0,r.jsx)(n.li,{children:"Run the following command:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"linux",label:"Linux",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"bin/ignite3\n"})})}),(0,r.jsxs)(a.A,{value:"windows",label:"Windows",children:[(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"You need to install Java in the Bash environment to run Ignite on Windows."})}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"bash bin\\ignite3\n"})})]})]}),"\n",(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Confirm the connection the CLI tool attempts to establish with the node running on the default URI."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["If your node is running at a different address, use the ",(0,r.jsx)(n.code,{children:"connect"})," command to connect to the node. For example:"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"connect http://127.0.0.1:10300\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Connected to http://127.0.0.1:10300\n"})})})]}),"\n",(0,r.jsx)(n.h2,{id:"initialize-your-cluster",children:"Initialize Your Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["Ignite database functions as a cluster. Even if we are currently only running a single node, theoretically you could start another node and have it join the already running cluster. When the nodes are started, they find each other and wait for the user to start the cluster. The process of starting a cluster is called ",(0,r.jsx)(n.em,{children:"initialization"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To initialize the cluster with the node you have started (see ",(0,r.jsx)(n.a,{href:"#start-ignite-node",children:"Start Ignite Node"}),"), run the following command:"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster init --name=sampleCluster\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Cluster was initialized successfully\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Optionally, you can pass the ",(0,r.jsx)(n.code,{children:"--metastorage-group"})," parameter to specify the nodes that will be used to store cluster meta information. In most scenarios, you want to have 3, 5 or 7 metastorage group nodes. For more information on what they are and cluster lifecycle, see ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/lifecycle",children:"Cluster Lifecycle"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsxs)(n.p,{children:["Cluster and node configurations in Ignite are separated and cannot be used interchangeably. When initializing a cluster, make sure to provide the ",(0,r.jsx)(n.strong,{children:"cluster"})," configuration file."]})}),"\n",(0,r.jsx)(n.h2,{id:"run-sql-statements-against-the-cluster",children:"Run SQL Statements Against the Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["Once your cluster has been initialized, you can start working with it. In this tutorial, we will be using the CLI tool to create a table, insert some rows and retrieve data. In most real scenarios you would have a ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/clients/",children:"client"})," writing data to a cluster and retrieving it, but the CLI tool can still be used for debugging or minor adjustments."]}),"\n",(0,r.jsx)(n.p,{children:"To work with the SQL in CLI:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Enter the SQL REPL mode. In this mode, you will have access to SQL hints and command completion:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sql\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sql-cli>\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["Use the ",(0,r.jsx)(n.code,{children:"CREATE TABLE"})," statement to create a new table:"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"CREATE TABLE IF NOT EXISTS Person (id int primary key, city varchar, name varchar, age int, company varchar)\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Updated 0 rows.\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsxs)(n.li,{children:["Fill the table with data using the ",(0,r.jsx)(n.code,{children:"INSERT"})," statement:"]}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"INSERT INTO Person (id, city, name, age, company) VALUES (1, 'London', 'John Doe', 42, 'Apache')\r\nINSERT INTO Person (id, city, name, age, company) VALUES (2, 'New York', 'Jane Doe', 36, 'Apache')\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Updated 1 rows.\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"4",children:["\n",(0,r.jsx)(n.li,{children:"Get all the data you inserted in the previous step:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"SELECT * FROM Person\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\u2554\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 ID \u2502 CITY \u2502 NAME \u2502 AGE \u2502 COMPANY \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 2 \u2502 New York \u2502 Jane Doe \u2502 36 \u2502 Apache \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 1 \u2502 London \u2502 John Doe \u2502 42 \u2502 Apache \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"5",children:["\n",(0,r.jsxs)(n.li,{children:["If needed, exit the REPL mode with the ",(0,r.jsx)(n.code,{children:"exit"})," command."]}),"\n"]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["For more information about available SQL statements, see the ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl",children:"SQL Reference"})," section."]})}),"\n",(0,r.jsx)(n.h2,{id:"stop-the-node",children:"Stop the Node"}),"\n",(0,r.jsxs)(n.p,{children:["After you are done working with your cluster, you need to stop the node by stopping the ",(0,r.jsx)(n.code,{children:"ignite3db"})," process:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Unix: ",(0,r.jsx)(n.code,{children:"Control + C"})]}),"\n",(0,r.jsxs)(n.li,{children:["Windows: ",(0,r.jsx)(n.code,{children:"Ctrl+C"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can also exit the CLI tool with the ",(0,r.jsx)(n.code,{children:"exit"})," command."]}),"\n",(0,r.jsx)(n.p,{children:"The cluster will remain initialized, and ready once again when you restart the node."}),"\n",(0,r.jsx)(n.h2,{id:"extended-cluster-startup-tutorial",children:"Extended Cluster Startup Tutorial"}),"\n",(0,r.jsx)(n.p,{children:"Ignite 3 is designed to work in a cluster of 3 or more nodes at once. While a single node can be used in some scenarios and can be used for the tutorial, having multiple nodes in a cluster is the most common use case. The steps below provide optional alternatives to starting your cluster, in case you want to run the tutorial on multiple nodes in a cluster that is closer to what would be encountered in real scenarios."}),"\n",(0,r.jsx)(n.h3,{id:"optional-starting-multiple-ignite-nodes-in-docker",children:"Optional: Starting Multiple Ignite Nodes in Docker"}),"\n",(0,r.jsx)(n.p,{children:"To run multiple instances of Ignite, you would normally install it on multiple machines before starting a cluster. If you want to run an Ignite cluster on local VMs for this tutorial, we recommend using a Docker image:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Create a ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file with the cluster configuration (see ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/installation/installing-using-docker",children:"Installing Using Docker"})," for details)"]}),"\n",(0,r.jsx)(n.li,{children:"Download the Docker image:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker pull apacheignite/ignite:3.0.0\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"latest: Pulling from ignite/ignite3\r\n3713021b0277: Pull complete\r\nfea31cb87980: Pull complete\r\n07f7cfe80ff6: Pull complete\r\nab1fd3f4849e: Pull complete\r\n34896af28f87: Pull complete\r\nDigest: sha256:43ab9cfb8f58b66e4a5027d4ed529216963d0bcab3fa3fc6d5e2042fa3dd5a74\r\nStatus: Downloaded newer image for ignite/ignite3:latest\r\ndocker.io/ignite/ignite3:latest\n"})})})]}),"\n",(0,r.jsxs)(n.ol,{start:"3",children:["\n",(0,r.jsx)(n.li,{children:"Run the Docker compose command, providing the previously downloaded compose file:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker compose -f docker-compose.yml up -d\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"[+] Running 4/4\r\n \u2714 Network ignite3_default Created 0.8s\r\n \u2714 Container ignite3-node1-1 Started 3.2s\r\n \u2714 Container ignite3-node2-1 Started 1.7s\r\n \u2714 Container ignite3-node3-1 Started 3.4s\n"})})})]}),"\n",(0,r.jsx)(n.p,{children:"3 nodes start in Docker and become available through the CLI tool that can be run locally."}),"\n",(0,r.jsxs)(n.ol,{start:"4",children:["\n",(0,r.jsx)(n.li,{children:"Make sure you initialize your cluster before attempting to work with it:"}),"\n"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster init --name=sampleCluster\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Cluster was initialized successfully\n"})})})]}),"\n",(0,r.jsx)(n.h3,{id:"optional-start-multiple-ignite-nodes-on-different-hosts",children:"Optional: Start Multiple Ignite Nodes on Different Hosts"}),"\n",(0,r.jsx)(n.p,{children:"In the examples above, we were running a single node, or a small cluster that used predefined configuration. Creating a Ignite cluster on several hosts involves adjustments to its configuration."}),"\n",(0,r.jsx)(n.h4,{id:"list-all-nodes-in-nodefinder",children:"List all Nodes in NodeFinder"}),"\n",(0,r.jsxs)(n.p,{children:["When nodes are running, they use the node finder configuration. When the node starts, it loads the configuration file from ",(0,r.jsx)(n.code,{children:"/etc/ignite-config.conf"}),". Add the addresses to the ",(0,r.jsx)(n.code,{children:"network.nodeFinder"})," configuration, for example for the 3-node cluster:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "nodeFinder" : {\r\n "netClusterNodes" : [\r\n "localhost:3344",\r\n "otherhost:3344",\r\n "thirdhost:3344"\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Now, when the node starts, it automatically tries to find nodes at the listed addresses. You can see the current configuration of a running node at any point by running the following command from the CLI tool:"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node config show ignite.network.nodeFinder\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'{\r\n "netClusterNodes" : [ "localhost:3344", "otherhost:3344", "thirdhost:3344" ],\r\n "type" : "STATIC"\r\n}\n'})})})]}),"\n",(0,r.jsx)(n.p,{children:"If the node is already running, you can also use the CLI tool to change node configuration, for example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'node config update ignite.network.nodeFinder.netClusterNodes=["localhost:3344", "otherHost:3344"]\n'})}),"\n",(0,r.jsx)(n.p,{children:"This change requires the node restart to take effect."}),"\n",(0,r.jsx)(n.h4,{id:"change-node-names",children:"Change Node Names"}),"\n",(0,r.jsxs)(n.p,{children:["You need to make sure that all nodes in the cluster have different names. Node name is defined in the ",(0,r.jsx)(n.code,{children:"/etc/vars.env"})," file. Change the ",(0,r.jsx)(n.code,{children:"NODE_NAME"})," variable to have unique name for each node in cluster, otherwise it will be impossible for the nodes with conflicting names to enter the same cluster."]}),"\n",(0,r.jsx)(n.h4,{id:"start-all-nodes",children:"Start all Nodes"}),"\n",(0,r.jsxs)(n.p,{children:["Start each node as described in ",(0,r.jsx)(n.a,{href:"#start-ignite-node",children:"Start Ignite Node"}),"."]}),"\n",(0,r.jsx)(n.h4,{id:"initialize-your-cluster-1",children:"Initialize Your Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["Before initializing the cluster, it is important to check that all nodes found each other and can connect into a cluster. Nodes visible to each other, but not necessarily connected into a cluster form ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/lifecycle",children:"physical topology"}),". You can check it by connecting to any node using the CLI tool and executing the following command:"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster topology physical\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 name \u2502 host \u2502 port \u2502 consistent id \u2502 id \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 node1 \u2502 172.19.0.4 \u2502 3344 \u2502 node1 \u2502 0c61dad3-bc4c-4c60-8772-1a903632dcb4 \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 node2 \u2502 172.19.0.2 \u2502 3344 \u2502 node2 \u2502 21f516bd-0774-4c53-bbfb-ad21bc21c500 \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 node3 \u2502 172.19.0.3 \u2502 3344 \u2502 node3 \u2502 b2bbfbff-eb08-4252-b154-681c49164708 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})})})]}),"\n",(0,r.jsx)(n.p,{children:"The command lists the nodes visible to the node you are connecting to, their addresses, names, and IDs. Once you are certain all nodes are running and visible, initialize your cluster:"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster init --name=sampleCluster\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Cluster was initialized successfully\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Once the cluster starts, the nodes in it will form the ",(0,r.jsx)(n.em,{children:"logical topology"}),". You can check if all nodes have entered the cluster by using the following command:"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(a.A,{value:"command",label:"Command",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster topology logical\n"})})}),(0,r.jsx)(a.A,{value:"output",label:"Output",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 name \u2502 host \u2502 port \u2502 consistent id \u2502 id \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 node1 \u2502 172.19.0.4 \u2502 3344 \u2502 node1 \u2502 0c61dad3-bc4c-4c60-8772-1a903632dcb4 \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 node2 \u2502 172.19.0.2 \u2502 3344 \u2502 node2 \u2502 21f516bd-0774-4c53-bbfb-ad21bc21c500 \u2551\r\n\u255f\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2562\r\n\u2551 node3 \u2502 172.19.0.3 \u2502 3344 \u2502 node3 \u2502 b2bbfbff-eb08-4252-b154-681c49164708 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})})})]}),"\n",(0,r.jsx)(n.p,{children:"If all nodes are in the command output, the cluster is now started and can be worked with."}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsx)(n.p,{children:"From here, you may want to:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Check out the ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool",children:"Ignite CLI Tool"})," page for more detail on supported commands"]}),"\n",(0,r.jsxs)(n.li,{children:["Try out our ",(0,r.jsx)(n.a,{href:"https://github.com/apache/ignite-3/tree/main/examples",children:"examples"})]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},11470:(e,n,t)=>{t.d(n,{A:()=>I});var i=t(96540),r=t(34164),l=t(17559),s=t(23104),a=t(56347),o=t(205),d=t(57485),c=t(31682),h=t(70679);function u(e){return i.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,i.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:t,default:i}})=>({value:e,label:n,attributes:t,default:i}))}(t);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function x({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const t=(0,a.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,d.aZ)(r),(0,i.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,l=p(e),[s,a]=(0,i.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:l})),[d,c]=g({queryString:t,groupId:r}),[u,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,h.Dv)(n);return[t,(0,i.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),j=(()=>{const e=d??u;return x({value:e,tabValues:l})?e:null})();(0,o.A)(()=>{j&&a(j)},[j]);return{selectedValue:s,selectValue:(0,i.useCallback)(e=>{if(!x({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);a(e),c(e),m(e)},[c,m,l]),tabValues:l}}var j=t(92303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=t(74848);function v({className:e,block:n,selectedValue:t,selectValue:i,tabValues:l}){const a=[],{blockElementScrollPositionUntilNextRender:o}=(0,s.a_)(),d=e=>{const n=e.currentTarget,r=a.indexOf(n),s=l[r].value;s!==t&&(o(n),i(s))},c=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;n=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;n=a[t]??a[a.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:i})=>(0,b.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{a.push(e)},onKeyDown:c,onClick:d,...i,className:(0,r.A)("tabs__item",f.tabItem,i?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function w({lazy:e,children:n,selectedValue:t}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===t);return e?(0,i.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function y(e){const n=m(e);return(0,b.jsxs)("div",{className:(0,r.A)(l.G.tabs.container,"tabs-container",f.tabList),children:[(0,b.jsx)(v,{...n,...e}),(0,b.jsx)(w,{...n,...e})]})}function I(e){const n=(0,j.A)();return(0,b.jsx)(y,{...e,children:u(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var i=t(34164);const r={tabItem:"tabItem_Ymn6"};var l=t(74848);function s({children:e,hidden:n,className:t}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,i.A)(r.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(96540);const r={},l=i.createContext(r);function s(e){const n=i.useContext(l);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/9af10537.07a37069.js b/docs/ignite3/assets/js/9af10537.07a37069.js deleted file mode 100644 index 21392f5eec..0000000000 --- a/docs/ignite3/assets/js/9af10537.07a37069.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4581],{28453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>o});var a=r(96540);const t={},s=a.createContext(t);function i(e){const n=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),a.createElement(s.Provider,{value:n},e.children)}},82413:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"developers-guide/clients/ado","title":"ADO.NET Integration","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/clients/ado.md","sourceDirName":"developers-guide/clients","slug":"/developers-guide/clients/ado","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/ado","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"ADO.NET Integration","sidebar_label":"ADO.NET"},"sidebar":"tutorialSidebar","previous":{"title":"Python","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/python"},"next":{"title":"LINQ","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/linq"}}');var t=r(74848),s=r(28453);const i={title:"ADO.NET Integration",sidebar_label:"ADO.NET"},o=void 0,d={},c=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Installation",id:"installation",level:3},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Executing SQL Commands",id:"executing-sql-commands",level:2},{value:"Reading Data From Cluster",id:"reading-data-from-cluster",level:2},{value:"Using Parameters",id:"using-parameters",level:2},{value:"Transactions",id:"transactions",level:2},{value:"Full Example",id:"full-example",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:["\n",(0,t.jsxs)(n.p,{children:["Apache Ignite implements ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-overview",children:"ADO.NET"})," classes, such as ",(0,t.jsx)(n.code,{children:"DbConnection"}),", ",(0,t.jsx)(n.code,{children:"DbCommand"}),", ",(0,t.jsx)(n.code,{children:"DbDataReader"}),", etc.,\r\nallowing you to use standard ADO.NET components to interact with Ignite SQL."]}),"\n",(0,t.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,t.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(n.p,{children:"To use C# thin client, .NET 8.0 or newer is required."}),"\n",(0,t.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,t.jsxs)(n.p,{children:["C# client is available via NuGet. To add it, use the ",(0,t.jsx)(n.code,{children:"add package"})," command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"dotnet add package Apache.Ignite --version 3.0.0\n"})}),"\n",(0,t.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,t.jsx)(n.p,{children:"To connect to an Apache Ignite cluster, create a new connection with the connection string:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'var connStr = "Endpoints=localhost:10800";\n'})}),"\n",(0,t.jsx)(n.p,{children:"The connection string has the following parameters:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Parameter"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Endpoints"}),(0,t.jsx)(n.td,{children:"Required. Comma-separated list of server addresses with ports."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"SocketTimeout"}),(0,t.jsxs)(n.td,{children:["Time span for socket operations timeout in ",(0,t.jsx)(n.code,{children:"hh:mm:ss"})," format. 30 seconds by default."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OperationTimeout"}),(0,t.jsxs)(n.td,{children:["Time span for operation timeout in ",(0,t.jsx)(n.code,{children:"hh:mm:ss"})," format. No timeout by default."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"HeartbeatInterval"}),(0,t.jsxs)(n.td,{children:["Time span between heartbeat messages to keep connection alive in ",(0,t.jsx)(n.code,{children:"hh:mm:ss.f"})," format. 30 seconds by default."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ReconnectInterval"}),(0,t.jsxs)(n.td,{children:["Time span between reconnection attempts in ",(0,t.jsx)(n.code,{children:"hh:mm:ss"})," format. 30 seconds by default."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"SslEnabled"}),(0,t.jsxs)(n.td,{children:["Boolean value to enable/disable SSL encryption. ",(0,t.jsx)(n.code,{children:"False"})," by default."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Username"}),(0,t.jsx)(n.td,{children:"Username for authentication."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Password"}),(0,t.jsx)(n.td,{children:"Password for authentication."})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"The example below shows a complete connection string with all parameters"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"Endpoints=localhost:10800,localhost:10801;SocketTimeout=00:00:10;OperationTimeout=00:03:30;\r\nHeartbeatInterval=00:00:05.5;ReconnectInterval=00:01:00;SslEnabled=True;Username=user;Password=pass\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Using the connection string, you can establish a connection to an Ignite cluster with the ",(0,t.jsx)(n.code,{children:"IgniteDbConnection"})," class:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'var connStr = "Endpoints=localhost:10800";\r\nawait using var conn = new IgniteDbConnection(connStr);\r\nawait conn.OpenAsync();\n'})}),"\n",(0,t.jsx)(n.h2,{id:"executing-sql-commands",children:"Executing SQL Commands"}),"\n",(0,t.jsxs)(n.p,{children:["You can use the ",(0,t.jsx)(n.code,{children:"IgniteDbConnection.CreateCommand"})," method to create a command and then execute it with one of the ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/executing-a-command",children:"execution commands"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The example below does not expect the command to return any rows, and uses the ",(0,t.jsx)(n.code,{children:"ExecuteNonQueryAsync"})," command."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'DbCommand cmd = conn.CreateCommand();\r\ncmd.CommandText = "DROP TABLE IF EXISTS Person";\r\nawait cmd.ExecuteNonQueryAsync();\n'})}),"\n",(0,t.jsx)(n.h2,{id:"reading-data-from-cluster",children:"Reading Data From Cluster"}),"\n",(0,t.jsxs)(n.p,{children:["You can retrieve data from the cluster in a similar way to using ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/retrieving-data-using-a-datareader",children:"Data Readers"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"The example below shows how you can get data from your cluster:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'DbCommand cmd = conn.CreateCommand();\r\ncmd.CommandText = "SELECT * FROM Person";\r\nawait using var reader = await cmd.ExecuteReaderAsync();\r\n\r\nwhile (await reader.ReadAsync())\r\n{\r\n Console.WriteLine($"Person [ID={reader.GetInt32(0)}, Name={reader.GetString(1)}]");\r\n}\n'})}),"\n",(0,t.jsx)(n.h2,{id:"using-parameters",children:"Using Parameters"}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"Apache Ignite only supports input parameters. Parameter types are automatically inferred from the SQL query context, so you do not need to specify the parameter type explicitly."})}),"\n",(0,t.jsxs)(n.p,{children:["Apache Ignite supports parameterized queries using positional parameters. You can use the ",(0,t.jsx)(n.code,{children:"IgniteDbConnection.CreateParameter()"})," method to create parameters that will replace the ",(0,t.jsx)(n.code,{children:"?"})," placeholders in your query text."]}),"\n",(0,t.jsx)(n.p,{children:"The example below shows how you can parametrize your query:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'DbCommand cmd = conn.CreateCommand();\r\ncmd.CommandText = "INSERT INTO Person (ID, Name) VALUES (?, ?)";\r\n\r\nDbParameter idParam = cmd.CreateParameter();\r\nidParam.Value = 1;\r\ncmd.Parameters.Add(idParam);\r\n\r\nDbParameter nameParam = cmd.CreateParameter();\r\nnameParam.Value = "John Doe";\r\ncmd.Parameters.Add(nameParam);\r\n\r\nawait cmd.ExecuteNonQueryAsync();\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Parameters must be added in the exact order they appear in the query. The first ",(0,t.jsx)(n.code,{children:"?"})," corresponds to the first parameter added, the second ",(0,t.jsx)(n.code,{children:"?"})," to the second parameter, etc."]}),"\n",(0,t.jsxs)(n.p,{children:["To pass null values, set the parameter value to ",(0,t.jsx)(n.code,{children:"null"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:"DbParameter param = cmd.CreateParameter();\r\nparam.Value = null;\r\ncmd.Parameters.Add(param);\n"})}),"\n",(0,t.jsx)(n.h2,{id:"transactions",children:"Transactions"}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["Apache Ignite does not support custom isolation levels. All transactions are effectively ",(0,t.jsx)(n.code,{children:"Serializable"}),"."]})}),"\n",(0,t.jsxs)(n.p,{children:["You can use the ",(0,t.jsx)(n.code,{children:"DbConnection.BeginTransaction"})," method to start a transaction."]}),"\n",(0,t.jsx)(n.p,{children:"No data will be committed to the database until the transaction is committed. You can discard all changes with a rollback method:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:"await using DbTransaction tx = await conn.BeginTransactionAsync();\r\ncmd.Transaction = tx;\r\n// ...\r\n// Commit the transaction.\r\nawait tx.CommitAsync();\r\n// Roll back the transaction if needed.\r\n// await tx.RollbackAsync();\n"})}),"\n",(0,t.jsx)(n.h2,{id:"full-example",children:"Full Example"}),"\n",(0,t.jsx)(n.p,{children:"The example below shows how you can work with an Apache Ignite cluster via ADO.NET:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-csharp",children:'var connStr = $"Endpoints=localhost:10800";\r\nawait using var conn = new IgniteDbConnection(connStr);\r\nawait conn.OpenAsync();\r\n\r\nDbCommand createTableCmd = conn.CreateCommand();\r\ncreateTableCmd.CommandText = "CREATE TABLE IF NOT EXISTS Person (ID INT PRIMARY KEY, Name VARCHAR)";\r\nawait createTableCmd.ExecuteNonQueryAsync();\r\n\r\nDbCommand insertCmd = conn.CreateCommand();\r\ninsertCmd.CommandText = "INSERT INTO Person (ID, Name) VALUES (?, ?)";\r\n\r\nawait using DbTransaction tx = await conn.BeginTransactionAsync();\r\ninsertCmd.Transaction = tx;\r\n\r\nDbParameter idParam = insertCmd.CreateParameter();\r\ninsertCmd.Parameters.Add(idParam);\r\n\r\nDbParameter nameParam = insertCmd.CreateParameter();\r\ninsertCmd.Parameters.Add(nameParam);\r\n\r\nfor (var i = 1; i <= 3; i++)\r\n{\r\n idParam.Value = i;\r\n nameParam.Value = "Person " + i;\r\n await insertCmd.ExecuteNonQueryAsync();\r\n}\r\n\r\nawait tx.CommitAsync();\r\n\r\nDbCommand selectCmd = conn.CreateCommand();\r\nselectCmd.CommandText = "SELECT * FROM Person WHERE ID > ?";\r\n\r\nDbParameter selectParam = selectCmd.CreateParameter();\r\nselectParam.Value = 1;\r\nselectCmd.Parameters.Add(selectParam);\r\n\r\nawait using var reader = await selectCmd.ExecuteReaderAsync();\r\n\r\nfor (var i = 0; i < reader.FieldCount; i++)\r\n{\r\n Console.WriteLine($"{reader.GetName(i)}: {reader.GetFieldType(i)}");\r\n}\r\n\r\nwhile (await reader.ReadAsync())\r\n{\r\n int id = reader.GetInt32(0);\r\n string name = reader.GetString(1);\r\n\r\n Console.WriteLine($"Person [ID={id}, Name={name}]");\r\n}\n'})})]})}function m(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/a150ce1d.e107ce06.js b/docs/ignite3/assets/js/a150ce1d.e107ce06.js deleted file mode 100644 index 1a1056099f..0000000000 --- a/docs/ignite3/assets/js/a150ce1d.e107ce06.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2645],{1302:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>c,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"develop/ignite-clients/index","title":"Ignite Clients","description":"Full-featured native clients with support for all Apache Ignite 3 APIs.","source":"@site/docs/develop/ignite-clients/index.mdx","sourceDirName":"develop/ignite-clients","slug":"/develop/ignite-clients/","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Develop","permalink":"/docs/ignite3/3.1.0/develop/"},"next":{"title":"Java Client","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/java-client"}}');var s=i(74848),l=i(28453);const c={},r="Ignite Clients",a={},o=[{value:"Features",id:"features",level:2},{value:"When to Use",id:"when-to-use",level:2},{value:"Available Clients",id:"available-clients",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,l.R)(),...e.components},{IIcon:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"ignite-clients",children:"Ignite Clients"})}),"\n",(0,s.jsx)(n.p,{children:"Full-featured native clients with support for all Apache Ignite 3 APIs."}),"\n",(0,s.jsx)(n.h2,{id:"features",children:"Features"}),"\n",(0,s.jsx)(n.p,{children:"Native Ignite clients provide:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Full Table API (RecordView, KeyValueView)"}),"\n",(0,s.jsx)(n.li,{children:"SQL API with prepared statements"}),"\n",(0,s.jsx)(n.li,{children:"Transaction support"}),"\n",(0,s.jsx)(n.li,{children:"Data streaming capabilities"}),"\n",(0,s.jsx)(n.li,{children:"Compute job execution"}),"\n",(0,s.jsx)(n.li,{children:"Cluster topology information"}),"\n",(0,s.jsx)(n.li,{children:"Async operations"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"when-to-use",children:"When to Use"}),"\n",(0,s.jsx)(n.p,{children:"Use native Ignite clients when you need:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Full access to all Ignite features"}),"\n",(0,s.jsx)(n.li,{children:"Key-value operations"}),"\n",(0,s.jsx)(n.li,{children:"Compute job deployment"}),"\n",(0,s.jsx)(n.li,{children:"Event handling"}),"\n",(0,s.jsx)(n.li,{children:"High-performance data access"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["For SQL-only connectivity, see ",(0,s.jsx)(n.a,{href:"connect-to-ignite/jdbc",children:"Connect to Ignite"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"available-clients",children:"Available Clients"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:openjdk",height:"24"})," Java Client"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Primary API with complete feature set for all Ignite operations including thin client and embedded node modes."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./ignite-clients/java-client",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:dotnet",height:"24"})," .NET Client"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Native .NET client for C# applications with async/await patterns and LINQ integration."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./ignite-clients/dotnet-client",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:cplusplus",height:"24"})," C++ Client"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"High-performance C++ client with modern C++17 features for low-latency applications."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./ignite-clients/cpp-client",children:"Learn more \u2192"})})]})]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>c,x:()=>r});var t=i(96540);const s={},l=t.createContext(s);function c(e){const n=t.useContext(l);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/a1b4f2ab.ba1878a3.js b/docs/ignite3/assets/js/a1b4f2ab.ba1878a3.js deleted file mode 100644 index 8522f4239e..0000000000 --- a/docs/ignite3/assets/js/a1b4f2ab.ba1878a3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4414],{28453:(e,i,n)=>{n.d(i,{R:()=>a,x:()=>t});var r=n(96540);const s={},c=r.createContext(s);function a(e){const i=r.useContext(c);return r.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function t(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(c.Provider,{value:i},e.children)}},34854:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"api-reference/native-clients/cpp/cpp-index","title":"C++ API","description":"High-performance C++ client with modern C++17 features and zero-copy operations.","source":"@site/docs/api-reference/native-clients/cpp/index.mdx","sourceDirName":"api-reference/native-clients/cpp","slug":"/api-reference/native-clients/cpp/","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"C++ API","id":"cpp-index","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Network API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api"},"next":{"title":"Client API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api"}}');var s=n(74848),c=n(28453);const a={title:"C++ API",id:"cpp-index",sidebar_position:3},t="C++ API",d={},o=[{value:"Overview",id:"overview",level:2},{value:"API Categories",id:"api-categories",level:2},{value:"Reference",id:"reference",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const i={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,c.R)(),...e.components},{IIcon:n}=i;return n||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"c-api",children:"C++ API"})}),"\n",(0,s.jsx)(i.p,{children:"High-performance C++ client with modern C++17 features and zero-copy operations."}),"\n",(0,s.jsx)(i.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(i.p,{children:"The C++ API provides thin client access to Apache Ignite 3 clusters. Operations use callbacks for async execution and support timeout configuration."}),"\n",(0,s.jsx)(i.p,{children:"The API offers both typed views with template specialization and binary views with ignite_tuple for schema-free operations. Memory management uses shared_ptr for automatic resource cleanup."}),"\n",(0,s.jsx)(i.h2,{id:"api-categories",children:"API Categories"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:connection",height:"24"})," Client API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"ignite_client configuration, connection lifecycle management, and API access patterns."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./cpp/client-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:table",height:"24"})," Tables API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Record and key-value views with typed and binary tuple access for table operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./cpp/tables-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:console-line",height:"24"})," SQL API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Query execution with parameterized statements, pagination, and cancellation support."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./cpp/sql-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:shield-check-outline",height:"24"})," Transactions API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Transaction control with explicit commit and rollback operations for ACID guarantees."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./cpp/transactions-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:server-network",height:"24"})," Compute API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Distributed job execution with targeting strategies and priority management."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./cpp/compute-api",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"carbon:network-3",height:"24"})," Network API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Cluster node information and topology filtering for distributed coordination."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./cpp/network-api",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(i.h2,{id:"reference",children:"Reference"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/cppdoc/",children:"C++ API Documentation"})}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"../../develop/ignite-clients/cpp-client",children:"C++ Client Guide"})," - Client setup and build configuration"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"../../getting-started",children:"Getting Started"})," - Quick start tutorials"]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,c.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/a3771ee6.a654e4cc.js b/docs/ignite3/assets/js/a3771ee6.a654e4cc.js deleted file mode 100644 index 70ca5a6ea8..0000000000 --- a/docs/ignite3/assets/js/a3771ee6.a654e4cc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6874],{28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>s});var t=i(96540);const c={},a=t.createContext(c);function r(e){const n=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:r(e.components),t.createElement(a.Provider,{value:n},e.children)}},40741:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"api-reference/api/dotnet-api-reference","title":".NET API Reference","description":"Complete reference documentation for the Apache Ignite 3 .NET API.","source":"@site/docs/api-reference/api/dotnet-api.md","sourceDirName":"api-reference/api","slug":"/api-reference/api/dotnet-api-reference","permalink":"/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":".NET API Reference","id":"dotnet-api-reference","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Java API Reference","permalink":"/docs/ignite3/3.1.0/api-reference/api/java-api-reference"},"next":{"title":"C++ API Reference","permalink":"/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference"}}');var c=i(74848),a=i(28453);const r={title:".NET API Reference",id:"dotnet-api-reference",sidebar_position:2},s=".NET API Reference",l={},o=[{value:"Overview",id:"overview",level:2},{value:"API Documentation",id:"api-documentation",level:2},{value:"Access the Documentation",id:"access-the-documentation",level:3},{value:"Online Documentation",id:"online-documentation",level:3},{value:"Generating Local Documentation",id:"generating-local-documentation",level:3},{value:"Core Namespaces",id:"core-namespaces",level:2},{value:"Client",id:"client",level:3},{value:"Data Access",id:"data-access",level:3},{value:"Transactions and Compute",id:"transactions-and-compute",level:3},{value:"Infrastructure",id:"infrastructure",level:3},{value:"NuGet Package",id:"nuget-package",level:2},{value:"Framework Support",id:"framework-support",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"net-api-reference",children:".NET API Reference"})}),"\n",(0,c.jsx)(n.p,{children:"Complete reference documentation for the Apache Ignite 3 .NET API."}),"\n",(0,c.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,c.jsx)(n.p,{children:"The .NET API provides interfaces and classes for Apache Ignite 3 thin client operations. All APIs use async patterns and support both typed and dynamic access."}),"\n",(0,c.jsx)(n.h2,{id:"api-documentation",children:"API Documentation"}),"\n",(0,c.jsx)(n.p,{children:"API documentation is generated from XML comments in source code."}),"\n",(0,c.jsx)(n.h3,{id:"access-the-documentation",children:"Access the Documentation"}),"\n",(0,c.jsx)("a",{href:"/docs/ignite3/api/dotnet/index.html",target:"_blank",rel:"noopener noreferrer",style:{display:"inline-block",padding:"12px 24px",backgroundColor:"#0066cc",color:"white",textDecoration:"none",borderRadius:"4px",fontWeight:"bold",marginBottom:"20px"},children:"Open .NET API Reference \u2192"}),"\n",(0,c.jsx)(n.p,{children:"The locally generated DocFX documentation includes all public APIs, with detailed documentation for interfaces, classes, methods, and properties."}),"\n",(0,c.jsx)(n.h3,{id:"online-documentation",children:"Online Documentation"}),"\n",(0,c.jsx)(n.p,{children:"The latest API reference is published with each release:"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/dotnetdoc/",children:"Latest Release .NET API"})}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"generating-local-documentation",children:"Generating Local Documentation"}),"\n",(0,c.jsx)(n.p,{children:"Generate API documentation locally using DocFX:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-bash",children:"cd modules/platforms/dotnet\r\ndotnet build Apache.Ignite/Apache.Ignite.csproj -c Release\r\ndotnet tool restore\r\ndotnet docfx docs/docfx.json\n"})}),"\n",(0,c.jsxs)(n.p,{children:["Generated documentation appears in ",(0,c.jsx)(n.code,{children:"modules/platforms/dotnet/docs/_site/"}),"."]}),"\n",(0,c.jsx)(n.h2,{id:"core-namespaces",children:"Core Namespaces"}),"\n",(0,c.jsx)(n.h3,{id:"client",children:"Client"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"Apache.Ignite"})," - IIgniteClient interface and configuration"]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"data-access",children:"Data Access"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"Apache.Ignite.Table"})," - ITable, IRecordView, IKeyValueView interfaces"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"Apache.Ignite.Table.DataStreamer"})," - Bulk loading with streaming"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"Apache.Ignite.Sql"})," - Query execution and result sets"]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"transactions-and-compute",children:"Transactions and Compute"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"Apache.Ignite.Transactions"})," - ITransactions and ITransaction interfaces"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"Apache.Ignite.Compute"})," - Distributed job execution"]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"infrastructure",children:"Infrastructure"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"Apache.Ignite.Network"})," - Cluster node information"]}),"\n"]}),"\n",(0,c.jsx)(n.h2,{id:"nuget-package",children:"NuGet Package"}),"\n",(0,c.jsx)(n.p,{children:"Install the client package from NuGet:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-bash",children:"dotnet add package Apache.Ignite\n"})}),"\n",(0,c.jsx)(n.p,{children:"The package includes:"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsx)(n.li,{children:"Client implementation"}),"\n",(0,c.jsx)(n.li,{children:"API interfaces"}),"\n",(0,c.jsx)(n.li,{children:"Type serialization"}),"\n",(0,c.jsx)(n.li,{children:"Connection management"}),"\n"]}),"\n",(0,c.jsx)(n.h2,{id:"framework-support",children:"Framework Support"}),"\n",(0,c.jsx)(n.p,{children:"The .NET client supports:"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsx)(n.li,{children:".NET 6.0 and later"}),"\n",(0,c.jsx)(n.li,{children:".NET Standard 2.1 (with limitations)"}),"\n"]}),"\n",(0,c.jsxs)(n.p,{children:["Async APIs use ",(0,c.jsx)(n.code,{children:"Task"}),", ",(0,c.jsx)(n.code,{children:"ValueTask"}),", and ",(0,c.jsx)(n.code,{children:"IAsyncEnumerable"})," for modern async patterns."]}),"\n",(0,c.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"../native-clients/dotnet",children:".NET API Documentation"})," - Usage guides for each API area"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"../../develop/ignite-clients/dotnet-client",children:".NET Client Guide"})," - Client setup and configuration"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/a4bdb400.55257d50.js b/docs/ignite3/assets/js/a4bdb400.55257d50.js deleted file mode 100644 index f2310baf91..0000000000 --- a/docs/ignite3/assets/js/a4bdb400.55257d50.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2272],{28453:(e,r,i)=>{i.d(r,{R:()=>o,x:()=>l});var n=i(96540);const t={},a=n.createContext(t);function o(e){const r=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(a.Provider,{value:r},e.children)}},40582:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"api-reference/native-clients/java/criteria-api","title":"Criteria API","description":"The Criteria API builds type-safe query predicates for table operations. Applications construct queries using Java code instead of string-based SQL. This approach provides compile-time validation and IDE support for query construction.","source":"@site/docs/api-reference/native-clients/java/criteria-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/criteria-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":9,"frontMatter":{"title":"Criteria API","id":"criteria-api","sidebar_position":9},"sidebar":"tutorialSidebar","previous":{"title":"Catalog API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api"},"next":{"title":"Network API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api"}}');var t=i(74848),a=i(28453);const o={title:"Criteria API",id:"criteria-api",sidebar_position:9},l="Criteria API",s={},c=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Basic Criteria Queries",id:"basic-criteria-queries",level:2},{value:"Comparison Conditions",id:"comparison-conditions",level:2},{value:"Null Checks",id:"null-checks",level:2},{value:"IN Conditions",id:"in-conditions",level:2},{value:"AND Conditions",id:"and-conditions",level:2},{value:"OR Conditions",id:"or-conditions",level:2},{value:"Complex Predicates",id:"complex-predicates",level:2},{value:"Typed Criteria Queries",id:"typed-criteria-queries",level:2},{value:"Key-Value View Queries",id:"key-value-view-queries",level:2},{value:"Query Options",id:"query-options",level:2},{value:"Asynchronous Queries",id:"asynchronous-queries",level:2},{value:"Transaction Integration",id:"transaction-integration",level:2},{value:"Range Queries",id:"range-queries",level:2},{value:"Multiple Column Conditions",id:"multiple-column-conditions",level:2},{value:"Cursor Iteration",id:"cursor-iteration",level:2},{value:"Reference",id:"reference",level:2},{value:"Criteria Factory Methods",id:"criteria-factory-methods",level:3},{value:"Condition Factory Methods",id:"condition-factory-methods",level:3},{value:"CriteriaQuerySource Methods",id:"criteriaquerysource-methods",level:3},{value:"CriteriaQueryOptions Configuration",id:"criteriaqueryoptions-configuration",level:3},{value:"Cursor Operations",id:"cursor-operations",level:3}];function u(e){const r={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"criteria-api",children:"Criteria API"})}),"\n",(0,t.jsx)(r.p,{children:"The Criteria API builds type-safe query predicates for table operations. Applications construct queries using Java code instead of string-based SQL. This approach provides compile-time validation and IDE support for query construction."}),"\n",(0,t.jsx)(r.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,t.jsx)(r.p,{children:"Criteria queries filter table data using predicates. Predicates combine column conditions with logical operators. The API supports common comparison operations including equality, ranges, null checks, and pattern matching."}),"\n",(0,t.jsx)(r.p,{children:"Both RecordView and KeyValueView implement CriteriaQuerySource, enabling criteria queries on any view type. Results stream through cursors that must be closed to release resources."}),"\n",(0,t.jsx)(r.h2,{id:"basic-criteria-queries",children:"Basic Criteria Queries"}),"\n",(0,t.jsx)(r.p,{children:"Query with simple equality conditions:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'RecordView view = table.recordView();\r\n\r\nCriteria criteria = Criteria.columnValue(\r\n "age",\r\n Condition.equalTo(30)\r\n);\r\n\r\ntry (Cursor cursor = view.query(null, criteria, null, null)) {\r\n for (Tuple record : cursor) {\r\n System.out.println(record.stringValue("name"));\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.p,{children:"Always close cursors to free server resources."}),"\n",(0,t.jsx)(r.h2,{id:"comparison-conditions",children:"Comparison Conditions"}),"\n",(0,t.jsx)(r.p,{children:"Use various comparison operators:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'// Greater than\r\nCriteria criteria1 = Criteria.columnValue("age", Condition.greaterThan(25));\r\n\r\n// Greater or equal\r\nCriteria criteria2 = Criteria.columnValue("age", Condition.greaterThanOrEqualTo(25));\r\n\r\n// Less than\r\nCriteria criteria3 = Criteria.columnValue("age", Condition.lessThan(65));\r\n\r\n// Less or equal\r\nCriteria criteria4 = Criteria.columnValue("age", Condition.lessThanOrEqualTo(65));\r\n\r\n// Not equal\r\nCriteria criteria5 = Criteria.columnValue("status", Condition.notEqualTo("inactive"));\n'})}),"\n",(0,t.jsx)(r.h2,{id:"null-checks",children:"Null Checks"}),"\n",(0,t.jsx)(r.p,{children:"Check for null or non-null values:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'// IS NULL\r\nCriteria nullCriteria = Criteria.columnValue("middleName", Condition.nullValue());\r\n\r\ntry (Cursor cursor = view.query(null, nullCriteria, null)) {\r\n for (Tuple record : cursor) {\r\n System.out.println(record.stringValue("name"));\r\n }\r\n}\r\n\r\n// IS NOT NULL\r\nCriteria notNullCriteria = Criteria.columnValue("email", Condition.notNullValue());\n'})}),"\n",(0,t.jsx)(r.h2,{id:"in-conditions",children:"IN Conditions"}),"\n",(0,t.jsx)(r.p,{children:"Match against multiple values:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'Criteria criteria = Criteria.columnValue(\r\n "category",\r\n Condition.in("electronics", "appliances", "gadgets")\r\n);\r\n\r\ntry (Cursor cursor = view.query(null, criteria, null, null)) {\r\n for (Tuple record : cursor) {\r\n System.out.println(record.stringValue("name"));\r\n }\r\n}\r\n\r\n// NOT IN\r\nCriteria notInCriteria = Criteria.columnValue(\r\n "status",\r\n Condition.notIn("deleted", "archived")\r\n);\n'})}),"\n",(0,t.jsx)(r.h2,{id:"and-conditions",children:"AND Conditions"}),"\n",(0,t.jsx)(r.p,{children:"Combine multiple conditions with AND:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'Criteria ageCriteria = Criteria.columnValue("age", Condition.greaterThan(25));\r\nCriteria statusCriteria = Criteria.columnValue("status", Condition.equalTo("active"));\r\n\r\nCriteria combined = Criteria.and(ageCriteria, statusCriteria);\r\n\r\ntry (Cursor cursor = view.query(null, combined, null, null)) {\r\n for (Tuple record : cursor) {\r\n System.out.println(record.stringValue("name"));\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.p,{children:"All conditions must match for records to satisfy AND criteria."}),"\n",(0,t.jsx)(r.h2,{id:"or-conditions",children:"OR Conditions"}),"\n",(0,t.jsx)(r.p,{children:"Combine conditions with OR:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'Criteria junior = Criteria.columnValue("age", Condition.lessThan(30));\r\nCriteria senior = Criteria.columnValue("age", Condition.greaterThan(60));\r\n\r\nCriteria combined = Criteria.or(junior, senior);\r\n\r\ntry (Cursor cursor = view.query(null, combined, null, null)) {\r\n for (Tuple record : cursor) {\r\n System.out.println(record.stringValue("name") + ": " +\r\n record.intValue("age"));\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.p,{children:"Records matching any condition satisfy OR criteria."}),"\n",(0,t.jsx)(r.h2,{id:"complex-predicates",children:"Complex Predicates"}),"\n",(0,t.jsx)(r.p,{children:"Nest AND and OR conditions:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'Criteria youngActive = Criteria.and(\r\n Criteria.columnValue("age", Condition.lessThan(30)),\r\n Criteria.columnValue("status", Condition.equalTo("active"))\r\n);\r\n\r\nCriteria seniorActive = Criteria.and(\r\n Criteria.columnValue("age", Condition.greaterThan(60)),\r\n Criteria.columnValue("status", Condition.equalTo("active"))\r\n);\r\n\r\nCriteria combined = Criteria.or(youngActive, seniorActive);\r\n\r\ntry (Cursor cursor = view.query(null, combined, null, null)) {\r\n for (Tuple record : cursor) {\r\n System.out.println(record.stringValue("name"));\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.h2,{id:"typed-criteria-queries",children:"Typed Criteria Queries"}),"\n",(0,t.jsx)(r.p,{children:"Query typed views with criteria:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'public class User {\r\n public int id;\r\n public String name;\r\n public int age;\r\n public String status;\r\n}\r\n\r\nRecordView view = table.recordView(User.class);\r\n\r\nCriteria criteria = Criteria.and(\r\n Criteria.columnValue("age", Condition.greaterThan(25)),\r\n Criteria.columnValue("status", Condition.equalTo("active"))\r\n);\r\n\r\ntry (Cursor cursor = view.query(null, criteria, null, null)) {\r\n for (User user : cursor) {\r\n System.out.println(user.name + " is " + user.age + " years old");\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.h2,{id:"key-value-view-queries",children:"Key-Value View Queries"}),"\n",(0,t.jsx)(r.p,{children:"Query key-value views with criteria:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'KeyValueView view = table.keyValueView();\r\n\r\nCriteria criteria = Criteria.columnValue("category", Condition.equalTo("electronics"));\r\n\r\ntry (Cursor> cursor = view.query(null, criteria, null, null)) {\r\n for (Entry entry : cursor) {\r\n Tuple key = entry.getKey();\r\n Tuple value = entry.getValue();\r\n System.out.println("Product " + key.intValue("id") + ": " +\r\n value.stringValue("name"));\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.p,{children:"Key-value queries return Entry instances containing keys and values."}),"\n",(0,t.jsx)(r.h2,{id:"query-options",children:"Query Options"}),"\n",(0,t.jsx)(r.p,{children:"Configure query behavior:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:"CriteriaQueryOptions options = CriteriaQueryOptions.builder()\r\n .pageSize(100)\r\n .build();\r\n\r\ntry (Cursor cursor = view.query(null, criteria, null, options)) {\r\n for (Tuple record : cursor) {\r\n // Process records\r\n }\r\n}\n"})}),"\n",(0,t.jsx)(r.p,{children:"Query options control result pagination and fetching behavior."}),"\n",(0,t.jsx)(r.h2,{id:"asynchronous-queries",children:"Asynchronous Queries"}),"\n",(0,t.jsx)(r.p,{children:"Execute criteria queries asynchronously:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'Criteria criteria = Criteria.columnValue("age", Condition.greaterThan(30));\r\n\r\nCompletableFuture> cursorFuture =\r\n view.queryAsync(null, criteria, null, null);\r\n\r\ncursorFuture.thenAccept(cursor -> {\r\n for (Tuple record : cursor.currentPage()) {\r\n System.out.println(record.stringValue("name"));\r\n }\r\n cursor.closeAsync();\r\n});\n'})}),"\n",(0,t.jsx)(r.p,{children:"Asynchronous queries return immediately without blocking. Use currentPage() to access results and closeAsync() to release resources."}),"\n",(0,t.jsx)(r.h2,{id:"transaction-integration",children:"Transaction Integration"}),"\n",(0,t.jsx)(r.p,{children:"Execute queries within transactions:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'ignite.transactions().runInTransaction(tx -> {\r\n RecordView view = table.recordView();\r\n\r\n Criteria criteria = Criteria.columnValue("balance", Condition.greaterThan(1000));\r\n\r\n try (Cursor cursor = view.query(tx, criteria, null, null)) {\r\n for (Tuple record : cursor) {\r\n int balance = record.intValue("balance");\r\n record.set("balance", balance * 1.05);\r\n view.upsert(tx, record);\r\n }\r\n }\r\n});\n'})}),"\n",(0,t.jsx)(r.p,{children:"Queries within transactions see consistent data snapshots."}),"\n",(0,t.jsx)(r.h2,{id:"range-queries",children:"Range Queries"}),"\n",(0,t.jsx)(r.p,{children:"Combine conditions for range queries:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'Criteria rangeCriteria = Criteria.and(\r\n Criteria.columnValue("price", Condition.greaterThanOrEqualTo(10.0)),\r\n Criteria.columnValue("price", Condition.lessThanOrEqualTo(50.0))\r\n);\r\n\r\ntry (Cursor cursor = view.query(null, rangeCriteria, null, null)) {\r\n for (Tuple record : cursor) {\r\n System.out.println(record.stringValue("name") + ": $" +\r\n record.doubleValue("price"));\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.h2,{id:"multiple-column-conditions",children:"Multiple Column Conditions"}),"\n",(0,t.jsx)(r.p,{children:"Query on multiple columns:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'Criteria criteria = Criteria.and(\r\n Criteria.columnValue("category", Condition.equalTo("electronics")),\r\n Criteria.columnValue("inStock", Condition.equalTo(true)),\r\n Criteria.columnValue("price", Condition.lessThan(1000.0)),\r\n Criteria.columnValue("rating", Condition.greaterThanOrEqualTo(4.0))\r\n);\r\n\r\ntry (Cursor cursor = view.query(null, criteria, null, null)) {\r\n for (Tuple record : cursor) {\r\n System.out.println(record.stringValue("name"));\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.h2,{id:"cursor-iteration",children:"Cursor Iteration"}),"\n",(0,t.jsx)(r.p,{children:"Process cursor results:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-java",children:'Criteria criteria = Criteria.columnValue("status", Condition.equalTo("pending"));\r\n\r\ntry (Cursor cursor = view.query(null, criteria, null, null)) {\r\n while (cursor.hasNext()) {\r\n Tuple record = cursor.next();\r\n System.out.println(record.stringValue("orderId"));\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(r.p,{children:"Cursors implement Iterator for standard iteration patterns."}),"\n",(0,t.jsx)(r.h2,{id:"reference",children:"Reference"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["Criteria builder: ",(0,t.jsx)(r.code,{children:"org.apache.ignite.table.criteria.Criteria"})]}),"\n",(0,t.jsxs)(r.li,{children:["Conditions: ",(0,t.jsx)(r.code,{children:"org.apache.ignite.table.criteria.Condition"})]}),"\n",(0,t.jsxs)(r.li,{children:["Query source: ",(0,t.jsx)(r.code,{children:"org.apache.ignite.table.criteria.CriteriaQuerySource"})]}),"\n",(0,t.jsxs)(r.li,{children:["Query options: ",(0,t.jsx)(r.code,{children:"org.apache.ignite.table.criteria.CriteriaQueryOptions"})]}),"\n",(0,t.jsxs)(r.li,{children:["Column reference: ",(0,t.jsx)(r.code,{children:"org.apache.ignite.table.criteria.Column"})]}),"\n"]}),"\n",(0,t.jsx)(r.h3,{id:"criteria-factory-methods",children:"Criteria Factory Methods"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Criteria columnValue(String, Condition)"})," - Create column condition"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Criteria and(Criteria...)"})," - Combine with AND"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Criteria or(Criteria...)"})," - Combine with OR"]}),"\n"]}),"\n",(0,t.jsx)(r.h3,{id:"condition-factory-methods",children:"Condition Factory Methods"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition equalTo(Object)"})," - Equality comparison"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition notEqualTo(Object)"})," - Inequality comparison"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition greaterThan(Object)"})," - Greater than"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition greaterThanOrEqualTo(Object)"})," - Greater or equal"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition lessThan(Object)"})," - Less than"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition lessThanOrEqualTo(Object)"})," - Less or equal"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition in(Object...)"})," - IN clause"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition notIn(Object...)"})," - NOT IN clause"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition nullValue()"})," - IS NULL"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"static Condition notNullValue()"})," - IS NOT NULL"]}),"\n"]}),"\n",(0,t.jsx)(r.h3,{id:"criteriaquerysource-methods",children:"CriteriaQuerySource Methods"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"Cursor query(Transaction, Criteria, String, CriteriaQueryOptions)"})," - Execute query"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"CompletableFuture> queryAsync(Transaction, Criteria, String, CriteriaQueryOptions)"})," - Async query"]}),"\n"]}),"\n",(0,t.jsx)(r.h3,{id:"criteriaqueryoptions-configuration",children:"CriteriaQueryOptions Configuration"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"pageSize(int)"})," - Set result page size"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"build()"})," - Build options"]}),"\n"]}),"\n",(0,t.jsx)(r.h3,{id:"cursor-operations",children:"Cursor Operations"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"boolean hasNext()"})," - Check for more results"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"R next()"})," - Get next result"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"void close()"})," - Close cursor and release resources"]}),"\n"]})]})}function d(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/a6ff32af.f2ce670d.js b/docs/ignite3/assets/js/a6ff32af.f2ce670d.js deleted file mode 100644 index 4b7ea82b88..0000000000 --- a/docs/ignite3/assets/js/a6ff32af.f2ce670d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6728],{11470:(e,n,t)=>{t.d(n,{A:()=>w});var a=t(96540),r=t(34164),s=t(17559),i=t(23104),l=t(56347),o=t(205),c=t(57485),d=t(31682),u=t(70679);function h(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:a}})=>({value:e,label:n,attributes:t,default:a}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const t=(0,l.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(r),(0,a.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function b(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=p(e),[i,l]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s})),[c,d]=m({queryString:t,groupId:r}),[h,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,u.Dv)(n);return[t,(0,a.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),f=(()=>{const e=c??h;return g({value:e,tabValues:s})?e:null})();(0,o.A)(()=>{f&&l(f)},[f]);return{selectedValue:i,selectValue:(0,a.useCallback)(e=>{if(!g({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,s]),tabValues:s}}var f=t(92303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function j({className:e,block:n,selectedValue:t,selectValue:a,tabValues:s}){const l=[],{blockElementScrollPositionUntilNextRender:o}=(0,i.a_)(),c=e=>{const n=e.currentTarget,r=l.indexOf(n),i=s[r].value;i!==t&&(o(n),a(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:a})=>(0,x.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...a,className:(0,r.A)("tabs__item",v.tabItem,a?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:t}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===t);return e?(0,a.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function I(e){const n=b(e);return(0,x.jsxs)("div",{className:(0,r.A)(s.G.tabs.container,"tabs-container",v.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(y,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,x.jsx)(I,{...e,children:h(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>i});t(96540);var a=t(34164);const r={tabItem:"tabItem_Ymn6"};var s=t(74848);function i({children:e,hidden:n,className:t}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var a=t(96540);const r={},s=a.createContext(r);function i(e){const n=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),a.createElement(s.Provider,{value:n},e.children)}},49634:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>u});const a=JSON.parse('{"id":"configure-and-operate/installation/install-deb-rpm","title":"Install Using DEB and RPM Package","description":"Apache Ignite can be installed by using the standard package managers for the platform.","source":"@site/docs/configure-and-operate/installation/deb-rpm.md","sourceDirName":"configure-and-operate/installation","slug":"/configure-and-operate/installation/install-deb-rpm","permalink":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-deb-rpm","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"install-deb-rpm","title":"Install Using DEB and RPM Package","sidebar_label":"DEB/RPM Package"},"sidebar":"tutorialSidebar","previous":{"title":"ZIP Archive","permalink":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip"},"next":{"title":"Docker","permalink":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker"}}');var r=t(74848),s=t(28453),i=t(11470),l=t(19365);const o={id:"install-deb-rpm",title:"Install Using DEB and RPM Package",sidebar_label:"DEB/RPM Package"},c=void 0,d={},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Recommended Operating System",id:"recommended-operating-system",level:3},{value:"Recommended Java Version",id:"recommended-java-version",level:3},{value:"Installing Deb or RPM Package",id:"installing-deb-or-rpm-package",level:2},{value:"Running Apache Ignite as a Service",id:"running-apache-ignite-as-a-service",level:2},{value:"Running Apache Ignite as a Stand-Alone Process",id:"running-apache-ignite-as-a-stand-alone-process",level:2},{value:"Next Steps",id:"next-steps",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"Apache Ignite can be installed by using the standard package managers for the platform."}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.h3,{id:"recommended-operating-system",children:"Recommended Operating System"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite supports Linux, macOS, and Windows operating systems."}),"\n",(0,r.jsx)(n.h3,{id:"recommended-java-version",children:"Recommended Java Version"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite 3 requires Java 11 or later."}),"\n",(0,r.jsx)(n.h2,{id:"installing-deb-or-rpm-package",children:"Installing Deb or RPM Package"}),"\n",(0,r.jsx)(n.p,{children:"Install the Apache Ignite 3 packages:"}),"\n","\n",(0,r.jsxs)(i.A,{children:[(0,r.jsx)(l.A,{value:"deb",label:"deb",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"sudo apt-get install ./ignite3-db-{version}.deb --no-install-recommends\r\nsudo apt-get install ./ignite3-cli-{version}.deb --no-install-recommends\n"})})}),(0,r.jsx)(l.A,{value:"rpm",label:"RPM",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"sudo rpm -i ignite3-db-{version}.noarch.rpm\r\nsudo rpm -i ignite3-cli-{version}.noarch.rpm\n"})})})]}),"\n",(0,r.jsx)(n.p,{children:"The packages will be installed in the following way:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Folder"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"/usr/share/ignite3db"}),(0,r.jsx)(n.td,{children:"The root installation of Apache Ignite."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"/etc/ignite3db"}),(0,r.jsx)(n.td,{children:"The location of configuration files."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"/var/log/ignite3db"}),(0,r.jsx)(n.td,{children:"The location of node logs."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"/usr/lib/ignite3db"}),(0,r.jsx)(n.td,{children:"The location of the CLI tool."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"running-apache-ignite-as-a-service",children:"Running Apache Ignite as a Service"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["When running on Windows 10 WSL or Docker, you should start Apache Ignite as a stand-alone process (not as a service). We recommend to ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/installation/install-zip",children:"install Apache Ignite 3 using ZIP archive"})," in these environments."]})}),"\n",(0,r.jsx)(n.p,{children:"To start an Apache Ignite node with a custom configuration, run the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo systemctl start ignite3db\n"})}),"\n",(0,r.jsx)(n.p,{children:"To launch the node at system startup, run the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo systemctl enable ignite3db\n"})}),"\n",(0,r.jsx)(n.h2,{id:"running-apache-ignite-as-a-stand-alone-process",children:"Running Apache Ignite as a Stand-Alone Process"}),"\n",(0,r.jsx)(n.p,{children:"Generally, you would want to run Apache Ignite as a service. However, Apache Ignite also provides a startup script that can be used to start it as a stand-alone application. To run it, use the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo bash /usr/share/ignite3db/start.sh 1>/tmp/ignite3-start.log 2>&1 &\n"})}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(n.p,{children:["With Apache Ignite installed, you can proceed with the ",(0,r.jsx)(n.a,{href:"/3.1.0/getting-started/quick-start",children:"Getting Started Guide"})," or ",(0,r.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/table-api",children:"use the available APIs"})," immediately."]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/a734c28f.bd12a443.js b/docs/ignite3/assets/js/a734c28f.bd12a443.js deleted file mode 100644 index cb3b20e458..0000000000 --- a/docs/ignite3/assets/js/a734c28f.bd12a443.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1411],{28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var r=t(96540);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}},88960:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"api-reference/native-clients/java/sql-api","title":"SQL API","description":"The SQL API executes queries and DML statements against Ignite tables. Applications use standard SQL syntax to retrieve, insert, update, and delete data. The API supports parameterized queries, prepared statements, batch operations, and result streaming.","source":"@site/docs/api-reference/native-clients/java/sql-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/sql-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"SQL API","id":"sql-api","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Data Streamer API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api"},"next":{"title":"Transactions API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api"}}');var s=t(74848),a=t(28453);const i={title:"SQL API",id:"sql-api",sidebar_position:5},l="SQL API",c={},d=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Basic Query Execution",id:"basic-query-execution",level:2},{value:"Prepared Statements",id:"prepared-statements",level:2},{value:"Statement Configuration",id:"statement-configuration",level:2},{value:"Result Set Processing",id:"result-set-processing",level:2},{value:"DML Operations",id:"dml-operations",level:2},{value:"DDL Operations",id:"ddl-operations",level:2},{value:"Batch Operations",id:"batch-operations",level:2},{value:"Typed Result Mapping",id:"typed-result-mapping",level:2},{value:"Asynchronous Execution",id:"asynchronous-execution",level:2},{value:"Query Cancellation",id:"query-cancellation",level:2},{value:"Transaction Integration",id:"transaction-integration",level:2},{value:"Result Set Types",id:"result-set-types",level:2},{value:"SqlRow Access",id:"sqlrow-access",level:2},{value:"Reference",id:"reference",level:2},{value:"IgniteSql Methods",id:"ignitesql-methods",level:3},{value:"Statement Configuration",id:"statement-configuration-1",level:3},{value:"Statement Builder Methods",id:"statement-builder-methods",level:3},{value:"ResultSet Methods",id:"resultset-methods",level:3},{value:"ResultSetMetadata Methods",id:"resultsetmetadata-methods",level:3},{value:"ColumnMetadata Methods",id:"columnmetadata-methods",level:3}];function o(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"sql-api",children:"SQL API"})}),"\n",(0,s.jsx)(n.p,{children:"The SQL API executes queries and DML statements against Ignite tables. Applications use standard SQL syntax to retrieve, insert, update, and delete data. The API supports parameterized queries, prepared statements, batch operations, and result streaming."}),"\n",(0,s.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,s.jsx)(n.p,{children:"SQL execution operates through the IgniteSql facade. Query results stream through ResultSet cursors that must be closed to release resources. Statements configure query behavior including timeouts, schemas, and pagination."}),"\n",(0,s.jsx)(n.p,{children:"Queries execute within optional transaction contexts. Pass null for auto-commit execution or provide a Transaction for multi-statement atomicity. Query parameters use positional binding with question mark placeholders."}),"\n",(0,s.jsx)(n.h2,{id:"basic-query-execution",children:"Basic Query Execution"}),"\n",(0,s.jsx)(n.p,{children:"Execute queries with parameters:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'try (ResultSet rs = ignite.sql().execute(\r\n null,\r\n "SELECT name, age FROM users WHERE age > ?",\r\n 25\r\n)) {\r\n while (rs.hasNext()) {\r\n SqlRow row = rs.next();\r\n System.out.println(row.stringValue("name") + ": " + row.intValue("age"));\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Always close ResultSet instances to free server resources."}),"\n",(0,s.jsx)(n.h2,{id:"prepared-statements",children:"Prepared Statements"}),"\n",(0,s.jsx)(n.p,{children:"Create prepared statements for repeated execution:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'Statement stmt = ignite.sql().createStatement(\r\n "SELECT * FROM users WHERE age > ? AND status = ?"\r\n);\r\n\r\ntry (ResultSet rs = ignite.sql().execute(\r\n null,\r\n stmt,\r\n 30,\r\n "active"\r\n)) {\r\n // Process results\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Use the statement builder for configuration:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'Statement stmt = ignite.sql().statementBuilder()\r\n .query("SELECT * FROM users WHERE age > ?")\r\n .defaultSchema("public")\r\n .queryTimeout(30, TimeUnit.SECONDS)\r\n .pageSize(1000)\r\n .build();\n'})}),"\n",(0,s.jsx)(n.h2,{id:"statement-configuration",children:"Statement Configuration"}),"\n",(0,s.jsx)(n.p,{children:"Configure statement behavior through builder options:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'Statement stmt = ignite.sql().statementBuilder()\r\n .query("SELECT * FROM products WHERE category = ?")\r\n .defaultSchema("inventory")\r\n .queryTimeout(60, TimeUnit.SECONDS)\r\n .pageSize(500)\r\n .timeZoneId(ZoneId.of("UTC"))\r\n .build();\r\n\r\ntry (ResultSet rs = ignite.sql().execute(null, stmt, "electronics")) {\r\n // Process results\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"The defaultSchema setting determines table resolution when queries omit schema names. The queryTimeout parameter limits execution time. The pageSize controls result batching for large result sets."}),"\n",(0,s.jsx)(n.h2,{id:"result-set-processing",children:"Result Set Processing"}),"\n",(0,s.jsx)(n.p,{children:"Access result metadata and values:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'try (ResultSet rs = ignite.sql().execute(\r\n null,\r\n "SELECT id, name, created FROM users"\r\n)) {\r\n ResultSetMetadata metadata = rs.metadata();\r\n System.out.println("Columns: " + metadata.columns().size());\r\n\r\n while (rs.hasNext()) {\r\n SqlRow row = rs.next();\r\n\r\n int id = row.intValue("id");\r\n String name = row.stringValue("name");\r\n LocalDateTime created = row.value("created");\r\n\r\n System.out.println(id + ": " + name + " created at " + created);\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Column metadata provides type information:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'for (int i = 0; i < metadata.columns().size(); i++) {\r\n ColumnMetadata col = metadata.columns().get(i);\r\n System.out.println(col.name() + " " + col.type() +\r\n " nullable=" + col.nullable());\r\n}\n'})}),"\n",(0,s.jsx)(n.h2,{id:"dml-operations",children:"DML Operations"}),"\n",(0,s.jsx)(n.p,{children:"Execute insert, update, and delete statements:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'try (ResultSet rs = ignite.sql().execute(\r\n null,\r\n "INSERT INTO users (id, name, age) VALUES (?, ?, ?)",\r\n 1, "Alice", 30\r\n)) {\r\n long affected = rs.affectedRows();\r\n System.out.println("Inserted " + affected + " rows");\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Check affected row counts for DML statements:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'try (ResultSet rs = ignite.sql().execute(\r\n null,\r\n "UPDATE users SET status = ? WHERE age > ?",\r\n "senior", 60\r\n)) {\r\n System.out.println("Updated " + rs.affectedRows() + " rows");\r\n}\n'})}),"\n",(0,s.jsx)(n.h2,{id:"ddl-operations",children:"DDL Operations"}),"\n",(0,s.jsx)(n.p,{children:"Execute schema definition statements:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'try (ResultSet rs = ignite.sql().execute(\r\n null,\r\n "CREATE TABLE products (id INT PRIMARY KEY, name VARCHAR, price DECIMAL)"\r\n)) {\r\n boolean applied = rs.wasApplied();\r\n System.out.println("DDL applied: " + applied);\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"DDL statements return applied status rather than row counts."}),"\n",(0,s.jsx)(n.h2,{id:"batch-operations",children:"Batch Operations"}),"\n",(0,s.jsx)(n.p,{children:"Execute multiple statements with different parameters:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'BatchedArguments batch = BatchedArguments.create();\r\n\r\nbatch.add(1, "Alice");\r\nbatch.add(2, "Bob");\r\nbatch.add(3, "Carol");\r\n\r\nlong[] results = ignite.sql().executeBatch(null, "INSERT INTO users (id, name) VALUES (?, ?)", batch);\r\nSystem.out.println("Inserted " + results.length + " batches");\n'})}),"\n",(0,s.jsx)(n.p,{children:"Batch operations reduce network overhead for multiple similar statements."}),"\n",(0,s.jsx)(n.h2,{id:"typed-result-mapping",children:"Typed Result Mapping"}),"\n",(0,s.jsx)(n.p,{children:"Map results to custom types using mappers:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'class User {\r\n public int id;\r\n public String name;\r\n public int age;\r\n}\r\n\r\ntry (ResultSet rs = ignite.sql().execute(\r\n null,\r\n Mapper.of(User.class),\r\n "SELECT id, name, age FROM users WHERE age > ?",\r\n 25\r\n)) {\r\n while (rs.hasNext()) {\r\n User user = rs.next();\r\n System.out.println(user.name + " is " + user.age + " years old");\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"The mapper automatically converts rows to objects based on column names and field names."}),"\n",(0,s.jsx)(n.h2,{id:"asynchronous-execution",children:"Asynchronous Execution"}),"\n",(0,s.jsx)(n.p,{children:"Execute queries asynchronously:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'CompletableFuture> future = ignite.sql().executeAsync(\r\n null,\r\n "SELECT * FROM users WHERE age > ?",\r\n 30\r\n);\r\n\r\nfuture.thenAccept(rs -> {\r\n try (rs) {\r\n while (rs.hasNext()) {\r\n SqlRow row = rs.next();\r\n System.out.println(row.stringValue("name"));\r\n }\r\n }\r\n});\n'})}),"\n",(0,s.jsx)(n.p,{children:"Asynchronous execution returns immediately without blocking the calling thread."}),"\n",(0,s.jsx)(n.h2,{id:"query-cancellation",children:"Query Cancellation"}),"\n",(0,s.jsx)(n.p,{children:"Cancel long-running queries using cancellation handles:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'CancelHandle cancelHandle = CancelHandle.create();\r\n\r\nCompletableFuture> future = ignite.sql().executeAsync(\r\n null,\r\n cancelHandle.token(),\r\n "SELECT * FROM large_table",\r\n new Object[0]\r\n);\r\n\r\n// Cancel after 5 seconds\r\nCompletableFuture.delayedExecutor(5, TimeUnit.SECONDS)\r\n .execute(cancelHandle::cancel);\n'})}),"\n",(0,s.jsx)(n.p,{children:"Cancelled queries stop execution and release resources."}),"\n",(0,s.jsx)(n.h2,{id:"transaction-integration",children:"Transaction Integration"}),"\n",(0,s.jsx)(n.p,{children:"Execute queries within transactions:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'ignite.transactions().runInTransaction(tx -> {\r\n try (ResultSet rs = ignite.sql().execute(\r\n tx,\r\n "SELECT balance FROM accounts WHERE id = ?",\r\n 1\r\n )) {\r\n SqlRow row = rs.next();\r\n int balance = row.intValue("balance");\r\n\r\n ignite.sql().execute(\r\n tx,\r\n "UPDATE accounts SET balance = ? WHERE id = ?",\r\n balance + 100,\r\n 1\r\n ).close();\r\n }\r\n});\n'})}),"\n",(0,s.jsx)(n.p,{children:"All statements using the same transaction see consistent data and commit atomically."}),"\n",(0,s.jsx)(n.h2,{id:"result-set-types",children:"Result Set Types"}),"\n",(0,s.jsx)(n.p,{children:"ResultSet indicates result type through metadata:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'try (ResultSet rs = ignite.sql().execute(null, query)) {\r\n if (rs.hasRowSet()) {\r\n // SELECT query, process rows\r\n while (rs.hasNext()) {\r\n SqlRow row = rs.next();\r\n // Process row\r\n }\r\n } else {\r\n // DML or DDL\r\n if (rs.affectedRows() >= 0) {\r\n // DML operation\r\n System.out.println("Affected: " + rs.affectedRows());\r\n } else {\r\n // DDL operation\r\n System.out.println("Applied: " + rs.wasApplied());\r\n }\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.h2,{id:"sqlrow-access",children:"SqlRow Access"}),"\n",(0,s.jsx)(n.p,{children:"Access row values by name or index:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'SqlRow row = rs.next();\r\n\r\n// By column name\r\nint id = row.intValue("id");\r\nString name = row.stringValue("name");\r\nDouble price = row.value("price");\r\n\r\n// By index\r\nObject value0 = row.value(0);\r\nString column0 = row.columnName(0);\r\n\r\n// Access metadata\r\nResultSetMetadata metadata = row.metadata();\r\nint columnCount = row.columnCount();\n'})}),"\n",(0,s.jsx)(n.p,{children:"SqlRow extends Tuple, providing all tuple access methods."}),"\n",(0,s.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["SQL facade: ",(0,s.jsx)(n.code,{children:"org.apache.ignite.sql.IgniteSql"})]}),"\n",(0,s.jsxs)(n.li,{children:["Statements: ",(0,s.jsx)(n.code,{children:"org.apache.ignite.sql.Statement"})]}),"\n",(0,s.jsxs)(n.li,{children:["Results: ",(0,s.jsx)(n.code,{children:"org.apache.ignite.sql.ResultSet"})]}),"\n",(0,s.jsxs)(n.li,{children:["Rows: ",(0,s.jsx)(n.code,{children:"org.apache.ignite.sql.SqlRow"})]}),"\n",(0,s.jsxs)(n.li,{children:["Metadata: ",(0,s.jsx)(n.code,{children:"org.apache.ignite.sql.ResultSetMetadata"}),", ",(0,s.jsx)(n.code,{children:"org.apache.ignite.sql.ColumnMetadata"})]}),"\n",(0,s.jsxs)(n.li,{children:["Batching: ",(0,s.jsx)(n.code,{children:"org.apache.ignite.sql.BatchedArguments"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"ignitesql-methods",children:"IgniteSql Methods"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Statement createStatement(String query)"})," - Create statement from query"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Statement.StatementBuilder statementBuilder()"})," - Create statement builder"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ResultSet execute(Transaction, String query, Object...)"})," - Execute query with parameters"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ResultSet execute(Transaction, Statement, Object...)"})," - Execute prepared statement"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"CompletableFuture> executeAsync(...)"})," - Async execution"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ResultSet execute(Transaction, CancellationToken, String query, Object...)"})," - Execute with cancellation"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:" ResultSet execute(Transaction, Mapper, String query, Object...)"})," - Execute with result mapping"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"long[] executeBatch(Transaction, String dmlQuery, BatchedArguments)"})," - Execute batch"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"CompletableFuture executeBatchAsync(Transaction, String query, BatchedArguments)"})," - Execute batch asynchronously"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"statement-configuration-1",children:"Statement Configuration"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"String query()"})," - Get query string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"long queryTimeout(TimeUnit)"})," - Get timeout"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"String defaultSchema()"})," - Get default schema"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"int pageSize()"})," - Get result page size"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ZoneId timeZoneId()"})," - Get time zone"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"statement-builder-methods",children:"Statement Builder Methods"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"query(String)"})," - Set query string"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"defaultSchema(String)"})," - Set default schema"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"queryTimeout(long, TimeUnit)"})," - Set query timeout"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"pageSize(int)"})," - Set result page size"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"timeZoneId(ZoneId)"})," - Set time zone"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"build()"})," - Build statement"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"resultset-methods",children:"ResultSet Methods"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ResultSetMetadata metadata()"})," - Get result metadata"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"boolean hasRowSet()"})," - Check if contains rows"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"long affectedRows()"})," - Get affected row count"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"boolean wasApplied()"})," - Check if DDL was applied"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"boolean hasNext()"})," - Check for more rows"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"T next()"})," - Get next row"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"void close()"})," - Close result set"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"resultsetmetadata-methods",children:"ResultSetMetadata Methods"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"List columns()"})," - Get list of column metadata"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"int indexOf(String columnName)"})," - Get column index by name"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"columnmetadata-methods",children:"ColumnMetadata Methods"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"String name()"})," - Column name"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ColumnType type()"})," - Column type"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"boolean nullable()"})," - Nullability"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"int precision()"})," - Precision"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"int scale()"})," - Scale"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"Class valueClass()"})," - Value class"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ColumnOrigin origin()"})," - Column origin"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/aa014cab.b00631e6.js b/docs/ignite3/assets/js/aa014cab.b00631e6.js deleted file mode 100644 index 5d10bae02e..0000000000 --- a/docs/ignite3/assets/js/aa014cab.b00631e6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9042],{11470:(e,n,t)=>{t.d(n,{A:()=>I});var a=t(96540),r=t(34164),i=t(17559),s=t(23104),l=t(56347),c=t(205),o=t(57485),d=t(31682),u=t(70679);function h(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function g(e){const{values:n,children:t}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:a}})=>({value:e,label:n,attributes:t,default:a}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const t=(0,l.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,o.aZ)(r),(0,a.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=g(e),[s,l]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:i})),[o,d]=x({queryString:t,groupId:r}),[h,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,u.Dv)(n);return[t,(0,a.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),b=(()=>{const e=o??h;return p({value:e,tabValues:i})?e:null})();(0,c.A)(()=>{b&&l(b)},[b]);return{selectedValue:s,selectValue:(0,a.useCallback)(e=>{if(!p({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),m(e)},[d,m,i]),tabValues:i}}var b=t(92303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(74848);function f({className:e,block:n,selectedValue:t,selectValue:a,tabValues:i}){const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),o=e=>{const n=e.currentTarget,r=l.indexOf(n),s=i[r].value;s!==t&&(c(n),a(s))},d=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:a})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:o,...a,className:(0,r.A)("tabs__item",j.tabItem,a?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:t}){const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=i.find(e=>e.props.value===t);return e?(0,a.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:i.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function w(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,r.A)(i.G.tabs.container,"tabs-container",j.tabList),children:[(0,v.jsx)(f,{...n,...e}),(0,v.jsx)(y,{...n,...e})]})}function I(e){const n=(0,b.A)();return(0,v.jsx)(w,{...e,children:h(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var a=t(34164);const r={tabItem:"tabItem_Ymn6"};var i=t(74848);function s({children:e,hidden:n,className:t}){return(0,i.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var a=t(96540);const r={},i=a.createContext(r);function s(e){const n=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(i.Provider,{value:n},e.children)}},73381:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/data_streaming-6b2d018b11aa91d7b373e308efcd713f.png"},97099:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>g,frontMatter:()=>c,metadata:()=>a,toc:()=>u});const a=JSON.parse('{"id":"develop/ignite-clients/dotnet-client","title":".NET Client","description":"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there are no separate Thin and Thick clients in Ignite 3. All clients are \'thin\'.","source":"@site/docs/develop/ignite-clients/dotnet.md","sourceDirName":"develop/ignite-clients","slug":"/develop/ignite-clients/dotnet-client","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"id":"dotnet-client","title":".NET Client","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Java Client","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/java-client"},"next":{"title":"C++ Client","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client"}}');var r=t(74848),i=t(28453),s=t(11470),l=t(19365);const c={id:"dotnet-client",title:".NET Client",sidebar_position:2},o=void 0,d={},u=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Installation",id:"installation",level:3},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Authentication",id:"authentication",level:2},{value:"Limitations",id:"limitations",level:3},{value:"Usage Examples",id:"usage-examples",level:3},{value:"Using Dependency Injection",id:"using-dependency-injection",level:2},{value:"SQL API",id:"sql-api",level:2},{value:"Batch SQL Execution",id:"batch-sql-execution",level:3},{value:"Parameters",id:"parameters",level:4},{value:"Example",id:"example",level:4},{value:"SQL Scripts",id:"sql-scripts",level:3},{value:"Transactions",id:"transactions",level:2},{value:"Table API",id:"table-api",level:2},{value:"Getting a Table Instance",id:"getting-a-table-instance",level:3},{value:"Basic Table Operations",id:"basic-table-operations",level:3},{value:"Tuple Record View",id:"tuple-record-view",level:4},{value:"Record View",id:"record-view",level:4},{value:"Key-Value Tuple View",id:"key-value-tuple-view",level:4},{value:"Key-Value View",id:"key-value-view",level:4},{value:"Streaming Data",id:"streaming-data",level:2},{value:"Using Data Streamer API",id:"using-data-streamer-api",level:3},{value:"Client Metrics",id:"client-metrics",level:2},{value:"Available .NET Metrics",id:"available-net-metrics",level:3},{value:"Logging",id:"logging",level:2},{value:"Examples",id:"examples",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there are no separate Thin and Thick clients in Ignite 3. All clients are 'thin'."}),"\n",(0,r.jsx)(n.p,{children:"Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations."}),"\n",(0,r.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,r.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"To use C# thin client, .NET 8.0 or newer is required."}),"\n",(0,r.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(n.p,{children:["C# client is available via NuGet. To add it, use the ",(0,r.jsx)(n.code,{children:"add package"})," command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet add package Apache.Ignite --version 3.0.0\n"})}),"\n",(0,r.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["To initialize a client, use the ",(0,r.jsx)(n.code,{children:"IgniteClient"})," class, and provide it with the configuration:"]}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var clientCfg = new IgniteClientConfiguration\r\n{\r\n Endpoints = { "127.0.0.1" }\r\n};\r\nusing var client = await IgniteClient.StartAsync(clientCfg);\n'})})})}),"\n",(0,r.jsx)(n.h2,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsxs)(n.p,{children:["To pass authentication information, pass it to ",(0,r.jsx)(n.code,{children:"IgniteClient"})," builder:"]}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var cfg = new IgniteClientConfiguration("127.0.0.1:10800")\r\n{\r\n\tAuthenticator = new BasicAuthenticator\r\n\t{\r\n\t\tUsername = "myUser",\r\n\t\tPassword = "myPassword"\r\n\t}\r\n};\r\nIIgniteClient client = await IgniteClient.StartAsync(cfg);\n'})})})}),"\n",(0,r.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,r.jsx)(n.p,{children:"There are limitations to user types that can be used for such a mapping. Some limitations are common, and others are platform-specific due to the programming language used."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Only flat field structure is supported, meaning no nesting user objects. This is because Ignite tables, and therefore tuples have flat structure themselves."}),"\n",(0,r.jsx)(n.li,{children:"Fields should be mapped to Ignite types."}),"\n",(0,r.jsx)(n.li,{children:"All fields in user type should either be mapped to Table column or explicitly excluded."}),"\n",(0,r.jsx)(n.li,{children:"All columns from Table should be mapped to some field in the user type."}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.em,{children:".NET only"}),": Any type (class, struct, record) is supported as long as all fields can be mapped to Ignite types."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"public class Account\r\n{\r\n public long Id { get; set; }\r\n public long Balance { get; set; }\r\n\r\n [NotMapped]\r\n public Guid UnmappedId { get; set; }\r\n}\n"})})})}),"\n",(0,r.jsx)(n.h2,{id:"using-dependency-injection",children:"Using Dependency Injection"}),"\n",(0,r.jsxs)(n.p,{children:["Ignite client provides support for using ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection",children:"Dependency Injection"})," when initializing a client instance."]}),"\n",(0,r.jsx)(n.p,{children:"This approach can be used to simplify initializing the client in DI containers:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Register the ",(0,r.jsx)(n.code,{children:"IgniteClientGroup"})," in your DI container:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'builder.Services.AddSingleton(_ => new IgniteClientGroup(\r\n new IgniteClientGroupConfiguration\r\n {\r\n Size = 3,\r\n ClientConfiguration = new("localhost"),\r\n }));\n'})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use an instance of the group you created in your methods:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:"public async Task Index([FromServices] IgniteClientGroup igniteGroup)\r\n{\r\n IIgnite ignite = await igniteGroup.GetIgniteAsync();\r\n var tables = await ignite.Tables.GetTablesAsync();\r\n return Ok(tables);\r\n}\n"})}),"\n",(0,r.jsx)(n.h2,{id:"sql-api",children:"SQL API"}),"\n",(0,r.jsxs)(n.p,{children:["Ignite 3 is focused on SQL, and SQL API is the primary way to work with the data. You can read more about supported SQL statements in the ",(0,r.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/ddl",children:"SQL Reference"})," section. Here is how you can send SQL requests:"]}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IResultSet resultSet = await client.Sql.ExecuteAsync(transaction: null, "select name from tbl where id = ?", 42);\r\nList rows = await resultSet.ToListAsync();\r\nIIgniteTuple row = rows.Single();\r\nDebug.Assert(row["name"] as string == "John Doe");\n'})})})}),"\n",(0,r.jsx)(n.h3,{id:"batch-sql-execution",children:"Batch SQL Execution"}),"\n",(0,r.jsx)(n.p,{children:"You can execute the specified DML statement once for each set of arguments and return the number of affected rows for each execution."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Only ",(0,r.jsx)(n.code,{children:"INSERT"}),", ",(0,r.jsx)(n.code,{children:"UPDATE"}),", ",(0,r.jsx)(n.code,{children:"DELETE"})," statements are supported."]})}),"\n",(0,r.jsxs)(n.p,{children:["To run a batch execution, you need to implement ",(0,r.jsx)(n.code,{children:"ExecuteBatchAsync()"})," method with the following parameters:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"Task ExecuteBatchAsync(\r\n ITransaction? transaction,\r\n SqlStatement statement,\r\n IEnumerable> args,\r\n CancellationToken cancellationToken = default\r\n);\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters",children:"Parameters"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"transaction"})," - The optional transaction in which to execute the batch."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"statement"})," - The SQL statement to execute for each entry in ",(0,r.jsx)(n.code,{children:"args"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"args"})," - A collection of argument lists. The statement will be executed once per inner collection. Must not be empty or contain empty rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"cancellationToken"})," - Token for cancelling the operation."]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"example",children:"Example"}),"\n",(0,r.jsxs)(n.p,{children:["In this example we return an array of update counts. Each element corresponds to the number of rows affected by the statement execution for the matching entry in ",(0,r.jsx)(n.code,{children:"args"}),". The length of the returned array equals the number of argument sets."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'long[] res = await sql.ExecuteBatchAsync(\r\n transaction: null,\r\n statement: "INSERT INTO Person (Id, Name) VALUES (?, ?)",\r\n args:\r\n [\r\n [1, "Alice"],\r\n [2, "Bob" ],\r\n [3, "Charlie"]\r\n ]\r\n);\r\n// res => [1, 1, 1]\n'})}),"\n",(0,r.jsx)(n.h3,{id:"sql-scripts",children:"SQL Scripts"}),"\n",(0,r.jsxs)(n.p,{children:["The default API executes SQL statements one at a time. If you want to execute large SQL statements, pass them to the ",(0,r.jsx)(n.code,{children:"executeScript()"})," method. These statements will be executed in order."]}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"string script =\r\n \"CREATE TABLE IF NOT EXISTS Person (id int primary key, city_id int, name varchar, age int, company varchar);\" +\r\n \"INSERT INTO Person (1,3, 'John', 43, 'Sample')\";\r\n\r\nawait Client.Sql.ExecuteScriptAsync(script);\n"})})})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"Execution of each statement is considered complete when the first page is ready to be returned. As a result, when working with large data sets, SELECT statement may be affected by later statements in the same script."})}),"\n",(0,r.jsx)(n.h2,{id:"transactions",children:"Transactions"}),"\n",(0,r.jsx)(n.p,{children:"All table operations in Ignite 3 are transactional. You can provide an explicit transaction as a first argument of any Table and SQL API call. If you do not provide an explicit transaction, an implicit one will be created for every call."}),"\n",(0,r.jsx)(n.p,{children:"Here is how you can provide a transaction explicitly:"}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"var accounts = table.GetKeyValueView();\r\nawait accounts.PutAsync(transaction: null, 42, new Account(16_000));\r\n\r\nawait using ITransaction tx = await client.Transactions.BeginAsync();\r\n\r\n(Account account, bool hasValue) = await accounts.GetAsync(tx, 42);\r\naccount = account with { Balance = account.Balance + 500 };\r\n\r\nawait accounts.PutAsync(tx, 42, account);\r\n\r\nDebug.Assert((await accounts.GetAsync(tx, 42)).Value.Balance == 16_500);\r\n\r\nawait tx.RollbackAsync();\r\n\r\nDebug.Assert((await accounts.GetAsync(null, 42)).Value.Balance == 16_000);\r\n\r\npublic record Account(decimal Balance);\n"})})})}),"\n",(0,r.jsx)(n.h2,{id:"table-api",children:"Table API"}),"\n",(0,r.jsx)(n.p,{children:"To execute table operations on a specific table, you need to get a specific view of the table and use one of its methods. You can only create new tables by using SQL API."}),"\n",(0,r.jsx)(n.p,{children:"When working with tables, you can use built-in Tuple type, which is a set of key-value pairs underneath, or map the data to your own types for a strongly-typed access. Here is how you can work with tables:"}),"\n",(0,r.jsx)(n.h3,{id:"getting-a-table-instance",children:"Getting a Table Instance"}),"\n",(0,r.jsxs)(n.p,{children:["To obtain an instance of a table, use the ",(0,r.jsx)(n.code,{children:"ITables.GetTableAsync(string name)"})," You can also use ",(0,r.jsx)(n.code,{children:"ITables.GetTablesAsync"})," method to list all existing tables."]}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var existingTables = await Client.Tables.GetTablesAsync();\r\nvar firstTable = existingTables[0];\r\n\r\nvar myTable = await Client.Tables.GetTableAsync("MY_TABLE");\n'})})})}),"\n",(0,r.jsx)(n.h3,{id:"basic-table-operations",children:"Basic Table Operations"}),"\n",(0,r.jsx)(n.p,{children:"Once you've got a table you need to get a specific view to choose how you want to operate table records."}),"\n",(0,r.jsx)(n.h4,{id:"tuple-record-view",children:"Tuple Record View"}),"\n",(0,r.jsx)(n.p,{children:"A tuple record view. It can be used to operate table tuples directly."}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IRecordView view = table.RecordBinaryView;\r\n\r\nIIgniteTuple fullRecord = new IgniteTuple\r\n{\r\n ["id"] = 42,\r\n ["name"] = "John Doe"\r\n};\r\n\r\nawait view.UpsertAsync(transaction: null, fullRecord);\r\n\r\nIIgniteTuple keyRecord = new IgniteTuple { ["id"] = 42 };\r\n(IIgniteTuple value, bool hasValue) = await view.GetAsync(transaction: null, keyRecord);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.FieldCount == 2);\r\nDebug.Assert(value["id"] as int? == 42);\r\nDebug.Assert(value["name"] as string == "John Doe");\n'})})})}),"\n",(0,r.jsx)(n.h4,{id:"record-view",children:"Record View"}),"\n",(0,r.jsx)(n.p,{children:"A record view mapped to a user type. It can be used to operate table using user objects which are mapped to table tuples."}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var pocoView = table.GetRecordView();\r\n\r\nawait pocoView.UpsertAsync(transaction: null, new Poco(42, "John Doe"));\r\nvar (value, hasValue) = await pocoView.GetAsync(transaction: null, new Poco(42));\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.Name == "John Doe");\r\n\r\npublic record Poco(long Id, string? Name = null);\n'})})})}),"\n",(0,r.jsx)(n.h4,{id:"key-value-tuple-view",children:"Key-Value Tuple View"}),"\n",(0,r.jsx)(n.p,{children:"A tuple key-value view. It can be used to operate table using key and value tuples separately."}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IKeyValueView kvView = table.KeyValueBinaryView;\r\n\r\nIIgniteTuple key = new IgniteTuple { ["id"] = 42 };\r\nIIgniteTuple val = new IgniteTuple { ["name"] = "John Doe" };\r\n\r\nawait kvView.PutAsync(transaction: null, key, val);\r\n(IIgniteTuple? value, bool hasValue) = await kvView.GetAsync(transaction: null, key);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.FieldCount == 1);\r\nDebug.Assert(value["name"] as string == "John Doe");\n'})})})}),"\n",(0,r.jsx)(n.h4,{id:"key-value-view",children:"Key-Value View"}),"\n",(0,r.jsx)(n.p,{children:"A key-value view with user objects. It can be used to operate table using key and value user objects mapped to table tuples."}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IKeyValueView kvView = table.GetKeyValueView();\r\n\r\nawait kvView.PutAsync(transaction: null, 42, new Poco(Id: 0, Name: "John Doe"));\r\n(Poco? value, bool hasValue) = await kvView.GetAsync(transaction: null, 42);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.Name == "John Doe");\r\n\r\npublic record Poco(long Id, string? Name = null);\n'})})})}),"\n",(0,r.jsx)(n.h2,{id:"streaming-data",children:"Streaming Data"}),"\n",(0,r.jsx)(n.p,{children:"To stream a large amount of data, use the data streamer. Data streaming provides a quicker and more efficient way to load, organize and optimally distribute your data. Data streamer accepts a stream of data and distributes data entries across the cluster, where the processing takes place. Data streaming is available in all table views."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Data Streaming",src:t(73381).A+"",width:"1278",height:"673"})}),"\n",(0,r.jsx)(n.p,{children:"Data streaming provides at-least-once delivery guarantee."}),"\n",(0,r.jsx)(n.h3,{id:"using-data-streamer-api",children:"Using Data Streamer API"}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var options = DataStreamerOptions.Default with { PageSize = 10 };\r\nvar data = Enumerable.Range(0, Count).Select(x => new IgniteTuple { ["id"] = 1L, ["name"] = "foo" }).ToList();\r\n\r\nawait TupleView.StreamDataAsync(data.ToAsyncEnumerable(), options);\n'})})})}),"\n",(0,r.jsx)(n.h2,{id:"client-metrics",children:"Client Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["Metrics are exposed by the .NET client through the ",(0,r.jsx)(n.code,{children:"System.Diagnostics.Metrics"})," API with the ",(0,r.jsx)(n.code,{children:"Apache.Ignite"})," meter name. For example, here is how you can access Ignite metrics by using the ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-counters",children:"dotnet-counters"})," tool:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet-counters monitor --counters Apache.Ignite,System.Runtime --process-id PID\n"})}),"\n",(0,r.jsx)(n.p,{children:"You can also get metrics in your code by creating a listener:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var listener = new MeterListener();\r\nlistener.InstrumentPublished = (instrument, meterListener) =>\r\n{\r\n if (instrument.Meter.Name == "Apache.Ignite")\r\n {\r\n meterListener.EnableMeasurementEvents(instrument);\r\n }\r\n};\r\nlistener.SetMeasurementEventCallback(\r\n (instrument, measurement, tags, state) => Console.WriteLine($"{instrument.Name}: {measurement}"));\r\n\r\nlistener.Start();\n'})}),"\n",(0,r.jsx)(n.h3,{id:"available-net-metrics",children:"Available .NET Metrics"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Metric name"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connections-active"}),(0,r.jsx)(n.td,{children:"The number of currently active connections."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connections-established"}),(0,r.jsx)(n.td,{children:"The number of established connections."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connections-lost"}),(0,r.jsx)(n.td,{children:"The number of connections lost."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connections-lost-timeout"}),(0,r.jsx)(n.td,{children:"The number of connections lost due to a timeout."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"handshakes-failed"}),(0,r.jsx)(n.td,{children:"The number of failed handshakes."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"handshakes-failed-timeout"}),(0,r.jsx)(n.td,{children:"The number of handshakes that failed due to a timeout."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-active"}),(0,r.jsx)(n.td,{children:"The number of currently active requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-sent"}),(0,r.jsx)(n.td,{children:"The number of requests sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-completed"}),(0,r.jsx)(n.td,{children:"The number of completed requests. Requests are completed once a response is received."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-retried"}),(0,r.jsx)(n.td,{children:"The number of request retries."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-failed"}),(0,r.jsx)(n.td,{children:"The number of failed requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"bytes-sent"}),(0,r.jsx)(n.td,{children:"The amount of bytes sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"bytes-received"}),(0,r.jsx)(n.td,{children:"The amount of bytes received."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"streamer-batches-sent"}),(0,r.jsx)(n.td,{children:"The number of data streamer batches sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"streamer-items-sent"}),(0,r.jsx)(n.td,{children:"The number of data streamer items sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"streamer-batches-active"}),(0,r.jsx)(n.td,{children:"The number of existing data streamer batches."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"streamer-items-queued"}),(0,r.jsx)(n.td,{children:"The number of queued data streamer items."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsxs)(n.p,{children:["To enable logging, set the ",(0,r.jsx)(n.code,{children:"IgniteClientConfiguration.LoggerFactory"})," property to an instance of the ",(0,r.jsx)(n.code,{children:"Microsoft.Extensions.Logging.ILoggerFactory"})," standard API. See ",(0,r.jsx)(n.a,{href:"https://docs.microsoft.com/en-us/dotnet/core/extensions/logging",children:"Standard logging in .NET"})," to learn more."]}),"\n",(0,r.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,r.jsxs)(n.p,{children:["The example below shows how you can configure logging to console with the ",(0,r.jsx)(n.code,{children:"Microsoft.Extensions.Logging.Console"})," package:"]}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"var cfg = new IgniteClientConfiguration\r\n{\r\n LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Debug))\r\n};\n"})})})}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, here is how to configure logging with ",(0,r.jsx)(n.a,{href:"https://serilog.net/",children:"Serilog"})," by using ",(0,r.jsx)(n.code,{children:"Serilog.Extensions.Logging"})," and ",(0,r.jsx)(n.code,{children:"Serilog.Sinks.Console"})," packages:"]}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"var cfg = new IgniteClientConfiguration\r\n{\r\n LoggerFactory = LoggerFactory.Create(builder =>\r\n builder.AddSerilog(new LoggerConfiguration()\r\n .MinimumLevel.Debug()\r\n .WriteTo.Console()\r\n .CreateLogger()))\r\n};\n"})})})})]})}function g(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/aab940e4.019936bb.js b/docs/ignite3/assets/js/aab940e4.019936bb.js deleted file mode 100644 index 4141b922a8..0000000000 --- a/docs/ignite3/assets/js/aab940e4.019936bb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9189],{11470:(e,n,t)=>{t.d(n,{A:()=>T});var a=t(96540),r=t(34164),s=t(17559),i=t(23104),l=t(56347),c=t(205),o=t(57485),d=t(31682),u=t(70679);function h(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function g(e){const{values:n,children:t}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:a}})=>({value:e,label:n,attributes:t,default:a}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const t=(0,l.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,o.aZ)(r),(0,a.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function x(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=g(e),[i,l]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s})),[o,d]=m({queryString:t,groupId:r}),[h,x]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,u.Dv)(n);return[t,(0,a.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),b=(()=>{const e=o??h;return p({value:e,tabValues:s})?e:null})();(0,c.A)(()=>{b&&l(b)},[b]);return{selectedValue:i,selectValue:(0,a.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),x(e)},[d,x,s]),tabValues:s}}var b=t(92303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=t(74848);function f({className:e,block:n,selectedValue:t,selectValue:a,tabValues:s}){const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),o=e=>{const n=e.currentTarget,r=l.indexOf(n),i=s[r].value;i!==t&&(c(n),a(i))},d=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:a})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:o,...a,className:(0,r.A)("tabs__item",j.tabItem,a?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:t}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===t);return e?(0,a.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function w(e){const n=x(e);return(0,v.jsxs)("div",{className:(0,r.A)(s.G.tabs.container,"tabs-container",j.tabList),children:[(0,v.jsx)(f,{...n,...e}),(0,v.jsx)(y,{...n,...e})]})}function T(e){const n=(0,b.A)();return(0,v.jsx)(w,{...e,children:h(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>i});t(96540);var a=t(34164);const r={tabItem:"tabItem_Ymn6"};var s=t(74848);function i({children:e,hidden:n,className:t}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var a=t(96540);const r={},s=a.createContext(r);function i(e){const n=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),a.createElement(s.Provider,{value:n},e.children)}},62973:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>g,frontMatter:()=>c,metadata:()=>a,toc:()=>u});const a=JSON.parse('{"id":"developers-guide/clients/dotnet","title":".NET Client","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/clients/dotnet.md","sourceDirName":"developers-guide/clients","slug":"/developers-guide/clients/dotnet","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/dotnet","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":".NET Client","sidebar_label":".NET"},"sidebar":"tutorialSidebar","previous":{"title":"Java","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/java"},"next":{"title":"C++","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/cpp"}}');var r=t(74848),s=t(28453),i=t(11470),l=t(19365);const c={title:".NET Client",sidebar_label:".NET"},o=void 0,d={},u=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Installation",id:"installation",level:3},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Authentication",id:"authentication",level:2},{value:"Limitations",id:"limitations",level:3},{value:"Usage Examples",id:"usage-examples",level:3},{value:"Using Dependency Injection",id:"using-dependency-injection",level:2},{value:"SQL API",id:"sql-api",level:2},{value:"Batch SQL Execution",id:"batch-sql-execution",level:3},{value:"Parameters",id:"parameters",level:4},{value:"Example",id:"example",level:4},{value:"SQL Scripts",id:"sql-scripts",level:3},{value:"Transactions",id:"transactions",level:2},{value:"Table API",id:"table-api",level:2},{value:"Getting a Table Instance",id:"getting-a-table-instance",level:3},{value:"Basic Table Operations",id:"basic-table-operations",level:3},{value:"Tuple Record View",id:"tuple-record-view",level:4},{value:"Record View",id:"record-view",level:4},{value:"Key-Value Tuple View",id:"key-value-tuple-view",level:4},{value:"Key-Value View",id:"key-value-view",level:4},{value:"Streaming Data",id:"streaming-data",level:2},{value:"Using Data Streamer API",id:"using-data-streamer-api",level:3},{value:"Client Metrics",id:"client-metrics",level:2},{value:"Available .NET Metrics",id:"available-net-metrics",level:3},{value:"Logging",id:"logging",level:2},{value:"Examples",id:"examples",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n","\n",(0,r.jsx)(n.p,{children:"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there are no separate Thin and Thick clients in Ignite 3. All clients are 'thin'."}),"\n",(0,r.jsx)(n.p,{children:"Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations."}),"\n",(0,r.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,r.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"To use C# thin client, .NET 8.0 or newer is required."}),"\n",(0,r.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,r.jsxs)(n.p,{children:["C# client is available via NuGet. To add it, use the ",(0,r.jsx)(n.code,{children:"add package"})," command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet add package Apache.Ignite --version 3.0.0\n"})}),"\n",(0,r.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["To initialize a client, use the ",(0,r.jsx)(n.code,{children:"IgniteClient"})," class, and provide it with the configuration:"]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var clientCfg = new IgniteClientConfiguration\r\n{\r\n Endpoints = { "127.0.0.1" }\r\n};\r\nusing var client = await IgniteClient.StartAsync(clientCfg);\n'})})})}),"\n",(0,r.jsx)(n.h2,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsxs)(n.p,{children:["To pass authentication information, pass it to ",(0,r.jsx)(n.code,{children:"IgniteClient"})," builder:"]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var cfg = new IgniteClientConfiguration("127.0.0.1:10800")\r\n{\r\n\tAuthenticator = new BasicAuthenticator\r\n\t{\r\n\t\tUsername = "myUser",\r\n\t\tPassword = "myPassword"\r\n\t}\r\n};\r\nIIgniteClient client = await IgniteClient.StartAsync(cfg);\n'})})})}),"\n",(0,r.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,r.jsx)(n.p,{children:"There are limitations to user types that can be used for such a mapping. Some limitations are common, and others are platform-specific due to the programming language used."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Only flat field structure is supported, meaning no nesting user objects. This is because Ignite tables, and therefore tuples have flat structure themselves;"}),"\n",(0,r.jsx)(n.li,{children:"Fields should be mapped to Ignite types;"}),"\n",(0,r.jsx)(n.li,{children:"All fields in user type should either be mapped to Table column or explicitly excluded;"}),"\n",(0,r.jsx)(n.li,{children:"All columns from Table should be mapped to some field in the user type;"}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:".NET only"}),": Any type (class, struct, record) is supported as long as all fields can be mapped to Ignite types;"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"public class Account\r\n{\r\n public long Id { get; set; }\r\n public long Balance { get; set; }\r\n\r\n [NotMapped]\r\n public Guid UnmappedId { get; set; }\r\n}\n"})})})}),"\n",(0,r.jsx)(n.h2,{id:"using-dependency-injection",children:"Using Dependency Injection"}),"\n",(0,r.jsxs)(n.p,{children:["Ignite client provides support for using ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection",children:"Dependency Injection"})," when initializing a client instance."]}),"\n",(0,r.jsx)(n.p,{children:"This approach can be used to simplify initializing the client in DI containers:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Register the ",(0,r.jsx)(n.code,{children:"IgniteClientGroup"})," in your DI container:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'builder.Services.AddSingleton(_ => new IgniteClientGroup(\r\n new IgniteClientGroupConfiguration\r\n {\r\n Size = 3,\r\n ClientConfiguration = new("localhost"),\r\n }));\n'})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use an instance of the group you created in your methods:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:"public async Task Index([FromServices] IgniteClientGroup igniteGroup)\r\n{\r\n IIgnite ignite = await igniteGroup.GetIgniteAsync();\r\n var tables = await ignite.Tables.GetTablesAsync();\r\n return Ok(tables);\r\n}\n"})}),"\n",(0,r.jsx)(n.h2,{id:"sql-api",children:"SQL API"}),"\n",(0,r.jsxs)(n.p,{children:["Ignite 3 is focused on SQL, and SQL API is the primary way to work with the data. You can read more about supported SQL statements in the ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl",children:"SQL Reference"})," section. Here is how you can send SQL requests:"]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IResultSet resultSet = await client.Sql.ExecuteAsync(transaction: null, "select name from tbl where id = ?", 42);\r\nList rows = await resultSet.ToListAsync();\r\nIIgniteTuple row = rows.Single();\r\nDebug.Assert(row["name"] as string == "John Doe");\n'})})})}),"\n",(0,r.jsx)(n.h3,{id:"batch-sql-execution",children:"Batch SQL Execution"}),"\n",(0,r.jsx)(n.p,{children:"You can execute the specified DML statement once for each set of arguments and return the number of affected rows for each execution."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Only ",(0,r.jsx)(n.code,{children:"INSERT"}),", ",(0,r.jsx)(n.code,{children:"UPDATE"}),", ",(0,r.jsx)(n.code,{children:"DELETE"})," statements are supported."]})}),"\n",(0,r.jsxs)(n.p,{children:["To run a batch execution, you need to implement ",(0,r.jsx)(n.code,{children:"ExecuteBatchAsync()"})," method with the following parameters:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"Task ExecuteBatchAsync(\r\n ITransaction? transaction,\r\n SqlStatement statement,\r\n IEnumerable> args,\r\n CancellationToken cancellationToken = default\r\n);\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters",children:"Parameters"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"transaction"})," - The optional transaction in which to execute the batch."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"statement"})," - The SQL statement to execute for each entry in ",(0,r.jsx)(n.code,{children:"args"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"args"})," - A collection of argument lists. The statement will be executed once per inner collection. Must not be empty or contain empty rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"cancellationToken"})," - Token for cancelling the operation."]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"example",children:"Example"}),"\n",(0,r.jsxs)(n.p,{children:["In this example we return an array of update counts.\r\nEach element corresponds to the number of rows affected by the statement execution for the matching entry in ",(0,r.jsx)(n.code,{children:"args"}),". The length of the returned array equals the number of argument sets."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'long[] res = await sql.ExecuteBatchAsync(\r\n transaction: null,\r\n statement: "INSERT INTO Person (Id, Name) VALUES (?, ?)",\r\n args:\r\n [\r\n [1, "Alice"],\r\n [2, "Bob" ],\r\n [3, "Charlie"]\r\n ]\r\n);\r\n// res => [1, 1, 1]\n'})}),"\n",(0,r.jsx)(n.h3,{id:"sql-scripts",children:"SQL Scripts"}),"\n",(0,r.jsxs)(n.p,{children:["The default API executes SQL statements one at a time. If you want to execute large SQL statements, pass them to the ",(0,r.jsx)(n.code,{children:"executeScript()"})," method. These statements will be executed in order."]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"string script =\r\n \"CREATE TABLE IF NOT EXISTS Person (id int primary key, city_id int, name varchar, age int, company varchar);\" +\r\n \"INSERT INTO Person (1,3, 'John', 43, 'Sample')\";\r\n\r\nawait Client.Sql.ExecuteScriptAsync(script);\n"})})})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"Execution of each statement is considered complete when the first page is ready to be returned. As a result, when working with large data sets, SELECT statement may be affected by later statements in the same script."})}),"\n",(0,r.jsx)(n.h2,{id:"transactions",children:"Transactions"}),"\n",(0,r.jsx)(n.p,{children:"All table operations in Ignite 3 are transactional. You can provide an explicit transaction as a first argument of any Table and SQL API call. If you do not provide an explicit transaction, an implicit one will be created for every call."}),"\n",(0,r.jsx)(n.p,{children:"Here is how you can provide a transaction explicitly:"}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"var accounts = table.GetKeyValueView();\r\nawait accounts.PutAsync(transaction: null, 42, new Account(16_000));\r\n\r\nawait using ITransaction tx = await client.Transactions.BeginAsync();\r\n\r\n(Account account, bool hasValue) = await accounts.GetAsync(tx, 42);\r\naccount = account with { Balance = account.Balance + 500 };\r\n\r\nawait accounts.PutAsync(tx, 42, account);\r\n\r\nDebug.Assert((await accounts.GetAsync(tx, 42)).Value.Balance == 16_500);\r\n\r\nawait tx.RollbackAsync();\r\n\r\nDebug.Assert((await accounts.GetAsync(null, 42)).Value.Balance == 16_000);\r\n\r\npublic record Account(decimal Balance);\n"})})})}),"\n",(0,r.jsx)(n.h2,{id:"table-api",children:"Table API"}),"\n",(0,r.jsx)(n.p,{children:"To execute table operations on a specific table, you need to get a specific view of the table and use one of its methods. You can only create new tables by using SQL API."}),"\n",(0,r.jsx)(n.p,{children:"When working with tables, you can use built-in Tuple type, which is a set of key-value pairs underneath, or map the data to your own types for a strongly-typed access. Here is how you can work with tables:"}),"\n",(0,r.jsx)(n.h3,{id:"getting-a-table-instance",children:"Getting a Table Instance"}),"\n",(0,r.jsxs)(n.p,{children:["To obtain an instance of a table, use the ",(0,r.jsx)(n.code,{children:"ITables.GetTableAsync(string name)"})," You can also use ",(0,r.jsx)(n.code,{children:"ITables.GetTablesAsync"})," method to list all existing tables."]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var existingTables = await Client.Tables.GetTablesAsync();\r\nvar firstTable = existingTables[0];\r\n\r\nvar myTable = await Client.Tables.GetTableAsync("MY_TABLE");\n'})})})}),"\n",(0,r.jsx)(n.h3,{id:"basic-table-operations",children:"Basic Table Operations"}),"\n",(0,r.jsx)(n.p,{children:"Once you've got a table you need to get a specific view to choose how you want to operate table records."}),"\n",(0,r.jsx)(n.h4,{id:"tuple-record-view",children:"Tuple Record View"}),"\n",(0,r.jsx)(n.p,{children:"A tuple record view. It can be used to operate table tuples directly."}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IRecordView view = table.RecordBinaryView;\r\n\r\nIIgniteTuple fullRecord = new IgniteTuple\r\n{\r\n ["id"] = 42,\r\n ["name"] = "John Doe"\r\n};\r\n\r\nawait view.UpsertAsync(transaction: null, fullRecord);\r\n\r\nIIgniteTuple keyRecord = new IgniteTuple { ["id"] = 42 };\r\n(IIgniteTuple value, bool hasValue) = await view.GetAsync(transaction: null, keyRecord);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.FieldCount == 2);\r\nDebug.Assert(value["id"] as int? == 42);\r\nDebug.Assert(value["name"] as string == "John Doe");\n'})})})}),"\n",(0,r.jsx)(n.h4,{id:"record-view",children:"Record View"}),"\n",(0,r.jsx)(n.p,{children:"A record view mapped to a user type. It can be used to operate table using user objects which are mapped to table tuples."}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var pocoView = table.GetRecordView();\r\n\r\nawait pocoView.UpsertAsync(transaction: null, new Poco(42, "John Doe"));\r\nvar (value, hasValue) = await pocoView.GetAsync(transaction: null, new Poco(42));\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.Name == "John Doe");\r\n\r\npublic record Poco(long Id, string? Name = null);\n'})})})}),"\n",(0,r.jsx)(n.h4,{id:"key-value-tuple-view",children:"Key-Value Tuple View"}),"\n",(0,r.jsx)(n.p,{children:"A tuple key-value view. It can be used to operate table using key and value tuples separately."}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IKeyValueView kvView = table.KeyValueBinaryView;\r\n\r\nIIgniteTuple key = new IgniteTuple { ["id"] = 42 };\r\nIIgniteTuple val = new IgniteTuple { ["name"] = "John Doe" };\r\n\r\nawait kvView.PutAsync(transaction: null, key, val);\r\n(IIgniteTuple? value, bool hasValue) = await kvView.GetAsync(transaction: null, key);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.FieldCount == 1);\r\nDebug.Assert(value["name"] as string == "John Doe");\n'})})})}),"\n",(0,r.jsx)(n.h4,{id:"key-value-view",children:"Key-Value View"}),"\n",(0,r.jsx)(n.p,{children:"A key-value view with user objects. It can be used to operate table using key and value user objects mapped to table tuples."}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'IKeyValueView kvView = table.GetKeyValueView();\r\n\r\nawait kvView.PutAsync(transaction: null, 42, new Poco(Id: 0, Name: "John Doe"));\r\n(Poco? value, bool hasValue) = await kvView.GetAsync(transaction: null, 42);\r\n\r\nDebug.Assert(hasValue);\r\nDebug.Assert(value.Name == "John Doe");\r\n\r\npublic record Poco(long Id, string? Name = null);\n'})})})}),"\n",(0,r.jsx)(n.h2,{id:"streaming-data",children:"Streaming Data"}),"\n",(0,r.jsx)(n.p,{children:"To stream a large amount of data, use the data streamer. Data streaming provides a quicker and more efficient way to load, organize and optimally distribute your data. Data streamer accepts a stream of data and distributes data entries across the cluster, where the processing takes place. Data streaming is available in all table views."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Data Streaming",src:t(73381).A+"",width:"1278",height:"673"})}),"\n",(0,r.jsx)(n.p,{children:"Data streaming provides at-least-once delivery guarantee."}),"\n",(0,r.jsx)(n.h3,{id:"using-data-streamer-api",children:"Using Data Streamer API"}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:' var options = DataStreamerOptions.Default with { PageSize = 10 };\r\n var data = Enumerable.Range(0, Count).Select(x => new IgniteTuple { ["id"] = 1L, ["name"] = "foo" }).ToList();\r\n\r\n await TupleView.StreamDataAsync(data.ToAsyncEnumerable(), options);\n'})})})}),"\n",(0,r.jsx)(n.h2,{id:"client-metrics",children:"Client Metrics"}),"\n",(0,r.jsxs)(n.p,{children:["Metrics are exposed by the .NET client through the ",(0,r.jsx)(n.code,{children:"System.Diagnostics.Metrics"})," API with the ",(0,r.jsx)(n.code,{children:"Apache.Ignite"})," meter name. For example, here is how you can access Ignite metrics by using the ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-counters",children:"dotnet-counters"})," tool:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"dotnet-counters monitor --counters Apache.Ignite,System.Runtime --process-id PID\n"})}),"\n",(0,r.jsx)(n.p,{children:"You can also get metrics in your code by creating a listener:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var listener = new MeterListener();\r\nlistener.InstrumentPublished = (instrument, meterListener) =>\r\n{\r\n if (instrument.Meter.Name == "Apache.Ignite")\r\n {\r\n meterListener.EnableMeasurementEvents(instrument);\r\n }\r\n};\r\nlistener.SetMeasurementEventCallback(\r\n (instrument, measurement, tags, state) => Console.WriteLine($"{instrument.Name}: {measurement}"));\r\n\r\nlistener.Start();\n'})}),"\n",(0,r.jsx)(n.h3,{id:"available-net-metrics",children:"Available .NET Metrics"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Metric name"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connections-active"}),(0,r.jsx)(n.td,{children:"The number of currently active connections."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connections-established"}),(0,r.jsx)(n.td,{children:"The number of established connections."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connections-lost"}),(0,r.jsx)(n.td,{children:"The number of connections lost."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connections-lost-timeout"}),(0,r.jsx)(n.td,{children:"The number of connections lost due to a timeout."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"handshakes-failed"}),(0,r.jsx)(n.td,{children:"The number of failed handshakes."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"handshakes-failed-timeout"}),(0,r.jsx)(n.td,{children:"The number of handshakes that failed due to a timeout."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-active"}),(0,r.jsx)(n.td,{children:"The number of currently active requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-sent"}),(0,r.jsx)(n.td,{children:"The number of requests sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-completed"}),(0,r.jsx)(n.td,{children:"The number of completed requests. Requests are completed once a response is received."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-retried"}),(0,r.jsx)(n.td,{children:"The number of request retries."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"requests-failed"}),(0,r.jsx)(n.td,{children:"The number of failed requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"bytes-sent"}),(0,r.jsx)(n.td,{children:"The amount of bytes sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"bytes-received"}),(0,r.jsx)(n.td,{children:"The amount of bytes received."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"streamer-batches-sent"}),(0,r.jsx)(n.td,{children:"The number of data streamer batches sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"streamer-items-sent"}),(0,r.jsx)(n.td,{children:"The number of data streamer items sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"streamer-batches-active"}),(0,r.jsx)(n.td,{children:"The number of existing data streamer batches."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"streamer-items-queued"}),(0,r.jsx)(n.td,{children:"The number of queued data streamer items."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsxs)(n.p,{children:["To enable logging, set the ",(0,r.jsx)(n.code,{children:"IgniteClientConfiguration.LoggerFactory"})," property to an instance of the ",(0,r.jsx)(n.code,{children:"Microsoft.Extensions.Logging.ILoggerFactory"})," standard API.\r\nSee ",(0,r.jsx)(n.a,{href:"https://docs.microsoft.com/en-us/dotnet/core/extensions/logging",children:"Standard logging in .NET"})," to learn more."]}),"\n",(0,r.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,r.jsxs)(n.p,{children:["The example below shows how you can configure logging to console with the ",(0,r.jsx)(n.code,{children:"Microsoft.Extensions.Logging.Console"})," package:"]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"var cfg = new IgniteClientConfiguration\r\n{\r\n LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Debug))\r\n};\n"})})})}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, here is how to configure logging with ",(0,r.jsx)(n.a,{href:"https://serilog.net/",children:"Serilog"})," by using ",(0,r.jsx)(n.code,{children:"Serilog.Extensions.Logging"})," and ",(0,r.jsx)(n.code,{children:"Serilog.Sinks.Console"})," packages:"]}),"\n",(0,r.jsx)(i.A,{groupId:"programming-languages",children:(0,r.jsx)(l.A,{value:".NET",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:"var cfg = new IgniteClientConfiguration\r\n{\r\n LoggerFactory = LoggerFactory.Create(builder =>\r\n builder.AddSerilog(new LoggerConfiguration()\r\n .MinimumLevel.Debug()\r\n .WriteTo.Console()\r\n .CreateLogger()))\r\n};\n"})})})})]})}function g(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},73381:(e,n,t)=>{t.d(n,{A:()=>a});const a=t.p+"assets/images/data_streaming-6b2d018b11aa91d7b373e308efcd713f.png"}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/ac3be0c3.a1af6199.js b/docs/ignite3/assets/js/ac3be0c3.a1af6199.js deleted file mode 100644 index 74c82415b6..0000000000 --- a/docs/ignite3/assets/js/ac3be0c3.a1af6199.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4393],{28453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var o=n(96540);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}},62990:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/lifecycle2-277426ca0a68c7ae2132ed771376ff6b.png"},65413:(e,t,n)=>{n.d(t,{A:()=>o});const o=n.p+"assets/images/lifecycle1-022e218335d749f40dd850f775541b40.png"},66624:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"administrators-guide/lifecycle","title":"Cluster Lifecycle","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/lifecycle.md","sourceDirName":"administrators-guide","slug":"/administrators-guide/lifecycle","permalink":"/docs/ignite3/3.0.0/administrators-guide/lifecycle","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Cluster Lifecycle","sidebar_label":"Cluster Lifecycle"},"sidebar":"tutorialSidebar","previous":{"title":"Volatile Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile"},"next":{"title":"Data Colocation","permalink":"/docs/ignite3/3.0.0/administrators-guide/colocation"}}');var i=n(74848),s=n(28453);const r={title:"Cluster Lifecycle",sidebar_label:"Cluster Lifecycle"},a="Cluster Lifecycle",l={},d=[{value:"Node Start Without a Running Cluster",id:"node-start-without-a-running-cluster",level:2},{value:"Node Requirements",id:"node-requirements",level:3},{value:"Cluster Initialization",id:"cluster-initialization",level:2},{value:"Cluster Management Group",id:"cluster-management-group",level:3},{value:"Cluster Metastorage Group",id:"cluster-metastorage-group",level:3},{value:"Node Join Scenarios",id:"node-join-scenarios",level:2},{value:"New Nodes Joining the Cluster",id:"new-nodes-joining-the-cluster",level:3},{value:"Node Rejoins the Cluster",id:"node-rejoins-the-cluster",level:3}];function c(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"cluster-lifecycle",children:"Cluster Lifecycle"})}),"\n",(0,i.jsx)(t.p,{children:"This topic covers the information covering Ignite 3 cluster initialization and lifecycle."}),"\n",(0,i.jsx)(t.h2,{id:"node-start-without-a-running-cluster",children:"Node Start Without a Running Cluster"}),"\n",(0,i.jsxs)(t.p,{children:["When nodes start, they check all addresses listed in the node finder configuration (",(0,i.jsx)(t.code,{children:"network.nodeFinder"}),")."]}),"\n",(0,i.jsxs)(t.p,{children:["All nodes found are added to the ",(0,i.jsx)(t.strong,{children:"physical topology"})," - the nodes that know each other. All nodes also share information about other nodes, so the topology will include all nodes whose address is listed in at least one other node. If there are nodes that are completely separated (for example, nodes A and B only know about each other, same with C and D), they will form separate physical topologies (in this example, you would have cluster with A and B, and another cluster with C and D)."]}),"\n",(0,i.jsxs)(t.p,{children:["If there is no running cluster, the nodes exchange information about the network, but do not start any processes until the cluster initialization command is received, nor do they form a ",(0,i.jsx)(t.strong,{children:"logical topology"})," - the nodes that are verified and form a cluster."]}),"\n",(0,i.jsx)(t.h3,{id:"node-requirements",children:"Node Requirements"}),"\n",(0,i.jsxs)(t.p,{children:["All nodes in cluster must have similar time, that can be different by no more than ",(0,i.jsx)(t.code,{children:"schemaSync.maxClockSkewMillis"}),". This is necessary for correct transaction operation."]}),"\n",(0,i.jsxs)(t.p,{children:["As network latency can be unpredictable, some requests may take so long to arrive that the time will be different on the receiving node by the time request arrives. To account for the delay, set the ",(0,i.jsx)(t.code,{children:"schemaSync.delayDurationMillis"})," property to the time that is long enough for the schema updates to be delivered to all nodes in the cluster. However, this delay also affects how long it takes for DDL to be executed, as all nodes need to wait for the delay to pass before applying the update."]}),"\n",(0,i.jsx)(t.h2,{id:"cluster-initialization",children:"Cluster Initialization"}),"\n",(0,i.jsxs)(t.p,{children:["When the ",(0,i.jsx)(t.code,{children:"cluster init"})," command is received by any node in the cluster, it starts the initialization process."]}),"\n",(0,i.jsxs)(t.p,{children:["First, the nodes specified in the ",(0,i.jsx)(t.code,{children:"--cluster-management-group"})," argument form a RAFT group and take on the role of the ",(0,i.jsx)(t.strong,{children:"cluster management group"})," (CMG). A group responsible for managing cluster operations."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Cluster initialization",src:n(65413).A+"",width:"1405",height:"731"})}),"\n",(0,i.jsxs)(t.p,{children:["Next, the nodes specified in the ",(0,i.jsx)(t.code,{children:"--metastorage-group"})," argument form a RAFT group and assume the role of the ",(0,i.jsx)(t.strong,{children:"metastorage group"}),". These nodes store the authoritative copy of the cluster's metadata."]}),"\n",(0,i.jsxs)(t.p,{children:["If only one of ",(0,i.jsx)(t.code,{children:"--cluster-management-group"})," or ",(0,i.jsx)(t.code,{children:"--metastorage-group"})," is specified, the specified value is used for both. If neither is specified, a set of nodes is automatically selected for both CMG and the metastorage group in alphabetical order. The number of selected nodes is determined as follows:"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"If the cluster size is 3 or fewer, all nodes are used for the metastorage group (CMG and metastorage)."}),"\n",(0,i.jsx)(t.li,{children:"If the cluster size is 4, three nodes are used to maintain an odd number, improving consensus efficiency."}),"\n",(0,i.jsx)(t.li,{children:"If the cluster size is 5 or more, five nodes are used to balance fault tolerance and overhead."}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["Once the 2 raft groups are started and elect their leaders, all other nodes in the topology are notified that the cluster is started, and they can join it. At this point, the cluster is considered ",(0,i.jsx)(t.strong,{children:"initialized"})," and can start receiving requests."]}),"\n",(0,i.jsx)(t.p,{children:"Each non-leader node receives the invitation from the CMG to join the cluster and forms a validation request. Then, the request is sent to the CMG, and, after validation, the node receives cluster meta information from the metastorage group and joins the cluster."}),"\n",(0,i.jsxs)(t.p,{children:["The nodes are also added to the cluster ",(0,i.jsx)(t.strong,{children:"logical topology"})," - the nodes that are verified and accepted by CMG as part of the cluster. When nodes shut down or leave the physical topology for any other reason, the cluster logical topology is immediately adjusted."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"Cluster initialized",src:n(62990).A+"",width:"942",height:"1109"})}),"\n",(0,i.jsx)(t.h3,{id:"cluster-management-group",children:"Cluster Management Group"}),"\n",(0,i.jsx)(t.p,{children:"Cluster management group stores information about the cluster, the list of nodes that are in the cluster, and handles all cluster logical topology changes. Due to using RAFT consensus algorithm, the CMG improves the protection from split-brain (as any cluster group losing the CMG majority will no longer be fully functional)."}),"\n",(0,i.jsx)(t.p,{children:"It is recommended to have the CMG of 3, 5 or 7 nodes. Larger management group improves stability, as it reduces the odds of losing the majority of CMG nodes, but may cause a minor performance hit."}),"\n",(0,i.jsx)(t.p,{children:"Losing the majority of CMG nodes leaves the cluster mostly functional. The cluster without the CMG majority can still handle transactions and user requests, but cannot:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Add new nodes to logical topology."}),"\n",(0,i.jsx)(t.li,{children:"Re-add nodes that left the cluster to logical topology."}),"\n",(0,i.jsxs)(t.li,{children:["Create new table indexes. In this scenario, ",(0,i.jsx)(t.code,{children:"CREATE INDEX"})," DDL operation will never be fully resolved and will hang the application."]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"To restore full cluster functionality, bring the offline members of CMG back online."}),"\n",(0,i.jsx)(t.p,{children:"The CMG stores the following information:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Current cluster state, including what nodes are in CMG and metastorage groups, what Ignite version is used and cluster tag."}),"\n",(0,i.jsx)(t.li,{children:"Consistent IDs of all nodes in the logical topology."}),"\n",(0,i.jsx)(t.li,{children:"Node validation status."}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["By default, the information is stored in the ",(0,i.jsx)(t.code,{children:"work"})," folder, but it can be configured on each CMG node by setting the ",(0,i.jsx)(t.code,{children:"ignite.system.cmgPath"})," property."]}),"\n",(0,i.jsx)(t.h3,{id:"cluster-metastorage-group",children:"Cluster Metastorage Group"}),"\n",(0,i.jsx)(t.p,{children:"Cluster metastorage group stores information about the data stored in the cluster, and handles data distribution."}),"\n",(0,i.jsx)(t.p,{children:"It is recommended to have the metastorage of 3, 5 or 7 nodes. Larger metastorage group improves stability, as it reduces the odds of losing the majority of metastorage nodes, but may cause a minor performance hit."}),"\n",(0,i.jsx)(t.p,{children:"Losing the majority of metastorage nodes will turn the cluster inoperable and may lead to data loss."}),"\n",(0,i.jsx)(t.p,{children:"The metastorage contains the following information:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Cluster catalog - the single storage of all meta information about the cluster - table schemas, indexes, views, distribution zone information, etc."}),"\n",(0,i.jsx)(t.li,{children:"Logical topology history."}),"\n",(0,i.jsx)(t.li,{children:"Other data required for cluster operation."}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["By default, the information is stored in the ",(0,i.jsx)(t.code,{children:"work"})," folder, but it can be configured on each node by setting the ",(0,i.jsx)(t.code,{children:"ignite.system.metastoragePath"})," property."]}),"\n",(0,i.jsx)(t.h2,{id:"node-join-scenarios",children:"Node Join Scenarios"}),"\n",(0,i.jsx)(t.h3,{id:"new-nodes-joining-the-cluster",children:"New Nodes Joining the Cluster"}),"\n",(0,i.jsx)(t.p,{children:"When a new node is started, it adds itself to the physical topology. Then, the CMG receives the event that a new node has joined the topology, and sends it an invitation to join the cluster. Once the node receives it, it sends the validation request with node information, which the CMG verifies and adds the node to the logical topology."}),"\n",(0,i.jsx)(t.h3,{id:"node-rejoins-the-cluster",children:"Node Rejoins the Cluster"}),"\n",(0,i.jsx)(t.p,{children:"If the node leaves the physical topology (for example, because the machine with the node is unreachable), the cluster logical topology is immediately adjusted, and the node is excluded from it. It can no longer rejoin the cluster with the same node ID."}),"\n",(0,i.jsx)(t.p,{children:"To rejoin the cluster, the node must be restarted. During the restart, a new ID will be generated and the node will be able to join the physical and logical topology."}),"\n",(0,i.jsx)(t.p,{children:"When a node reappears in the physical topology, the CMG sends it an invitation to join. The node then asks the CMG to validate itself, and, if this is successful, it starts its components (doing local recovery on the way), after which it tells the CMG that it's ready to join. The CMG then adds it to the logical topology. This is the same process as the first join of a blank node."})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/ad0d46b8.a515ac11.js b/docs/ignite3/assets/js/ad0d46b8.a515ac11.js deleted file mode 100644 index b11876be16..0000000000 --- a/docs/ignite3/assets/js/ad0d46b8.a515ac11.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9768],{22338:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>t,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"configure-and-operate/reference/index","title":"Configuration Reference","description":"Complete configuration reference for Apache Ignite 3.","source":"@site/docs/configure-and-operate/reference/index.mdx","sourceDirName":"configure-and-operate/reference","slug":"/configure-and-operate/reference/","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Configuration Reference"},"sidebar":"tutorialSidebar","previous":{"title":"System Views","permalink":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views"},"next":{"title":"Node Configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration"}}');var o=r(74848),c=r(28453);const s={title:"Configuration Reference"},t="Configuration Reference",a={},d=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,c.R)(),...e.components},{IIcon:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"configuration-reference",children:"Configuration Reference"})}),"\n",(0,o.jsx)(n.p,{children:"Complete configuration reference for Apache Ignite 3."}),"\n",(0,o.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,o.jsxs)("div",{className:"card-container",children:[(0,o.jsxs)("div",{className:"card",children:[(0,o.jsx)("div",{className:"card__header",children:(0,o.jsxs)("h3",{children:[(0,o.jsx)(r,{icon:"mdi:server-outline",height:"24"})," Node Configuration"]})}),(0,o.jsx)("div",{className:"card__body",children:(0,o.jsx)("p",{children:"Complete reference for node configuration parameters."})}),(0,o.jsx)("div",{className:"card__footer",children:(0,o.jsx)("a",{href:"./reference/node-configuration",children:"Learn more \u2192"})})]}),(0,o.jsxs)("div",{className:"card",children:[(0,o.jsx)("div",{className:"card__header",children:(0,o.jsxs)("h3",{children:[(0,o.jsx)(r,{icon:"mdi:server-network",height:"24"})," Cluster Configuration"]})}),(0,o.jsx)("div",{className:"card__body",children:(0,o.jsx)("p",{children:"Complete reference for cluster-wide configuration parameters."})}),(0,o.jsx)("div",{className:"card__footer",children:(0,o.jsx)("a",{href:"./reference/cluster-configuration",children:"Learn more \u2192"})})]}),(0,o.jsxs)("div",{className:"card",children:[(0,o.jsx)("div",{className:"card__header",children:(0,o.jsxs)("h3",{children:[(0,o.jsx)(r,{icon:"mdi:console",height:"24"})," CLI Configuration"]})}),(0,o.jsx)("div",{className:"card__body",children:(0,o.jsx)("p",{children:"Command-line interface configuration and usage."})}),(0,o.jsx)("div",{className:"card__footer",children:(0,o.jsx)("a",{href:"./reference/cli-configuration",children:"Learn more \u2192"})})]}),(0,o.jsxs)("div",{className:"card",children:[(0,o.jsx)("div",{className:"card__header",children:(0,o.jsxs)("h3",{children:[(0,o.jsx)(r,{icon:"mdi:database-cog-outline",height:"24"})," Storage Profiles"]})}),(0,o.jsx)("div",{className:"card__body",children:(0,o.jsx)("p",{children:"Storage profile configuration reference."})}),(0,o.jsx)("div",{className:"card__footer",children:(0,o.jsx)("a",{href:"./reference/storage-profiles",children:"Learn more \u2192"})})]})]}),"\n",(0,o.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"configuration",children:"Configuration"})," - Configuration guides"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"operations",children:"Operations"})," - Operational procedures"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"monitoring",children:"Monitoring"})," - Monitor your cluster"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>t});var i=r(96540);const o={},c=i.createContext(o);function s(e){const n=i.useContext(c);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/b01f8e23.6cc26a00.js b/docs/ignite3/assets/js/b01f8e23.6cc26a00.js deleted file mode 100644 index 6281592160..0000000000 --- a/docs/ignite3/assets/js/b01f8e23.6cc26a00.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7360],{28453:(e,i,n)=>{n.d(i,{R:()=>t,x:()=>c});var s=n(96540);const r={},a=s.createContext(r);function t(e){const i=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(a.Provider,{value:i},e.children)}},47186:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"api-reference/native-clients/dotnet/dotnet-index","title":".NET API","description":"Native .NET client for C# and F# applications with async-first design and LINQ integration.","source":"@site/docs/api-reference/native-clients/dotnet/index.mdx","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":".NET API","id":"dotnet-index","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Security API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api"},"next":{"title":"Client API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api"}}');var r=n(74848),a=n(28453);const t={title:".NET API",id:"dotnet-index",sidebar_position:2},c=".NET API",d={},o=[{value:"Overview",id:"overview",level:2},{value:"API Categories",id:"api-categories",level:2},{value:"Reference",id:"reference",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const i={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components},{IIcon:n}=i;return n||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"net-api",children:".NET API"})}),"\n",(0,r.jsx)(i.p,{children:"Native .NET client for C# and F# applications with async-first design and LINQ integration."}),"\n",(0,r.jsx)(i.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(i.p,{children:"The .NET API provides thin client access to Apache Ignite 3 clusters. All operations use async patterns with Task and ValueTask for non-blocking execution."}),"\n",(0,r.jsx)(i.p,{children:"The API supports both strongly typed operations with POCOs and dynamic access with IIgniteTuple. LINQ queries convert to server-side execution where possible."}),"\n",(0,r.jsx)(i.h2,{id:"api-categories",children:"API Categories"}),"\n",(0,r.jsxs)("div",{className:"card-container",children:[(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:connection",height:"24"})," Client API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"IIgniteClient configuration, connection management, and resource lifecycle with async patterns."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./dotnet/client-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:table",height:"24"})," Tables API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Record and key-value views with typed and tuple access patterns for table operations."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./dotnet/tables-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:code-array",height:"24"})," LINQ API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Language-integrated queries with strongly-typed expressions and server-side execution."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./dotnet/linq-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:upload-network-outline",height:"24"})," Data Streamer API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Bulk loading with custom server-side receivers and error handling for high-throughput scenarios."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./dotnet/data-streamer-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:console-line",height:"24"})," SQL API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Query execution with parameterized statements and lazy materialization for efficient data processing."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./dotnet/sql-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:database-sync",height:"24"})," ADO.NET API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Standard ADO.NET database connectivity with DbConnection, DbCommand, and DataReader interfaces."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./dotnet/ado-net-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:shield-check-outline",height:"24"})," Transactions API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"ACID transactions with explicit control and automatic closure-based patterns."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./dotnet/transactions-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"mdi:server-network",height:"24"})," Compute API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Distributed job execution with serialization, colocated processing, and job monitoring."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./dotnet/compute-api",children:"Learn more \u2192"})})]}),(0,r.jsxs)("div",{className:"card",children:[(0,r.jsx)("div",{className:"card__header",children:(0,r.jsxs)("h3",{children:[(0,r.jsx)(n,{icon:"carbon:network-3",height:"24"})," Network API"]})}),(0,r.jsx)("div",{className:"card__body",children:(0,r.jsx)("p",{children:"Cluster topology, node discovery, and connection inspection for distributed coordination."})}),(0,r.jsx)("div",{className:"card__footer",children:(0,r.jsx)("a",{href:"./dotnet/network-api",children:"Learn more \u2192"})})]})]}),"\n",(0,r.jsx)(i.h2,{id:"reference",children:"Reference"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/dotnetdoc/",children:".NET API Documentation"})}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.a,{href:"../../develop/ignite-clients/dotnet-client",children:".NET Client Guide"})," - Client setup and usage"]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/b1ab1304.071208fe.js b/docs/ignite3/assets/js/b1ab1304.071208fe.js deleted file mode 100644 index 779d1c2e3f..0000000000 --- a/docs/ignite3/assets/js/b1ab1304.071208fe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1965],{14402:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"develop/connect-to-ignite/python","title":"Python Database API Driver","description":"Apache Ignite 3 clients connect to the cluster via a standard socket connection. Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations.","source":"@site/docs/develop/connect-to-ignite/python.md","sourceDirName":"develop/connect-to-ignite","slug":"/develop/connect-to-ignite/python","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/python","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"id":"python","title":"Python Database API Driver","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Querying and Modifying Data with ODBC","permalink":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data"},"next":{"title":"Work with Data","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/"}}');var i=t(74848),o=t(28453);const s={id:"python",title:"Python Database API Driver",sidebar_position:5},c=void 0,a={},l=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Limitations",id:"limitations",level:3},{value:"Installation",id:"installation",level:3},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Configuring SSL for Connection",id:"configuring-ssl-for-connection",level:3},{value:"Configuring Authorization",id:"configuring-authorization",level:3},{value:"Configuring Data Access",id:"configuring-data-access",level:3},{value:"Getting Cursor Object",id:"getting-cursor-object",level:2},{value:"Executing Single Query",id:"executing-single-query",level:2},{value:"Executing a Batched Query",id:"executing-a-batched-query",level:2},{value:"Getting Query Results",id:"getting-query-results",level:2},{value:"Working with Transactions",id:"working-with-transactions",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Apache Ignite 3 clients connect to the cluster via a standard socket connection. Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations."}),"\n",(0,i.jsxs)(n.p,{children:["Apache Ignite DB API driver uses the ",(0,i.jsx)(n.a,{href:"https://peps.python.org/pep-0249/",children:"Python Database API"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,i.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsx)(n.p,{children:"To run the Python driver, the following is required:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"CMake 3.18 or newer to build the driver"}),"\n",(0,i.jsx)(n.li,{children:"Python 3.9 or newer (3.9, 3.10, 3.11 and 3.12 are tested)"}),"\n",(0,i.jsx)(n.li,{children:"Access to a running Ignite 3 node"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,i.jsx)(n.p,{children:"Script execution of SQL statements is not supported in current release."}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"To install Python DB API driver, download it from pip."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"pip install pyignite3_dbapi\n"})}),"\n",(0,i.jsxs)(n.p,{children:["After this, you can import ",(0,i.jsx)(n.code,{children:"pyignite3_dbapi"})," into your project and use it."]}),"\n",(0,i.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,i.jsxs)(n.p,{children:["To connect to the cluster, use the ",(0,i.jsx)(n.code,{children:"connect()"})," method:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"addr = ['127.0.0.1:10800']\r\nreturn pyignite_dbapi.connect(address=addr, timeout=10)\n"})}),"\n",(0,i.jsx)(n.p,{children:"After you are done working with the cluster, remember to always close the connection to it."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"conn.close()\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, you can use the ",(0,i.jsx)(n.code,{children:"with"})," statement to automatically close the connection when no longer necessary:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"with pyignite_dbapi.connect(address=addr, timeout=10) as conn:\r\n conn.cursor()\n"})}),"\n",(0,i.jsx)(n.h3,{id:"configuring-ssl-for-connection",children:"Configuring SSL for Connection"}),"\n",(0,i.jsx)(n.p,{children:"To ensure secure connection to the cluster, you can enable SSL for it by providing the key file and certificate, for example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"def create_ssl_connection():\r\n \"\"\"Create SSL-enabled connection to GridGain cluster.\"\"\"\r\n addr = ['127.0.0.1:10800']\r\n return pyignite_dbapi.connect(\r\n address=addr,\r\n timeout=10,\r\n use_ssl=True,\r\n ssl_keyfile='',\r\n ssl_certfile='',\r\n # Optional: ssl_ca_certfile=''\r\n )\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"All paths to certificate file and keys should be provided in string format appropriate for the system."})}),"\n",(0,i.jsx)(n.h3,{id:"configuring-authorization",children:"Configuring Authorization"}),"\n",(0,i.jsxs)(n.p,{children:["If the cluster uses ",(0,i.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-authentication",children:"basic authorization"}),", you need to provide user ",(0,i.jsx)(n.code,{children:"identity"})," and ",(0,i.jsx)(n.code,{children:"secret"})," to authorize on it, for example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"def create_authenticated_connection():\r\n \"\"\"Create authenticated connection to GridGain cluster.\"\"\"\r\n addr = ['127.0.0.1:10800']\r\n return pyignite_dbapi.connect(\r\n address=addr,\r\n timeout=10,\r\n identity='user',\r\n secret='password'\r\n )\n"})}),"\n",(0,i.jsx)(n.h3,{id:"configuring-data-access",children:"Configuring Data Access"}),"\n",(0,i.jsx)(n.p,{children:"You can configure optional properties to fine-tune how data is accessed."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Configuration name"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"schema"}),(0,i.jsx)(n.td,{children:"A schema name to be used by default. Default value: 'PUBLIC'."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"page_size"}),(0,i.jsx)(n.td,{children:"Maximum number of rows that can be received or sent in a single request. Default value: 1024"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"The example below shows how to set these properties:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'def create_configured_connection():\r\n """Create authenticated connection to GridGain cluster."""\r\n addr = [\'127.0.0.1:10800\']\r\n return conn = pyignite_dbapi.connect(\r\n address=addr,\r\n timeout=10,\r\n schema=\'CUSTOM\',\r\n page_size=2048\r\n )\n'})}),"\n",(0,i.jsx)(n.h2,{id:"getting-cursor-object",children:"Getting Cursor Object"}),"\n",(0,i.jsxs)(n.p,{children:["To work with tables from Python client, you use the ",(0,i.jsx)(n.code,{children:"cursor"})," object that can be retrieved from the connection object:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"conn.cursor()\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Similar to the connection, you can use the ",(0,i.jsx)(n.code,{children:"with"})," statement when getting the cursor:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"with conn.cursor() as cursor:\n"})}),"\n",(0,i.jsx)(n.h2,{id:"executing-single-query",children:"Executing Single Query"}),"\n",(0,i.jsxs)(n.p,{children:["The cursor object can be used to execute SQL statements with the ",(0,i.jsx)(n.code,{children:"execute"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"# Create table\r\ncursor.execute('''\r\n CREATE TABLE Person(\r\n id INT PRIMARY KEY,\r\n name VARCHAR,\r\n age INT\r\n )\r\n ''')\n"})}),"\n",(0,i.jsx)(n.h2,{id:"executing-a-batched-query",children:"Executing a Batched Query"}),"\n",(0,i.jsxs)(n.p,{children:["You can use the ",(0,i.jsx)(n.code,{children:"executemany"})," command to execute SQL queries with a batch of parameters. This kind of operation offers much higher performance than executing individual queries. The example below inserts two rows into the Person table:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Sample data\r\nsample_data = [\r\n [1, "John", 30],\r\n [2, "Jane", 32],\r\n [3, "Bob", 28]\r\n]\r\n\r\n# Insert data (fixed table name)\r\ncursor.executemany(\'INSERT INTO Person VALUES(?, ?, ?)\', sample_data)\n'})}),"\n",(0,i.jsx)(n.h2,{id:"getting-query-results",children:"Getting Query Results"}),"\n",(0,i.jsxs)(n.p,{children:["The cursor retains a reference to the operation. If the operation returns results (for example, a ",(0,i.jsx)(n.code,{children:"SELECT"}),"), they will also be stored in the cursor. You can then use the ",(0,i.jsx)(n.code,{children:"fetchone()"})," method to retrieve query results from the cursor:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Query data\r\ncursor.execute(\'SELECT * FROM Person ORDER BY id\')\r\nresults = cursor.fetchall()\r\n\r\nprint("All persons in database:")\r\nfor row in results:\r\n print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}")\n'})}),"\n",(0,i.jsx)(n.h2,{id:"working-with-transactions",children:"Working with Transactions"}),"\n",(0,i.jsx)(n.p,{children:"By default, transactions required for database operations are handled implicitly. However, you can disable automatic transaction handling and manually handle commits."}),"\n",(0,i.jsx)(n.p,{children:"To do this, first, disable autocommit:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"conn.autocommit = False\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once autocommit is disabled, you need to commit your operations manually:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Insert valid records\r\ncursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [4, "Alice", 29])\r\ncursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [5, "Charlie", 31])\r\n\r\ncursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [6, "Invalid", new_age])\r\n\r\nconn.commit()\r\nprint("Transaction committed successfully")\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Operations that are not committed are sent to the cluster, but not yet written to the table. The table is only updated when the ",(0,i.jsx)(n.code,{children:"commit"})," method is called. You can roll back all uncommitted operations with the ",(0,i.jsx)(n.code,{children:"rollback"})," command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'with conn.cursor() as cursor:\r\n try:\r\n # Insert valid records\r\n cursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [4, "Alice", 29])\r\n cursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [5, "Charlie", 31])\r\n\r\n cursor.execute(\'INSERT INTO Person VALUES(?, ?, ?)\', [6, "Invalid", new_age])\r\n\r\n conn.commit()\r\n print("Transaction committed successfully")\r\n\r\n except Exception as e:\r\n # Rollback on any error\r\n conn.rollback()\r\n print(f"Transaction rolled back due to error: {e}")\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"rollback"})," command rolls back all uncommitted data."]})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/b1ef1c36.6202244d.js b/docs/ignite3/assets/js/b1ef1c36.6202244d.js deleted file mode 100644 index 903e9c882e..0000000000 --- a/docs/ignite3/assets/js/b1ef1c36.6202244d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5190],{28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>o});var i=t(96540);const r={},a=i.createContext(r);function s(e){const n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(a.Provider,{value:n},e.children)}},34559:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"quick-start/embedded-mode","title":"Starting With Embedded Mode","description":"{/*","source":"@site/versioned_docs/version-3.0.0/quick-start/embedded-mode.md","sourceDirName":"quick-start","slug":"/quick-start/embedded-mode","permalink":"/docs/ignite3/3.0.0/quick-start/embedded-mode","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Starting With Embedded Mode","sidebar_label":"Embedded Mode"},"sidebar":"tutorialSidebar","previous":{"title":"Java API","permalink":"/docs/ignite3/3.0.0/quick-start/java-api"},"next":{"title":"Ignite CLI Tool","permalink":"/docs/ignite3/3.0.0/ignite-cli-tool"}}');var r=t(74848),a=t(28453);const s={title:"Starting With Embedded Mode",sidebar_label:"Embedded Mode"},o=void 0,d={},l=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Add Ignite to Your Project",id:"add-ignite-to-your-project",level:2},{value:"Prepare Ignite Configuration",id:"prepare-ignite-configuration",level:2},{value:"Pass JVM Parameters",id:"pass-jvm-parameters",level:2},{value:"Start Ignite Server Nodes",id:"start-ignite-server-nodes",level:2},{value:"Initiate a Cluster",id:"initiate-a-cluster",level:2},{value:"Get an Ignite Instance",id:"get-an-ignite-instance",level:2},{value:"Next Steps",id:"next-steps",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.p,{children:'In most scenarios, you would use Ignite CLI tool to start and manage your Ignite cluster. However, in some scenarios it is preferable to manage the cluster from a Java project. Starting and working with the cluster from code is called "embedded mode".'}),"\n",(0,r.jsx)(n.p,{children:"This tutorial covers how you can start Ignite 3 from your Java project."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"Unlike in Ignite 2, nodes in Ignite 3 are not separated into client and server nodes. Nodes started from embedded mode will be used to store data by default."})}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"This section describes the platform requirements for machines running Ignite. Ignite system requirements scale depending on the size of the cluster."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Requirement"}),(0,r.jsx)(n.th,{children:"Details"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"JDK"}),(0,r.jsx)(n.td,{children:"11 and later"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"OS"}),(0,r.jsx)(n.td,{children:"Linux (Debian and Red Hat flavours), Windows 10 or 11"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ISA"}),(0,r.jsx)(n.td,{children:"x86 or x64"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"add-ignite-to-your-project",children:"Add Ignite to Your Project"}),"\n",(0,r.jsx)(n.p,{children:"First, you need to add Ignite to your project. The easiest way to do this is by using Maven:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:"\r\n \r\n \r\n org.apache.maven.plugins\r\n maven-compiler-plugin\r\n \r\n 11\r\n 11\r\n \r\n \r\n \r\n\r\n\r\n\r\n \r\n org.apache.ignite\r\n ignite-api\r\n 3.0.0\r\n \r\n\r\n \r\n org.apache.ignite\r\n ignite-runner\r\n 3.0.0\r\n \r\n\n"})}),"\n",(0,r.jsx)(n.h2,{id:"prepare-ignite-configuration",children:"Prepare Ignite Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["To start an Ignite node, you will need an Ignite configuration file that specifies all configuration properties of the node. For this tutorial, we recommend ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/installation/installing-using-zip",children:"installing"})," Ignite 3 and using a default configuration file from it. This file is stored in the ",(0,r.jsx)(n.code,{children:"ignite3-db-3.0.0/etc/ignite-config.conf"})," file."]}),"\n",(0,r.jsx)(n.h2,{id:"pass-jvm-parameters",children:"Pass JVM Parameters"}),"\n",(0,r.jsx)(n.p,{children:"The following JVM parameters need to be passed to your application to make proprietary SDK APIs available:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"--add-opens java.base/java.lang=ALL-UNNAMED\r\n--add-opens java.base/java.lang.invoke=ALL-UNNAMED\r\n--add-opens java.base/java.lang.reflect=ALL-UNNAMED\r\n--add-opens java.base/java.io=ALL-UNNAMED\r\n--add-opens java.base/java.nio=ALL-UNNAMED\r\n--add-opens java.base/java.math=ALL-UNNAMED\r\n--add-opens java.base/java.util=ALL-UNNAMED\r\n--add-opens java.base/java.time=ALL-UNNAMED\r\n--add-opens java.base/jdk.internal.misc=ALL-UNNAMED\r\n--add-opens java.base/jdk.internal.access=ALL-UNNAMED\r\n--add-opens java.base/sun.nio.ch=ALL-UNNAMED\r\n-Dio.netty.tryReflectionSetAccessible=true\n"})}),"\n",(0,r.jsx)(n.h2,{id:"start-ignite-server-nodes",children:"Start Ignite Server Nodes"}),"\n",(0,r.jsx)(n.p,{children:"To start an Ignite node, use the following code snippet:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteServer node = IgniteServer.start("node", configFilePath, workDir);\n'})}),"\n",(0,r.jsxs)(n.p,{children:["This code snippet starts an Ignite node with the name ",(0,r.jsx)(n.code,{children:"node1"}),", that uses the configuration from the file specified in the ",(0,r.jsx)(n.code,{children:"configFilePath"})," path parameter and uses the folder specified in the ",(0,r.jsx)(n.code,{children:"workDir"})," path parameter to store data. When the node is started, this method returns an instance of ",(0,r.jsx)(n.code,{children:"IgniteServer"})," class that can be used to work with the node."]}),"\n",(0,r.jsx)(n.h2,{id:"initiate-a-cluster",children:"Initiate a Cluster"}),"\n",(0,r.jsx)(n.p,{children:"Started nodes find each other by default, but they do not form an operational cluster unless the cluster is initiated. You need to initiate the cluster to activate the node. If there are multiple nodes, once the cluster is activated, they will form a topology and automatically distribute workload between each other."}),"\n",(0,r.jsx)(n.p,{children:"Use the code snippet below to initiate a cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'InitParameters initParameters = InitParameters.builder()\r\n .metaStorageNodeNames("node")\r\n .clusterName("cluster")\r\n .clusterConfiguration({config-with-license})\r\n .build();\r\n\r\nnode.initCluster(initParameters);\n'})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["To start an Ignite 3 cluster, you need to provide a license together with the cluster configuration in the ",(0,r.jsx)(n.code,{children:"clusterConfiguration"})," parameter."]})}),"\n",(0,r.jsx)(n.h2,{id:"get-an-ignite-instance",children:"Get an Ignite Instance"}),"\n",(0,r.jsxs)(n.p,{children:["Now that the cluster is started, you can get an instance of the ",(0,r.jsx)(n.code,{children:"Ignite"})," class:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"Ignite ignite = node.api();\n"})}),"\n",(0,r.jsx)(n.p,{children:"This instance can be used to start working with the cluster. The future will be returned once the cluster is active."}),"\n",(0,r.jsx)(n.p,{children:"In the following example, you interact with the cluster using the SQL API:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'ignite.sql().execute(null, "CREATE TABLE IF NOT EXISTS Person (id int primary key, name varchar, age int);");\r\nignite.sql().execute(null, "insert into Person (id, name, age) values (\'1\', \'Person Man\', \'501\'");\r\ntry (ResultSet rs = ignite.sql().execute(null, "SELECT id, name, age from Person")) {\r\n while (rs.hasNext()) {\r\n SqlRow row = rs.next();\r\n System.out.println(" "\r\n + row.value(1) + ", "\r\n + row.value(2));\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Session is closable, but it is safe to skip ",(0,r.jsx)(n.code,{children:"close()"})," method for DDL and DML queries, as they do not keep cursor open."]})}),"\n",(0,r.jsxs)(n.p,{children:["More examples of working with Ignite can be found in the ",(0,r.jsx)(n.a,{href:"https://github.com/apache/ignite-3/tree/main/examples",children:"examples"})," repository."]}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsx)(n.p,{children:"From here, you may want to:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Check out the ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/table-api",children:"Developers guide"})," page for more information on available APIs"]}),"\n",(0,r.jsxs)(n.li,{children:["Try out our ",(0,r.jsx)(n.a,{href:"https://github.com/apache/ignite-3/tree/main/examples",children:"examples"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/b89de411.c5b1cec5.js b/docs/ignite3/assets/js/b89de411.c5b1cec5.js deleted file mode 100644 index 317f75284f..0000000000 --- a/docs/ignite3/assets/js/b89de411.c5b1cec5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6695],{28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(96540);const i={},s=r.createContext(i);function o(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:n},e.children)}},75172:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"understand/architecture/security","title":"Security Architecture","description":"Apache Ignite 3 provides authentication and transport encryption to secure cluster access. Security is disabled by default and must be explicitly enabled in cluster configuration.","source":"@site/docs/understand/architecture/security.md","sourceDirName":"understand/architecture","slug":"/understand/architecture/security","permalink":"/docs/ignite3/3.1.0/understand/architecture/security","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"id":"security","title":"Security Architecture","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"RocksDB Storage Engine","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb"},"next":{"title":"Performance","permalink":"/docs/ignite3/3.1.0/understand/performance/"}}');var i=t(74848),s=t(28453);const o={id:"security",title:"Security Architecture",sidebar_position:4},c="Security Architecture",a={},d=[{value:"Security Components",id:"security-components",level:2},{value:"Authentication",id:"authentication",level:2},{value:"Authentication Flow",id:"authentication-flow",level:3},{value:"Basic Authentication",id:"basic-authentication",level:3},{value:"Custom Authentication Providers",id:"custom-authentication-providers",level:3},{value:"Transport Encryption",id:"transport-encryption",level:2},{value:"SSL Configuration",id:"ssl-configuration",level:3},{value:"Node-to-Node SSL",id:"node-to-node-ssl",level:3},{value:"Client Connector SSL",id:"client-connector-ssl",level:3},{value:"REST API SSL",id:"rest-api-ssl",level:3},{value:"Security Events",id:"security-events",level:2},{value:"Configuration Summary",id:"configuration-summary",level:2},{value:"Limitations",id:"limitations",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"security-architecture",children:"Security Architecture"})}),"\n",(0,i.jsx)(n.p,{children:"Apache Ignite 3 provides authentication and transport encryption to secure cluster access. Security is disabled by default and must be explicitly enabled in cluster configuration."}),"\n",(0,i.jsx)(n.h2,{id:"security-components",children:"Security Components"}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Client"\r\n CA[Client Authenticator
                                                              BasicAuthenticator]\r\n CS[Client SSL Config]\r\n end\r\n\r\n subgraph "Transport Layer"\r\n TLS[TLS Encryption
                                                              Optional]\r\n end\r\n\r\n subgraph "Server Node"\r\n CH[Client Handler]\r\n AM[Authentication Manager]\r\n subgraph "Authentication Providers"\r\n BA[Basic Authenticator]\r\n CP[Custom Provider]\r\n end\r\n end\r\n\r\n CA --\x3e|"Credentials"| TLS\r\n CS --\x3e|"Encrypt"| TLS\r\n TLS --\x3e CH\r\n CH --\x3e AM\r\n AM --\x3e BA\r\n AM --\x3e CP'}),"\n",(0,i.jsx)(n.p,{children:"The security architecture consists of two independent layers:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Authentication"}),": Validates client identity through configured providers"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Transport encryption"}),": SSL/TLS secures communication channels"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"These layers operate independently. You can enable authentication without SSL, though credentials would transmit in plain text. Production deployments should enable both."}),"\n",(0,i.jsx)(n.h2,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(n.p,{children:"Authentication validates client identity before allowing cluster access. The authentication manager coordinates multiple providers, attempting each in sequence until one succeeds."}),"\n",(0,i.jsx)(n.h3,{id:"authentication-flow",children:"Authentication Flow"}),"\n",(0,i.jsx)(n.mermaid,{value:"sequenceDiagram\r\n participant C as Client\r\n participant H as Client Handler\r\n participant AM as Auth Manager\r\n participant P as Auth Provider\r\n\r\n C->>H: Connection + Credentials\r\n H->>AM: Authenticate(type, identity, secret)\r\n loop Each Provider\r\n AM->>P: Validate Credentials\r\n alt Success\r\n P--\x3e>AM: UserDetails\r\n AM--\x3e>H: Authenticated\r\n H--\x3e>C: Connection Accepted\r\n else Failure\r\n P--\x3e>AM: InvalidCredentialsException\r\n end\r\n end\r\n AM--\x3e>H: Authentication Failed\r\n H--\x3e>C: Connection Rejected"}),"\n",(0,i.jsx)(n.h3,{id:"basic-authentication",children:"Basic Authentication"}),"\n",(0,i.jsx)(n.p,{children:"Apache Ignite 3 includes a basic username/password authenticator. Configure users in the cluster security settings:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite": {\r\n "security": {\r\n "enabled": true,\r\n "authentication": {\r\n "providers": [\r\n {\r\n "type": "basic",\r\n "name": "default",\r\n "users": [\r\n { "username": "admin", "password": "admin123" },\r\n { "username": "reader", "password": "reader123" }\r\n ]\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Client connection with basic authentication:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .authenticator(BasicAuthenticator.builder()\r\n .username("admin")\r\n .password("admin123")\r\n .build())\r\n .build();\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsx)(n.p,{children:"Basic authentication transmits credentials in plain text unless SSL/TLS is enabled. Always enable SSL for production deployments."})}),"\n",(0,i.jsx)(n.h3,{id:"custom-authentication-providers",children:"Custom Authentication Providers"}),"\n",(0,i.jsxs)(n.p,{children:["The authentication framework supports custom providers through the ",(0,i.jsx)(n.code,{children:"Authenticator"})," interface. Custom providers require:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Server-side ",(0,i.jsx)(n.code,{children:"Authenticator"})," implementation"]}),"\n",(0,i.jsxs)(n.li,{children:["Configuration schema extending ",(0,i.jsx)(n.code,{children:"AuthenticationProviderConfigurationSchema"})]}),"\n",(0,i.jsxs)(n.li,{children:["Client-side ",(0,i.jsx)(n.code,{children:"IgniteClientAuthenticator"})," implementation"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"This enables integration with external identity providers, LDAP directories, or custom credential stores."}),"\n",(0,i.jsx)(n.h2,{id:"transport-encryption",children:"Transport Encryption"}),"\n",(0,i.jsx)(n.p,{children:"SSL/TLS encrypts communication between clients and servers, and between cluster nodes. Three separate SSL configurations control different communication channels:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Configuration Path"}),(0,i.jsx)(n.th,{children:"Purpose"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"ignite.network.ssl"})}),(0,i.jsx)(n.td,{children:"Node-to-node cluster communication"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"ignite.clientConnector.ssl"})}),(0,i.jsx)(n.td,{children:"Client-to-node connections"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"ignite.rest.ssl"})}),(0,i.jsx)(n.td,{children:"REST API endpoints"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"ssl-configuration",children:"SSL Configuration"}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "SSL Components"\r\n KS[KeyStore
                                                              Server Identity]\r\n TS[TrustStore
                                                              Trusted Certificates]\r\n end\r\n\r\n subgraph "Configuration"\r\n E[enabled: true]\r\n CA[clientAuth: require]\r\n C[ciphers: list]\r\n end\r\n\r\n KS --\x3e E\r\n TS --\x3e E\r\n CA --\x3e E\r\n C --\x3e E'}),"\n",(0,i.jsx)(n.p,{children:"SSL configuration properties:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Property"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"enabled"})}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"Enable SSL for this channel"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"clientAuth"})}),(0,i.jsx)(n.td,{children:"none"}),(0,i.jsx)(n.td,{children:"Client certificate requirement: none, optional, require"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"ciphers"})}),(0,i.jsx)(n.td,{children:"(empty)"}),(0,i.jsx)(n.td,{children:"Comma-separated cipher list, empty uses JVM defaults"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"keyStore.type"})}),(0,i.jsx)(n.td,{children:"PKCS12"}),(0,i.jsx)(n.td,{children:"Keystore format"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"keyStore.path"})}),(0,i.jsx)(n.td,{children:"(empty)"}),(0,i.jsx)(n.td,{children:"Path to keystore file"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"keyStore.password"})}),(0,i.jsx)(n.td,{children:"(empty)"}),(0,i.jsx)(n.td,{children:"Keystore password"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"trustStore.type"})}),(0,i.jsx)(n.td,{children:"PKCS12"}),(0,i.jsx)(n.td,{children:"Truststore format"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"trustStore.path"})}),(0,i.jsx)(n.td,{children:"(empty)"}),(0,i.jsx)(n.td,{children:"Path to truststore file"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"trustStore.password"})}),(0,i.jsx)(n.td,{children:"(empty)"}),(0,i.jsx)(n.td,{children:"Truststore password"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"node-to-node-ssl",children:"Node-to-Node SSL"}),"\n",(0,i.jsx)(n.p,{children:"Enable SSL for cluster communication:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node config update ignite.network.ssl.enabled=true\r\nnode config update ignite.network.ssl.keyStore.path=/path/to/keystore.p12\r\nnode config update ignite.network.ssl.keyStore.password=keystorepass\r\nnode config update ignite.network.ssl.trustStore.path=/path/to/truststore.p12\r\nnode config update ignite.network.ssl.trustStore.password=truststorepass\n"})}),"\n",(0,i.jsx)(n.p,{children:"For mutual TLS (mTLS), set client authentication to required:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node config update ignite.network.ssl.clientAuth=require\n"})}),"\n",(0,i.jsx)(n.h3,{id:"client-connector-ssl",children:"Client Connector SSL"}),"\n",(0,i.jsx)(n.p,{children:"Enable SSL for client connections:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node config update ignite.clientConnector.ssl.enabled=true\r\nnode config update ignite.clientConnector.ssl.keyStore.path=/path/to/keystore.p12\r\nnode config update ignite.clientConnector.ssl.keyStore.password=keystorepass\n"})}),"\n",(0,i.jsx)(n.p,{children:"Client-side SSL configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'SslConfiguration sslConfig = SslConfiguration.builder()\r\n .enabled(true)\r\n .trustStorePath("/path/to/truststore.p12")\r\n .trustStorePassword("truststorepass")\r\n .build();\r\n\r\nIgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .ssl(sslConfig)\r\n .authenticator(BasicAuthenticator.builder()\r\n .username("admin")\r\n .password("admin123")\r\n .build())\r\n .build();\n'})}),"\n",(0,i.jsx)(n.h3,{id:"rest-api-ssl",children:"REST API SSL"}),"\n",(0,i.jsx)(n.p,{children:"Enable SSL for REST endpoints:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node config update ignite.rest.ssl.enabled=true\r\nnode config update ignite.rest.ssl.port=10400\r\nnode config update ignite.rest.ssl.keyStore.path=/path/to/keystore.p12\r\nnode config update ignite.rest.ssl.keyStore.password=keystorepass\n"})}),"\n",(0,i.jsx)(n.h2,{id:"security-events",children:"Security Events"}),"\n",(0,i.jsx)(n.p,{children:"Authentication attempts are logged through the event system. Monitor these events for security auditing:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"USER_AUTHENTICATION_SUCCESS"}),": Successful authentication"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"USER_AUTHENTICATION_FAILURE"}),": Failed authentication attempt"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"configuration-summary",children:"Configuration Summary"}),"\n",(0,i.jsx)(n.p,{children:"Minimum production security configuration:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite": {\r\n "security": {\r\n "enabled": true,\r\n "authentication": {\r\n "providers": [\r\n {\r\n "type": "basic",\r\n "name": "default",\r\n "users": [\r\n { "username": "admin", "password": "secure_password" }\r\n ]\r\n }\r\n ]\r\n }\r\n },\r\n "clientConnector": {\r\n "ssl": {\r\n "enabled": true,\r\n "keyStore": {\r\n "path": "/path/to/keystore.p12",\r\n "password": "keystorepass"\r\n }\r\n }\r\n },\r\n "network": {\r\n "ssl": {\r\n "enabled": true,\r\n "clientAuth": "require",\r\n "keyStore": {\r\n "path": "/path/to/keystore.p12",\r\n "password": "keystorepass"\r\n },\r\n "trustStore": {\r\n "path": "/path/to/truststore.p12",\r\n "password": "truststorepass"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"limitations",children:"Limitations"}),"\n",(0,i.jsx)(n.p,{children:"Apache Ignite 3 currently provides authentication only. Authorization features (role-based access control, permissions) are not yet implemented. All authenticated users have equivalent access to cluster resources."}),"\n",(0,i.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-authentication",children:"Configure Authentication"})," - Step-by-step authentication setup"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-ssl-tls",children:"Configure SSL/TLS"})," - SSL configuration guide"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-cluster-security",children:"Cluster Security"})," - Additional security recommendations"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/b9041da1.fa08d7d0.js b/docs/ignite3/assets/js/b9041da1.fa08d7d0.js deleted file mode 100644 index f39fbd2944..0000000000 --- a/docs/ignite3/assets/js/b9041da1.fa08d7d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6861],{28453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>l});var s=r(96540);const i={},t=s.createContext(i);function o(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(t.Provider,{value:n},e.children)}},99603:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"sql-reference/explain-statement","title":"EXPLAIN Command","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-reference/explain-statement.md","sourceDirName":"sql-reference","slug":"/sql-reference/explain-statement","permalink":"/docs/ignite3/3.0.0/sql-reference/explain-statement","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"EXPLAIN Command","sidebar_label":"EXPLAIN"},"sidebar":"tutorialSidebar","previous":{"title":"SQL Conformance","permalink":"/docs/ignite3/3.0.0/sql-reference/sql-conformance"},"next":{"title":"EXPLAIN","permalink":"/docs/ignite3/3.0.0/sql-reference/explain-statement"}}');var i=r(74848),t=r(28453);const o={title:"EXPLAIN Command",sidebar_label:"EXPLAIN"},l=void 0,a={},d=[{value:"Syntax",id:"syntax",level:2},{value:"Understanding The Output",id:"understanding-the-output",level:2},{value:"Operator Naming",id:"operator-naming",level:3},{value:"Hierarchical Plan Structure",id:"hierarchical-plan-structure",level:3},{value:"Examples",id:"examples",level:2},{value:"Example: Complex Join",id:"example-complex-join",level:3},{value:"Example: Query Mapping",id:"example-query-mapping",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"EXPLAIN"})," command is used to display the execution plan of an SQL query, showing how the query will be processed by the SQL engine.\r\nIt provides insights into the relational operators used, their configuration, and the estimated number of rows processed at each step.\r\nThis information is essential for diagnosing performance bottlenecks and understanding query optimization decisions."]}),"\n",(0,i.jsx)(n.h2,{id:"syntax",children:"Syntax"}),"\n","\n",(0,i.jsxs)(n.p,{children:["If neither ",(0,i.jsx)(n.code,{children:"PLAN"})," nor ",(0,i.jsx)(n.code,{children:"MAPPING"})," is specified, then ",(0,i.jsx)(n.code,{children:"PLAN"})," is implicit."]}),"\n",(0,i.jsx)(n.p,{children:"Parameters:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"PLAN"})," - explains query in terms of relational operators tree.\r\nThis representation is suitable for investigation of performance issues related to the optimizer."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"MAPPING"})," - explains query in terms of mapping of query fragment to a particular node of the cluster.\r\nThis representation is suitable for investigation of performance issues related to the data colocation."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Examples:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN SELECT * FROM lineitem;\r\nEXPLAIN PLAN FOR SELECT * FROM lineitem;\r\nEXPLAIN MAPPING FOR SELECT * FROM lineitem;\n"})}),"\n",(0,i.jsx)(n.h2,{id:"understanding-the-output",children:"Understanding The Output"}),"\n",(0,i.jsxs)(n.p,{children:["Each query plan is represented as a tree-like structure composed of ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/explain-operators-list",children:(0,i.jsx)(n.strong,{children:"relational operators"})}),"."]}),"\n",(0,i.jsx)(n.p,{children:"A node in the plan includes:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"name"}),", indicating the relational operator (e.g., ",(0,i.jsx)(n.code,{children:"TableScan"}),", ",(0,i.jsx)(n.code,{children:"IndexScan"}),", ",(0,i.jsx)(n.code,{children:"Sort"}),", ",(0,i.jsx)(n.code,{children:"Join"})," types)"]}),"\n",(0,i.jsxs)(n.li,{children:["A set of ",(0,i.jsx)(n.strong,{children:"attributes"}),", relevant to that specific operator"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"OperatorName\r\n attribute1: value1\r\n attribute2: value2\n"})}),"\n",(0,i.jsx)(n.p,{children:"Examples:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"TableScan // Full table access\r\n table: PUBLIC.EMP\r\n fieldNames: [NAME, SALARY]\r\n est: (rows=1)\r\n\r\nIndexScan // Index-based access\r\n table: PUBLIC.EMP\r\n index: EMP_NAME_DESC_IDX\r\n type: SORTED\r\n fields: [NAME]\r\n collation: [NAME DESC]\r\n est: (rows=1)\r\n\r\nSort // Sort rows\r\n collation: [NAME DESC NULLS LAST]\r\n est: (rows=1)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"operator-naming",children:"Operator Naming"}),"\n",(0,i.jsx)(n.p,{children:"The operator name reflects the specific algorithm or strategy used.\r\nFor example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"TableScan"})," \u2013 Full scan of a base table."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IndexScan"})," \u2013 Access via index, possibly sorted."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Sort"})," \u2013 Explicit sorting step."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"HashJoin"}),", ",(0,i.jsx)(n.code,{children:"MergeJoin"}),", ",(0,i.jsx)(n.code,{children:"NestedLoopJoin"})," \u2013 Types of join algorithms."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Limit"}),", ",(0,i.jsx)(n.code,{children:"Project"}),", ",(0,i.jsx)(n.code,{children:"Exchange"})," \u2013 Execution-related transformations and controls."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"hierarchical-plan-structure",children:"Hierarchical Plan Structure"}),"\n",(0,i.jsxs)(n.p,{children:["The plan is structured as a ",(0,i.jsx)(n.strong,{children:"tree"}),", where:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Leaf nodes"})," represent data sources (e.g., ",(0,i.jsx)(n.code,{children:"TableScan"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Internal nodes"})," represent data transformations (e.g., ",(0,i.jsx)(n.code,{children:"Join"}),", ",(0,i.jsx)(n.code,{children:"Sort"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"The root node"})," (topmost) is the final operator that produces the result"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"examples",children:"Examples"}),"\n",(0,i.jsx)(n.h3,{id:"example-complex-join",children:"Example: Complex Join"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN PLAN FOR\r\n SELECT\r\n U.UserName, P.ProductName, R.ReviewText, R.Rating\r\n FROM Users U, Reviews R, Products P\r\n WHERE U.UserID = R.UserID\r\n AND R.ProductID = P.ProductID\r\n AND P.ProductName = 'Product_' || ?::varchar\n"})}),"\n",(0,i.jsx)(n.p,{children:"The resulting output is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Project\r\n fieldNames: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n projection: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n est: (rows=16650)\r\n HashJoin\r\n predicate: =(USERID$0, USERID)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME, USERID$0, USERNAME]\r\n type: inner\r\n est: (rows=16650)\r\n HashJoin\r\n predicate: =(PRODUCTID, PRODUCTID$0)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME]\r\n type: inner\r\n est: (rows=16650)\r\n Exchange\r\n distribution: single\r\n est: (rows=50000)\r\n TableScan\r\n table: PUBLIC.REVIEWS\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n est: (rows=50000)\r\n Exchange\r\n distribution: single\r\n est: (rows=1665)\r\n TableScan\r\n table: PUBLIC.PRODUCTS\r\n predicate: =(PRODUCTNAME, ||(_UTF-8'Product_', CAST(?0):VARCHAR CHARACTER SET \"UTF-8\"))\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n est: (rows=1665)\r\n Exchange\r\n distribution: single\r\n est: (rows=10000)\r\n TableScan\r\n table: PUBLIC.USERS\r\n fieldNames: [USERID, USERNAME]\r\n est: (rows=10000)\n"})}),"\n",(0,i.jsxs)(n.p,{children:["This execution plan represents a query that joins three tables: ",(0,i.jsx)(n.code,{children:"USERS"}),", ",(0,i.jsx)(n.code,{children:"REVIEWS"}),", and ",(0,i.jsx)(n.code,{children:"PRODUCTS"}),", and selects four fields after filtering by product name."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Project"})," (root node):\r\nOutputs the final selected fields \u2014 ",(0,i.jsx)(n.code,{children:"USERNAME"}),", ",(0,i.jsx)(n.code,{children:"PRODUCTNAME"}),", ",(0,i.jsx)(n.code,{children:"REVIEWTEXT"}),", and ",(0,i.jsx)(n.code,{children:"RATING"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"HashJoins"})," (two levels):\r\nPerform the inner joins."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The first (bottom-most) joins ",(0,i.jsx)(n.code,{children:"REVIEWS"})," with ",(0,i.jsx)(n.code,{children:"PRODUCTS"})," on ",(0,i.jsx)(n.code,{children:"PRODUCTID"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["The second joins the result with ",(0,i.jsx)(n.code,{children:"USERS"})," on ",(0,i.jsx)(n.code,{children:"USERID"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"TableScans"}),":\r\nEach table is scanned:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"REVIEWS"})," is fully scanned."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"PRODUCTS"})," is scanned with a filter on ",(0,i.jsx)(n.code,{children:"PRODUCTNAME"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"USERS"})," is fully scanned."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Exchange"})," nodes:\r\nIndicate data redistribution between operators."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Each node includes:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"fieldNames"}),": Output columns at that stage."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"predicate"}),": Join or filter condition."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"est"}),": Estimated number of rows at that point in the plan."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"example-query-mapping",children:"Example: Query Mapping"}),"\n",(0,i.jsx)(n.p,{children:"A result of the EXPLAIN MAPPING command includes additional metadata providing insight into how the query is mapped on cluster topology.\r\nSo, for the command like below:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"EXPLAIN MAPPING FOR\r\n SELECT\r\n U.UserName, P.ProductName, R.ReviewText, R.Rating\r\n FROM Users U, Reviews R, Products P\r\n WHERE U.UserID = R.UserID\r\n AND R.ProductID = P.ProductID\r\n AND P.ProductName = 'Product_' || ?::varchar\n"})}),"\n",(0,i.jsx)(n.p,{children:"The resulting output is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'Fragment#0 root\r\n distribution: single\r\n executionNodes: [node_1]\r\n tree:\r\n Project\r\n fieldNames: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n projection: [USERNAME, PRODUCTNAME, REVIEWTEXT, RATING]\r\n est: (rows=1)\r\n HashJoin\r\n predicate: =(USERID$0, USERID)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME, USERID$0, USERNAME]\r\n type: inner\r\n est: (rows=1)\r\n HashJoin\r\n predicate: =(PRODUCTID, PRODUCTID$0)\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING, PRODUCTID$0, PRODUCTNAME]\r\n type: inner\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n sourceFragmentId: 1\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n sourceFragmentId: 2\r\n est: (rows=1)\r\n Receiver\r\n fieldNames: [USERID, USERNAME]\r\n sourceFragmentId: 3\r\n est: (rows=1)\r\n\r\nFragment#1\r\n distribution: random\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [REVIEWS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=50000)\r\n TableScan\r\n table: PUBLIC.REVIEWS\r\n fieldNames: [PRODUCTID, USERID, REVIEWTEXT, RATING]\r\n est: (rows=50000)\r\n\r\nFragment#2\r\n distribution: table PUBLIC.PRODUCTS in zone "Default"\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [PRODUCTS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=1665)\r\n TableScan\r\n table: PUBLIC.PRODUCTS\r\n predicate: =(PRODUCTNAME, ||(_UTF-8\'Product_\', CAST(?0):VARCHAR CHARACTER SET "UTF-8"))\r\n fieldNames: [PRODUCTID, PRODUCTNAME]\r\n est: (rows=1665)\r\n\r\nFragment#3\r\n distribution: table PUBLIC.USERS in zone "Default"\r\n executionNodes: [node_1, node_2, node_3]\r\n partitions: [USERS=[node_1={0, 2, 5, 6, 7, 8, 9, 10, 12, 13, 20}, node_2={1, 3, 11, 19, 21, 22, 23, 24}, node_3={4, 14, 15, 16, 17, 18}]]\r\n tree:\r\n Sender\r\n distribution: single\r\n targetFragmentId: 0\r\n est: (rows=10000)\r\n TableScan\r\n table: PUBLIC.USERS\r\n fieldNames: [USERID, USERNAME]\r\n est: (rows=10000)\n'})}),"\n",(0,i.jsx)(n.p,{children:"where:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Fragment#0"})," means fragment with id=0"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"root"})," marks a fragment which is considered as root fragment, i.e. a fragment which represents user's cursor"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"distribution"})," attribute provides an insight into which mapping strategy was applied to this particular fragment"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"executionNodes"})," attribute provides a list of nodes this fragment will be executed on"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"partitions"})," attribute provides an insight into which partitions of which tables will be read from which nodes"]}),"\n",(0,i.jsxs)(n.li,{children:["A ",(0,i.jsx)(n.strong,{children:"tree"})," attribute specifies which part of the relational tree corresponds to this fragment"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The output above shows how the query is broken into multiple execution fragments and distributed across the cluster. It gives insight into both the logical execution plan and how it maps to the physical topology."}),"\n",(0,i.jsxs)(n.p,{children:["The query starts execution in ",(0,i.jsx)(n.em,{children:"Fragment#0"}),", which serves as the root of the plan \u2014 this is where the final result is produced. It runs on a single node (",(0,i.jsx)(n.code,{children:"node_1"}),") and contains the main logic of the query, including the projection and two nested hash joins. Instead of scanning tables directly, it receives data from other fragments through ",(0,i.jsx)(n.code,{children:"Receiver"})," operators. These incoming streams correspond to the ",(0,i.jsx)(n.code,{children:"REVIEWS"}),", ",(0,i.jsx)(n.code,{children:"PRODUCTS"}),", and ",(0,i.jsx)(n.code,{children:"USERS"})," tables."]}),"\n",(0,i.jsxs)(n.p,{children:["The actual table scans happen in ",(0,i.jsx)(n.em,{children:"Fragments 1 through 3"}),", each responsible for one of the involved tables. These fragments operate in parallel across the cluster. Each performs a scan on its respective table and then sends the results back to Fragment#0."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"Fragment#1"})," handles the ",(0,i.jsx)(n.code,{children:"REVIEWS"})," table. It runs on all nodes and uses a random distribution strategy. Data is partitioned across nodes, and after scanning the table, results are sent upstream."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"Fragment#2"})," is in charge of the ",(0,i.jsx)(n.code,{children:"PRODUCTS"})," table. It also spans all nodes but follows a zone-based distribution linked to the table's partitioning. There's a filter applied to ",(0,i.jsx)(n.code,{children:"PRODUCTNAME"}),", which limits the amount of data sent to the root."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"Fragment#3"})," covers the ",(0,i.jsx)(n.code,{children:"USERS"})," table. Like the others, it's distributed and reads from table partitions spread across the cluster."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Each fragment includes metadata such as the nodes it's executed on, how data is partitioned, and how results are sent between fragments. This layout provides a clear view of not only how the query is logically processed, but also how the workload is split and coordinated in a distributed environment."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/b96d81e3.182ccbcf.js b/docs/ignite3/assets/js/b96d81e3.182ccbcf.js deleted file mode 100644 index 5495506f26..0000000000 --- a/docs/ignite3/assets/js/b96d81e3.182ccbcf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6007],{28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>c});var i=t(96540);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}},68807:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>u});const i=JSON.parse('{"id":"administrators-guide/security/authentication","title":"Authentication","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/security/authentication.md","sourceDirName":"administrators-guide/security","slug":"/administrators-guide/security/authentication","permalink":"/docs/ignite3/3.0.0/administrators-guide/security/authentication","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Authentication","sidebar_label":"Authentication"},"sidebar":"tutorialSidebar","previous":{"title":"SSL/TLS","permalink":"/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls"},"next":{"title":"Configuring Metrics","permalink":"/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics"}}');var r=t(74848),s=t(28453);const a={title:"Authentication",sidebar_label:"Authentication"},c="Authentication",o={},u=[{value:"Authentication Configuration",id:"authentication-configuration",level:2},{value:"Basic Authentication",id:"basic-authentication",level:3}];function l(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"authentication",children:"Authentication"})}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite 3 provides basic Authentication capabilities."}),"\n",(0,r.jsx)(n.h2,{id:"authentication-configuration",children:"Authentication Configuration"}),"\n",(0,r.jsx)(n.h3,{id:"basic-authentication",children:"Basic Authentication"}),"\n",(0,r.jsxs)(n.p,{children:["To start using basic authentication on the cluster, you need to enable it and create an initial administrator user. By default, the role that grants administrator permissions is called ",(0,r.jsx)(n.code,{children:"admin"}),", but you can change it in cluster configuration."]}),"\n",(0,r.jsx)(n.p,{children:"Here is an example of configuration that initializes the cluster and enables security on it:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Prepare cluster configuration file with security configuration:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'ignite {\r\n security {\r\n enabled:true\r\n\tauthentication {\r\n\t providers=[\r\n\t {\r\n name=default\r\n type=basic\r\n users=[\r\n {\r\n displayName=administrator\r\n password="ignite"\r\n roles=[\r\n system\r\n ]\r\n username=ignite\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Initialize the cluster with the security configuration:"}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster init --name=sampleCluster --config-files=/cluster-config.conf\n"})}),"\n",(0,r.jsxs)(n.p,{children:["When the cluster has been initialized, it has basic authorization configured for ",(0,r.jsx)(n.code,{children:"ignite"})," user name and ",(0,r.jsx)(n.code,{children:"ignite"})," password with system level access. However, by default security is disabled. To enable it:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster config update ignite.security.enabled=true\n"})}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsx)(n.p,{children:"If you lose access to all accounts with system role, you will lose administrator access to the cluster."})}),"\n",(0,r.jsx)(n.p,{children:"After authorization is enabled, you will be disconnected from the cluster and must reconnect to the cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"connect http://127.0.0.1:10300 --username ignite --password ignite\n"})}),"\n",(0,r.jsx)(n.p,{children:"You can change the password for the default user by updating cluster configuration, for example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster config update ignite.security.authentication.providers.default.users.ignite.password=myPass\n"})})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/b99fd215.800913a9.js b/docs/ignite3/assets/js/b99fd215.800913a9.js deleted file mode 100644 index a6e8d2b654..0000000000 --- a/docs/ignite3/assets/js/b99fd215.800913a9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7505],{28453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>s});var t=r(96540);const l={},a=t.createContext(l);function i(e){const n=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),t.createElement(a.Provider,{value:n},e.children)}},57080:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"api-reference/native-clients/cpp/tables-api","title":"Tables API","description":"The Tables API provides CRUD operations on table data. It supports both binary tuple operations and typed C++ object operations through record views and key-value views.","source":"@site/docs/api-reference/native-clients/cpp/tables-api.md","sourceDirName":"api-reference/native-clients/cpp","slug":"/api-reference/native-clients/cpp/tables-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Tables API","id":"tables-api","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Client API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api"},"next":{"title":"SQL API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api"}}');var l=r(74848),a=r(28453);const i={title:"Tables API",id:"tables-api",sidebar_position:2},s="Tables API",c={},o=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Table Access",id:"table-access",level:3},{value:"View Types",id:"view-types",level:3},{value:"Binary vs Typed Operations",id:"binary-vs-typed-operations",level:3},{value:"Transaction Support",id:"transaction-support",level:3},{value:"Getting Tables",id:"getting-tables",level:2},{value:"Retrieve a Single Table",id:"retrieve-a-single-table",level:3},{value:"List All Tables",id:"list-all-tables",level:3},{value:"Record Views",id:"record-views",level:2},{value:"Binary Record View",id:"binary-record-view",level:3},{value:"Typed Record View",id:"typed-record-view",level:3},{value:"Record View Operations",id:"record-view-operations",level:3},{value:"Key-Value Views",id:"key-value-views",level:2},{value:"Binary Key-Value View",id:"binary-key-value-view",level:3},{value:"Typed Key-Value View",id:"typed-key-value-view",level:3},{value:"Key-Value View Operations",id:"key-value-view-operations",level:3},{value:"Ignite Tuple",id:"ignite-tuple",level:2},{value:"Creating Tuples",id:"creating-tuples",level:3},{value:"Accessing Values",id:"accessing-values",level:3},{value:"Column Metadata",id:"column-metadata",level:3},{value:"Column Names",id:"column-names",level:3},{value:"Asynchronous Operations",id:"asynchronous-operations",level:2},{value:"Transaction Integration",id:"transaction-integration",level:2},{value:"Reference",id:"reference",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.header,{children:(0,l.jsx)(n.h1,{id:"tables-api",children:"Tables API"})}),"\n",(0,l.jsx)(n.p,{children:"The Tables API provides CRUD operations on table data. It supports both binary tuple operations and typed C++ object operations through record views and key-value views."}),"\n",(0,l.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,l.jsx)(n.h3,{id:"table-access",children:"Table Access"}),"\n",(0,l.jsxs)(n.p,{children:["Tables are accessed through the ",(0,l.jsx)(n.code,{children:"tables"})," interface obtained from the client. Each table provides multiple view types for different access patterns."]}),"\n",(0,l.jsx)(n.h3,{id:"view-types",children:"View Types"}),"\n",(0,l.jsx)(n.p,{children:"Apache Ignite provides two view categories:"}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Record Views"})," operate on complete row data. A single tuple or object contains all columns including the primary key. Use record views when working with complete records."]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Key-Value Views"})," separate primary key columns from value columns. Operations use distinct key and value tuples or objects. Use key-value views when the domain model separates keys from data."]}),"\n",(0,l.jsx)(n.h3,{id:"binary-vs-typed-operations",children:"Binary vs Typed Operations"}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Binary Views"})," use ",(0,l.jsx)(n.code,{children:"ignite_tuple"})," for dynamic column access without schema knowledge. Column values are accessed by name or index at runtime."]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Typed Views"})," use C++ structs or classes with compile-time type safety. Type conversion happens through ",(0,l.jsx)(n.code,{children:"convert_to_tuple"})," and ",(0,l.jsx)(n.code,{children:"convert_from_tuple"})," template specializations."]}),"\n",(0,l.jsx)(n.h3,{id:"transaction-support",children:"Transaction Support"}),"\n",(0,l.jsxs)(n.p,{children:["All view operations accept an optional ",(0,l.jsx)(n.code,{children:"transaction*"})," parameter. Pass ",(0,l.jsx)(n.code,{children:"nullptr"})," for implicit transactions. Pass a transaction object for explicit transaction control."]}),"\n",(0,l.jsx)(n.h2,{id:"getting-tables",children:"Getting Tables"}),"\n",(0,l.jsx)(n.h3,{id:"retrieve-a-single-table",children:"Retrieve a Single Table"}),"\n",(0,l.jsx)(n.p,{children:"Get a table by name:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nauto tables = client.get_tables();\r\nauto table = tables.get_table("my_table");\r\n\r\nif (table.has_value()) {\r\n // Use table\r\n}\n'})}),"\n",(0,l.jsx)(n.p,{children:"Get a table with qualified name:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'auto table = tables.get_table("my_schema.my_table");\n'})}),"\n",(0,l.jsx)(n.p,{children:"Use async retrieval:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'tables.get_table_async("my_table", [](ignite_result> result) {\r\n if (!result.has_error()) {\r\n auto table = std::move(result).value();\r\n if (table.has_value()) {\r\n // Use table\r\n }\r\n }\r\n});\n'})}),"\n",(0,l.jsx)(n.h3,{id:"list-all-tables",children:"List All Tables"}),"\n",(0,l.jsx)(n.p,{children:"Retrieve all tables:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"auto all_tables = tables.get_tables();\r\nfor (const auto& table : all_tables) {\r\n std::cout << table.get_name() << std::endl;\r\n}\n"})}),"\n",(0,l.jsx)(n.p,{children:"Use async retrieval:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"tables.get_tables_async([](ignite_result> result) {\r\n if (!result.has_error()) {\r\n auto all_tables = std::move(result).value();\r\n // Process tables\r\n }\r\n});\n"})}),"\n",(0,l.jsx)(n.h2,{id:"record-views",children:"Record Views"}),"\n",(0,l.jsx)(n.h3,{id:"binary-record-view",children:"Binary Record View"}),"\n",(0,l.jsx)(n.p,{children:"Work with tuples directly:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'auto table = tables.get_table("accounts").value();\r\nauto view = table.get_record_binary_view();\r\n\r\n// Insert a record\r\nignite_tuple record{\r\n {"id", 42},\r\n {"name", "John Doe"},\r\n {"balance", 1000.0}\r\n};\r\n\r\nview.upsert(nullptr, record);\r\n\r\n// Retrieve a record\r\nignite_tuple key{{"id", 42}};\r\nauto result = view.get(nullptr, key);\r\n\r\nif (result.has_value()) {\r\n auto balance = result->get("balance");\r\n}\n'})}),"\n",(0,l.jsx)(n.h3,{id:"typed-record-view",children:"Typed Record View"}),"\n",(0,l.jsx)(n.p,{children:"Work with C++ types:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'struct account {\r\n int64_t id;\r\n std::string name;\r\n double balance;\r\n};\r\n\r\n// Define type conversion (typically in a header)\r\nnamespace ignite {\r\n template<>\r\n struct convert_to_tuple {\r\n static ignite_tuple to_tuple(const account& obj) {\r\n return ignite_tuple{\r\n {"id", obj.id},\r\n {"name", obj.name},\r\n {"balance", obj.balance}\r\n };\r\n }\r\n };\r\n\r\n template<>\r\n struct convert_from_tuple {\r\n static account from_tuple(const ignite_tuple& tuple) {\r\n return account{\r\n tuple.get("id"),\r\n tuple.get("name"),\r\n tuple.get("balance")\r\n };\r\n }\r\n };\r\n}\r\n\r\n// Use typed view\r\nauto table = tables.get_table("accounts").value();\r\nauto view = table.get_record_view();\r\n\r\naccount new_account{42, "John Doe", 1000.0};\r\nview.upsert(nullptr, new_account);\r\n\r\naccount key{42};\r\nauto result = view.get(nullptr, key);\n'})}),"\n",(0,l.jsx)(n.h3,{id:"record-view-operations",children:"Record View Operations"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Basic Operations:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"// Insert (fails if exists)\r\nbool inserted = view.insert(nullptr, record);\r\n\r\n// Upsert (insert or replace)\r\nview.upsert(nullptr, record);\r\n\r\n// Replace (fails if not exists)\r\nbool replaced = view.replace(nullptr, record);\r\n\r\n// Replace with old value check\r\nbool replaced = view.replace(nullptr, old_record, new_record);\r\n\r\n// Get and replace atomically\r\nauto old_record = view.get_and_replace(nullptr, new_record);\r\n\r\n// Get and upsert atomically\r\nauto old_record = view.get_and_upsert(nullptr, record);\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Delete Operations:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"// Remove by key\r\nbool removed = view.remove(nullptr, key);\r\n\r\n// Remove exact match\r\nbool removed = view.remove_exact(nullptr, full_record);\r\n\r\n// Remove and return old value\r\nauto old_record = view.get_and_remove(nullptr, key);\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Batch Operations:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"std::vector records = {record1, record2, record3};\r\n\r\n// Get multiple records\r\nauto results = view.get_all(nullptr, keys);\r\n\r\n// Insert multiple (returns skipped records)\r\nauto skipped = view.insert_all(nullptr, records);\r\n\r\n// Upsert multiple\r\nview.upsert_all(nullptr, records);\r\n\r\n// Remove multiple (returns non-existent keys)\r\nauto non_existent = view.remove_all(nullptr, keys);\r\n\r\n// Remove exact multiple\r\nauto not_matched = view.remove_all_exact(nullptr, records);\n"})}),"\n",(0,l.jsx)(n.h2,{id:"key-value-views",children:"Key-Value Views"}),"\n",(0,l.jsx)(n.h3,{id:"binary-key-value-view",children:"Binary Key-Value View"}),"\n",(0,l.jsx)(n.p,{children:"Separate keys from values:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'auto table = tables.get_table("accounts").value();\r\nauto view = table.get_key_value_binary_view();\r\n\r\n// Put a key-value pair\r\nignite_tuple key{{"id", 42}};\r\nignite_tuple value{\r\n {"name", "John Doe"},\r\n {"balance", 1000.0}\r\n};\r\n\r\nview.put(nullptr, key, value);\r\n\r\n// Get value by key\r\nauto result = view.get(nullptr, key);\r\n\r\n// Check key existence\r\nbool exists = view.contains(nullptr, key);\n'})}),"\n",(0,l.jsx)(n.h3,{id:"typed-key-value-view",children:"Typed Key-Value View"}),"\n",(0,l.jsx)(n.p,{children:"Use separate C++ types for keys and values:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'struct account_key {\r\n int64_t id;\r\n};\r\n\r\nstruct account_data {\r\n std::string name;\r\n double balance;\r\n};\r\n\r\n// Define conversions for both types\r\n// (Similar to record view example)\r\n\r\nauto table = tables.get_table("accounts").value();\r\nauto view = table.get_key_value_view();\r\n\r\naccount_key key{42};\r\naccount_data data{"John Doe", 1000.0};\r\n\r\nview.put(nullptr, key, data);\r\nauto result = view.get(nullptr, key);\n'})}),"\n",(0,l.jsx)(n.h3,{id:"key-value-view-operations",children:"Key-Value View Operations"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Basic Operations:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"// Put (insert or replace)\r\nview.put(nullptr, key, value);\r\n\r\n// Put if absent\r\nbool inserted = view.put_if_absent(nullptr, key, value);\r\n\r\n// Get and put atomically\r\nauto old_value = view.get_and_put(nullptr, key, value);\r\n\r\n// Replace\r\nbool replaced = view.replace(nullptr, key, value);\r\n\r\n// Replace with old value check\r\nbool replaced = view.replace(nullptr, key, old_value, new_value);\r\n\r\n// Get and replace atomically\r\nauto old_value = view.get_and_replace(nullptr, key, value);\r\n\r\n// Check existence\r\nbool exists = view.contains(nullptr, key);\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Delete Operations:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"// Remove by key\r\nbool removed = view.remove(nullptr, key);\r\n\r\n// Remove with value check\r\nbool removed = view.remove(nullptr, key, expected_value);\r\n\r\n// Remove and return value\r\nauto old_value = view.get_and_remove(nullptr, key);\n"})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Batch Operations:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"std::vector> pairs = {{key1, val1}, {key2, val2}};\r\n\r\n// Get multiple values\r\nauto values = view.get_all(nullptr, keys);\r\n\r\n// Put multiple pairs\r\nview.put_all(nullptr, pairs);\r\n\r\n// Remove multiple keys\r\nauto non_existent = view.remove_all(nullptr, keys);\r\n\r\n// Remove multiple pairs with value checks\r\nauto not_matched = view.remove_all(nullptr, pairs);\n"})}),"\n",(0,l.jsx)(n.h2,{id:"ignite-tuple",children:"Ignite Tuple"}),"\n",(0,l.jsx)(n.h3,{id:"creating-tuples",children:"Creating Tuples"}),"\n",(0,l.jsx)(n.p,{children:"Use initializer lists:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'ignite_tuple tuple{\r\n {"id", 42},\r\n {"name", "John"},\r\n {"active", true}\r\n};\n'})}),"\n",(0,l.jsx)(n.p,{children:"Construct with capacity hint:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'ignite_tuple tuple(10); // Reserve space for 10 columns\r\ntuple.set("id", 42);\r\ntuple.set("name", "John");\n'})}),"\n",(0,l.jsx)(n.h3,{id:"accessing-values",children:"Accessing Values"}),"\n",(0,l.jsx)(n.p,{children:"Access by name:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'auto id = tuple.get("id");\r\nauto name = tuple.get("name");\r\n\r\n// Or use primitive wrapper\r\nauto value = tuple.get("id"); // Returns primitive\n'})}),"\n",(0,l.jsx)(n.p,{children:"Access by index:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"auto id = tuple.get(0);\r\nauto name = tuple.get(1);\n"})}),"\n",(0,l.jsx)(n.h3,{id:"column-metadata",children:"Column Metadata"}),"\n",(0,l.jsx)(n.p,{children:"Query column information:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'int32_t count = tuple.column_count();\r\nstd::string name = tuple.column_name(0);\r\nint32_t index = tuple.column_ordinal("id");\n'})}),"\n",(0,l.jsx)(n.h3,{id:"column-names",children:"Column Names"}),"\n",(0,l.jsx)(n.p,{children:"Column names are case-insensitive and normalized to uppercase unless quoted:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:'tuple.set("ID", 42);\r\ntuple.set("id", 42); // Same as above\r\ntuple.set("Id", 42); // Same as above\r\n\r\n// Use quotes for case-sensitive names\r\ntuple.set("\\"Id\\"", 42); // Different from above\n'})}),"\n",(0,l.jsx)(n.h2,{id:"asynchronous-operations",children:"Asynchronous Operations"}),"\n",(0,l.jsxs)(n.p,{children:["All operations have async variants with ",(0,l.jsx)(n.code,{children:"_async"})," suffix:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"view.get_async(nullptr, key, [](ignite_result> result) {\r\n if (!result.has_error()) {\r\n auto tuple = std::move(result).value();\r\n if (tuple.has_value()) {\r\n // Use tuple\r\n }\r\n }\r\n});\r\n\r\nview.upsert_async(nullptr, record, [](ignite_result result) {\r\n if (!result.has_error()) {\r\n // Operation succeeded\r\n }\r\n});\n"})}),"\n",(0,l.jsx)(n.h2,{id:"transaction-integration",children:"Transaction Integration"}),"\n",(0,l.jsx)(n.p,{children:"Use explicit transactions:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-cpp",children:"auto tx = client.get_transactions().begin();\r\n\r\ntry {\r\n view.upsert(&tx, record1);\r\n view.upsert(&tx, record2);\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n tx.rollback();\r\n throw;\r\n}\n"})}),"\n",(0,l.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/cppdoc/",children:"C++ API Documentation"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"./client-api",children:"Client API"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"./sql-api",children:"SQL API"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.a,{href:"./transactions-api",children:"Transactions API"})}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/bb56423f.cc106303.js b/docs/ignite3/assets/js/bb56423f.cc106303.js deleted file mode 100644 index 064f3992d1..0000000000 --- a/docs/ignite3/assets/js/bb56423f.cc106303.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8695],{28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>l});var t=i(96540);const s={},a=t.createContext(s);function r(e){const n=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:n},e.children)}},66122:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"configure-and-operate/installation/index","title":"Installation","description":"Installation methods for Apache Ignite 3.","source":"@site/docs/configure-and-operate/installation/index.mdx","sourceDirName":"configure-and-operate/installation","slug":"/configure-and-operate/installation/","permalink":"/docs/ignite3/3.1.0/configure-and-operate/installation/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Installation"},"sidebar":"tutorialSidebar","previous":{"title":"Configure and Operate","permalink":"/docs/ignite3/3.1.0/configure-and-operate/"},"next":{"title":"ZIP Archive","permalink":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip"}}');var s=i(74848),a=i(28453);const r={title:"Installation"},l="Installation",o={},c=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components},{IIcon:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"installation",children:"Installation"})}),"\n",(0,s.jsx)(n.p,{children:"Installation methods for Apache Ignite 3."}),"\n",(0,s.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:folder-zip-outline",height:"24"})," Install from ZIP Archive"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Download and install Ignite from ZIP or TAR.GZ archives for all platforms."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./installation/install-zip",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:package-variant",height:"24"})," Install DEB/RPM Package"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Install Ignite using native DEB or RPM packages on Debian/Ubuntu or RHEL/CentOS."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./installation/install-deb-rpm",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:docker",height:"24"})," Install with Docker"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Run Ignite in Docker containers for development and testing environments."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./installation/install-docker",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:kubernetes",height:"24"})," Install on Kubernetes"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Deploy Ignite on Kubernetes clusters for production workloads."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./installation/install-kubernetes",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"configuration",children:"Configuration"})," - Configure cluster and nodes"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"../getting-started",children:"Getting Started"})," - Quick start guide"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"operations",children:"Operations"})," - Cluster lifecycle management"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/bc873ee7.7113f028.js b/docs/ignite3/assets/js/bc873ee7.7113f028.js deleted file mode 100644 index 6d50969adf..0000000000 --- a/docs/ignite3/assets/js/bc873ee7.7113f028.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9305],{28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>d});var s=i(96540);const r={},t=s.createContext(r);function o(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(t.Provider,{value:n},e.children)}},38048:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"understand/performance/explain-operators","title":"EXPLAIN Operators Reference","description":"This reference documents all operators that appear in EXPLAIN output. Operators are organized by category based on their function in query execution.","source":"@site/docs/understand/performance/explain-operators.md","sourceDirName":"understand/performance","slug":"/understand/performance/explain-operators","permalink":"/docs/ignite3/3.1.0/understand/performance/explain-operators","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"id":"explain-operators","title":"EXPLAIN Operators Reference","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Using EXPLAIN Command","permalink":"/docs/ignite3/3.1.0/understand/performance/using-explain"},"next":{"title":"API Reference","permalink":"/docs/ignite3/3.1.0/api-reference/"}}');var r=i(74848),t=i(28453);const o={id:"explain-operators",title:"EXPLAIN Operators Reference",sidebar_position:2},d="EXPLAIN Operators Reference",l={},c=[{value:"Quick Reference",id:"quick-reference",level:2},{value:"ColocatedHashAggregate",id:"colocatedhashaggregate",level:2},{value:"ColocatedSortAggregate",id:"colocatedsortaggregate",level:2},{value:"MapHashAggregate",id:"maphashaggregate",level:2},{value:"ReduceHashAggregate",id:"reducehashaggregate",level:2},{value:"MapSortAggregate",id:"mapsortaggregate",level:2},{value:"ReduceSortAggregate",id:"reducesortaggregate",level:2},{value:"ColocatedIntersect",id:"colocatedintersect",level:2},{value:"ColocatedMinus",id:"colocatedminus",level:2},{value:"MapIntersect",id:"mapintersect",level:2},{value:"ReduceIntersect",id:"reduceintersect",level:2},{value:"MapMinus",id:"mapminus",level:2},{value:"ReduceMinus",id:"reduceminus",level:2},{value:"UnionAll",id:"unionall",level:2},{value:"Exchange",id:"exchange",level:2},{value:"TrimExchange",id:"trimexchange",level:2},{value:"Filter",id:"filter",level:2},{value:"HashJoin",id:"hashjoin",level:2},{value:"MergeJoin",id:"mergejoin",level:2},{value:"NestedLoopJoin",id:"nestedloopjoin",level:2},{value:"CorrelatedNestedLoopJoin",id:"correlatednestedloopjoin",level:2},{value:"IndexScan",id:"indexscan",level:2},{value:"TableScan",id:"tablescan",level:2},{value:"KeyValueGet",id:"keyvalueget",level:2},{value:"KeyValueModify",id:"keyvaluemodify",level:2},{value:"Limit",id:"limit",level:2},{value:"Project",id:"project",level:2},{value:"Receiver",id:"receiver",level:2},{value:"Sender",id:"sender",level:2},{value:"SelectCount",id:"selectcount",level:2},{value:"Sort",id:"sort",level:2},{value:"SystemViewScan",id:"systemviewscan",level:2},{value:"TableFunctionScan",id:"tablefunctionscan",level:2},{value:"TableModify",id:"tablemodify",level:2},{value:"Values",id:"values",level:2}];function a(e){const n={code:"code",h1:"h1",h2:"h2",header:"header",li:"li",mermaid:"mermaid",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"explain-operators-reference",children:"EXPLAIN Operators Reference"})}),"\n",(0,r.jsxs)(n.p,{children:["This reference documents all operators that appear in ",(0,r.jsx)(n.code,{children:"EXPLAIN"})," output. Operators are organized by category based on their function in query execution."]}),"\n",(0,r.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Data Access"\r\n TS[TableScan]\r\n IS[IndexScan]\r\n KVG[KeyValueGet]\r\n SVS[SystemViewScan]\r\n TFS[TableFunctionScan]\r\n end\r\n\r\n subgraph "Joins"\r\n HJ[HashJoin]\r\n MJ[MergeJoin]\r\n NLJ[NestedLoopJoin]\r\n CNLJ[CorrelatedNestedLoopJoin]\r\n end\r\n\r\n subgraph "Aggregation"\r\n CHA[ColocatedHashAggregate]\r\n CSA[ColocatedSortAggregate]\r\n MHA[MapHashAggregate]\r\n RHA[ReduceHashAggregate]\r\n end\r\n\r\n subgraph "Set Operations"\r\n UA[UnionAll]\r\n INT[Intersect]\r\n MIN[Minus]\r\n end\r\n\r\n subgraph "Transform"\r\n P[Project]\r\n F[Filter]\r\n S[Sort]\r\n L[Limit]\r\n end\r\n\r\n subgraph "Distribution"\r\n EX[Exchange]\r\n TX[TrimExchange]\r\n SND[Sender]\r\n RCV[Receiver]\r\n end\r\n\r\n subgraph "DML"\r\n TM[TableModify]\r\n KVM[KeyValueModify]\r\n end'}),"\n",(0,r.jsx)(n.h2,{id:"quick-reference",children:"Quick Reference"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Operator"}),(0,r.jsx)(n.th,{children:"Category"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"TableScan"}),(0,r.jsx)(n.td,{children:"Access"}),(0,r.jsx)(n.td,{children:"Full table scan"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"IndexScan"}),(0,r.jsx)(n.td,{children:"Access"}),(0,r.jsx)(n.td,{children:"Index-based scan with optional bounds"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"KeyValueGet"}),(0,r.jsx)(n.td,{children:"Access"}),(0,r.jsx)(n.td,{children:"Direct key lookup"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"HashJoin"}),(0,r.jsx)(n.td,{children:"Join"}),(0,r.jsx)(n.td,{children:"Hash-based join"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"MergeJoin"}),(0,r.jsx)(n.td,{children:"Join"}),(0,r.jsx)(n.td,{children:"Sorted merge join"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"NestedLoopJoin"}),(0,r.jsx)(n.td,{children:"Join"}),(0,r.jsx)(n.td,{children:"Nested iteration join"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ColocatedHashAggregate"}),(0,r.jsx)(n.td,{children:"Aggregate"}),(0,r.jsx)(n.td,{children:"Single-pass hash aggregation"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"MapHashAggregate"}),(0,r.jsx)(n.td,{children:"Aggregate"}),(0,r.jsx)(n.td,{children:"First phase of distributed aggregation"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ReduceHashAggregate"}),(0,r.jsx)(n.td,{children:"Aggregate"}),(0,r.jsx)(n.td,{children:"Final phase of distributed aggregation"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Project"}),(0,r.jsx)(n.td,{children:"Transform"}),(0,r.jsx)(n.td,{children:"Column projection"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Filter"}),(0,r.jsx)(n.td,{children:"Transform"}),(0,r.jsx)(n.td,{children:"Row filtering"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Sort"}),(0,r.jsx)(n.td,{children:"Transform"}),(0,r.jsx)(n.td,{children:"Row ordering"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Exchange"}),(0,r.jsx)(n.td,{children:"Distribution"}),(0,r.jsx)(n.td,{children:"Data redistribution between nodes"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Sender/Receiver"}),(0,r.jsx)(n.td,{children:"Distribution"}),(0,r.jsx)(n.td,{children:"Inter-fragment communication"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"colocatedhashaggregate",children:"ColocatedHashAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key. Colocated aggregate assumes that the data is already distributed according to grouping keys, therefore aggregation can be completed locally in a single pass. The hash aggregate operation maintains a hash table for each grouping set to coalesce equivalent tuples. The output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"colocatedsortaggregate",children:"ColocatedSortAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key. Colocated aggregate assumes that the data is already distributed according to grouping keys, therefore aggregation can be completed locally in a single pass. The sort aggregate operation leverages data ordered by the grouping expressions to calculate data each grouping set tuple-by-tuple in streaming fashion. The output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"collation"}),": List of columns and expected order of sorting this operator is rely on."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"maphashaggregate",children:"MapHashAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key. Map aggregate is a first phase of 2-phase aggregation. During first phase, data is pre-aggregated, and result is sent to the where REDUCE is executed. The hash aggregate operation maintains a hash table for each grouping set to coalesce equivalent tuples. The output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"reducehashaggregate",children:"ReduceHashAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key. Reduce aggregate is a second phase of 2-phase aggregation. During second phase, all pre-aggregated data is merged together, and final result is returned. The hash aggregate operation maintains a hash table for each grouping set to coalesce equivalent tuples. The output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"mapsortaggregate",children:"MapSortAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key. Map aggregate is a first phase of 2-phase aggregation. During first phase, data is pre-aggregated, and result is sent to the where REDUCE is executed. The sort aggregate operation leverages data ordered by the grouping expressions to calculate data each grouping set tuple-by-tuple in streaming fashion. The output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"collation"}),": List of columns and expected order of sorting this operator is rely on."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"reducesortaggregate",children:"ReduceSortAggregate"}),"\n",(0,r.jsxs)(n.p,{children:["The aggregate operation groups input data on one or more sets of grouping keys, calculating each aggregation function for each combination of grouping key. Reduce aggregate is a second phase of 2-phase aggregation. During second phase, all pre-aggregated data is merged together, and final result is returned. The sort aggregate operation leverages data ordered by the grouping expressions to calculate data each grouping set tuple-by-tuple in streaming fashion. The output rows are composed as follows: first come columns participating in grouping keys in the order they enumerated in ",(0,r.jsx)(n.code,{children:"group"})," attribute, then come results of accumulators in the order they enumerated in ",(0,r.jsx)(n.code,{children:"aggregation"})," attribute."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"group"}),": Set of grouping columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"aggregation"}),": List of accumulators."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"collation"}),": List of columns and expected order of sorting this operator is rely on."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"groupSets"}),": List of group key definitions for advanced grouping, like CUBE or ROLLUP. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"colocatedintersect",children:"ColocatedIntersect"}),"\n",(0,r.jsxs)(n.p,{children:["Returns all records from the primary input that are present in every secondary input. If ",(0,r.jsx)(n.code,{children:"all"})," is ",(0,r.jsx)(n.code,{children:"true"}),", then for each specific record returned, the output contains min(m, n1, n2, \u2026, n) copies. Otherwise duplicates are eliminated."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contains duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"colocatedminus",children:"ColocatedMinus"}),"\n",(0,r.jsxs)(n.p,{children:["Returns all records from the primary input excluding any matching records from secondary inputs. If ",(0,r.jsx)(n.code,{children:"all"})," is ",(0,r.jsx)(n.code,{children:"true"}),", then for each specific record returned, the output contains max(0, m - sum(n1, n2, \u2026, n)) copies. Otherwise duplicates are eliminated."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"mapintersect",children:"MapIntersect"}),"\n",(0,r.jsx)(n.p,{children:"Returns all records from the primary input that are present in every secondary input. Map intersect is a first phase of 2-phase computation. During first phase, data is pre-aggregated, and result is sent to the where REDUCE is executed."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"reduceintersect",children:"ReduceIntersect"}),"\n",(0,r.jsxs)(n.p,{children:["Returns all records from the primary input that are present in every secondary input. Reduce intersect is a second phase of 2-phase computation. During second phase, all pre-aggregated data is merged together, and final result is returned. If ",(0,r.jsx)(n.code,{children:"all"})," is ",(0,r.jsx)(n.code,{children:"true"}),", then for each specific record returned, the output contains min(m, n1, n2, \u2026, n) copies. Otherwise duplicates are eliminated."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"mapminus",children:"MapMinus"}),"\n",(0,r.jsx)(n.p,{children:"Returns all records from the primary input excluding any matching records from secondary inputs. Map minus is a first phase of 2-phase computation. During first phase, data is pre-aggregated, and result is sent to the where REDUCE is executed."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"reduceminus",children:"ReduceMinus"}),"\n",(0,r.jsxs)(n.p,{children:["Returns all records from the primary input excluding any matching records from secondary inputs. Reduce minus is a second phase of 2-phase computation. During second phase, all pre-aggregated data is merged together, and final result is returned. If ",(0,r.jsx)(n.code,{children:"all"})," is ",(0,r.jsx)(n.code,{children:"true"}),", then for each specific record returned, the output contains max(0, m - sum(n1, n2, \u2026, n)) copies. Otherwise duplicates are eliminated."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"all"}),": If ",(0,r.jsx)(n.code,{children:"true"}),", then output may contain duplicates."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"unionall",children:"UnionAll"}),"\n",(0,r.jsx)(n.p,{children:"Concatenates results from multiple inputs without removing duplicates."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"exchange",children:"Exchange"}),"\n",(0,r.jsx)(n.p,{children:"Redistribute rows according to specified distribution."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"distribution"}),": A distribution strategy that describes how the rows are distributed across nodes. Possible values are:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"single"}),": a single copy of data is available at single node."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"broadcast"}),": every participating node has the its own copy of all the data."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"random"}),": single copy of data is partitioned and spread randomly across all participating nodes."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"hash"}),": single copy of data is partitioned and spread across nodes based on system-defined hash function of specified columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": single copy of data is partitioned and spread across nodes with regard of distribution of specified table."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"identity"}),": data is distributed with regard to value of specified column."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"trimexchange",children:"TrimExchange"}),"\n",(0,r.jsx)(n.p,{children:"Filters rows according to specified distribution. This operator accept input that is broadcasted, i.e. every participating node has the its own copy of all the data, and applies a predicate such that output rows satisfy specified distribution."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"distribution"}),": A distribution strategy that describes how the rows are distributed across nodes. Possible values are:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"random"}),": single copy of data is partitioned and spread randomly across all participating nodes."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"hash"}),": single copy of data is partitioned and spread across nodes based on system-defined hash function of specified columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": single copy of data is partitioned and spread across nodes with regard of distribution of specified table."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"filter",children:"Filter"}),"\n",(0,r.jsx)(n.p,{children:"Filters rows according to specified predicate conditions."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"hashjoin",children:"HashJoin"}),"\n",(0,r.jsx)(n.p,{children:"The join operation will combine two separate inputs into a single output, based on a join expression. The hash join operator will build a hash table out of right input based on a set of join keys. It will then probe that hash table for the left input, finding matches."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),': A boolean condition that describes whether each row from the left set "match" the row from the right set.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of the join (like INNER, LEFT, SEMI, etc)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"mergejoin",children:"MergeJoin"}),"\n",(0,r.jsx)(n.p,{children:"The join operation will combine two separate inputs into a single output, based on a join expression. The merge join does a join by taking advantage of two sets that are sorted on the join keys. This allows the join operation to be done in a streaming fashion."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),': A boolean condition that describes whether each row from the left set "match" the row from the right set.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of the join (like INNER, LEFT, SEMI, etc)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"nestedloopjoin",children:"NestedLoopJoin"}),"\n",(0,r.jsx)(n.p,{children:"The join operation will combine two separate inputs into a single output, based on a join expression. The nested loop join operator does a join by holding the entire right input and then iterating over it using the left input, evaluating the join expression on the Cartesian product of all rows, only outputting rows where the expression is true."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),': A boolean condition that describes whether each row from the left set "match" the row from the right set.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of the join (like INNER, LEFT, SEMI, etc)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"correlatednestedloopjoin",children:"CorrelatedNestedLoopJoin"}),"\n",(0,r.jsx)(n.p,{children:"The join operation will combine two separate inputs into a single output, based on a join expression. The correlated nested loop join operator does a join by setting correlated variables to a context based on a row from left input, and reevaluating the right input with updated context."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"correlates"}),": Set of correlated variables which are set by current relational operator."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),': A boolean condition that describes whether each row from the left set "match" the row from the right set.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of the join (like INNER, LEFT, SEMI, etc)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"indexscan",children:"IndexScan"}),"\n",(0,r.jsxs)(n.p,{children:["Scans rows using a specified index. A ",(0,r.jsx)(n.code,{children:"searchBounds"})," is used to specify boundaries of index scan or look up. Hence, if it is not specified, all rows will be read. A ",(0,r.jsx)(n.code,{children:"predicate"})," is applied before ",(0,r.jsx)(n.code,{children:"projection"}),". If ",(0,r.jsx)(n.code,{children:"projection"})," is not specified, then ",(0,r.jsx)(n.code,{children:"fieldNames"})," enumerates columns returned from table."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"searchBounds"}),": List of bounds representing boundaries of the range scan or point look up Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tablescan",children:"TableScan"}),"\n",(0,r.jsxs)(n.p,{children:["Scans all rows from a table. A ",(0,r.jsx)(n.code,{children:"predicate"})," is applied before ",(0,r.jsx)(n.code,{children:"projection"}),". If ",(0,r.jsx)(n.code,{children:"projection"})," is not specified, then ",(0,r.jsx)(n.code,{children:"fieldNames"})," enumerates columns returned from table."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"keyvalueget",children:"KeyValueGet"}),"\n",(0,r.jsx)(n.p,{children:"Optimized operator which leverages Key-Value API in get-by-key queries."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"key"}),": Key expression to do look up."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"keyvaluemodify",children:"KeyValueModify"}),"\n",(0,r.jsx)(n.p,{children:"Optimized operator which leverages Key-Value API in DML queries."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of data modification operation (e.g., INSERT, UPDATE, DELETE)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"sourceExpression"}),": Source expressions used for row computations for INSERT operation. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"key"}),": Source expressions used for row computations for DELETE operation. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"limit",children:"Limit"}),"\n",(0,r.jsx)(n.p,{children:"Limits the number of returned rows, with optional offset."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fetch"}),": Maximum number of rows to return. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"offset"}),": Number of rows to skip. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"project",children:"Project"}),"\n",(0,r.jsx)(n.p,{children:"Projects specified expressions or columns from the input."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"receiver",children:"Receiver"}),"\n",(0,r.jsxs)(n.p,{children:["Receives data sent by a ",(0,r.jsx)(n.code,{children:"Sender"})," during distributed query execution."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"sourceFragmentId"}),": An identifier of source fragment, indicating the origin of a data flow edge between fragments."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"sender",children:"Sender"}),"\n",(0,r.jsxs)(n.p,{children:["Sends data to a ",(0,r.jsx)(n.code,{children:"Receiver"})," during distributed query execution."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"targetFragmentId"}),": An identifier of target fragment, indicating the origin of a data flow edge between fragments."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"distribution"}),": A distribution strategy that describes how the rows are distributed across nodes. Possible values are:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"single"}),": a single copy of data is available at single node."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"broadcast"}),": every participating node has the its own copy of all the data."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"random"}),": single copy of data is partitioned and spread randomly across all participating nodes."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"hash"}),": single copy of data is partitioned and spread across nodes based on system-defined hash function of specified columns."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": single copy of data is partitioned and spread across nodes with regard of distribution of specified table."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"identity"}),": data is distributed with regard to value of specified column."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"selectcount",children:"SelectCount"}),"\n",(0,r.jsxs)(n.p,{children:["Optimized operator for various non-transactional ",(0,r.jsx)(n.code,{children:"SELECT COUNT(*)"})," variations of queries."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"sort",children:"Sort"}),"\n",(0,r.jsxs)(n.p,{children:["Sorts rows based on specified collation. If ",(0,r.jsx)(n.code,{children:"fetch"})," attribute is provided, then ",(0,r.jsx)(n.code,{children:"Sort"})," node implements Top-N semantic, implying that only ",(0,r.jsx)(n.code,{children:"fetch"})," + ",(0,r.jsx)(n.code,{children:"offset"})," rows will be stored in memory during sorting phase."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"collation"}),": List of one or more fields to sort by."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fetch"}),": Maximum number of rows to return. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"offset"}),": Number of rows to skip. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"systemviewscan",children:"SystemViewScan"}),"\n",(0,r.jsxs)(n.p,{children:["Scans all rows from a system view. A ",(0,r.jsx)(n.code,{children:"predicate"})," is applied before ",(0,r.jsx)(n.code,{children:"projection"}),". If ",(0,r.jsx)(n.code,{children:"projection"})," is not specified, then ",(0,r.jsx)(n.code,{children:"fieldNames"})," enumerates columns returned from system view."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": System view being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"predicate"}),": Filtering condition. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"projection"}),": List of expressions to evaluate. Optional."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tablefunctionscan",children:"TableFunctionScan"}),"\n",(0,r.jsx)(n.p,{children:"Scans over a function producing result set."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"invocation"}),": Name of the function producing source result set."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tablemodify",children:"TableModify"}),"\n",(0,r.jsx)(n.p,{children:"Applies DML operations on a table (INSERT, UPDATE, DELETE)."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"table"}),": Table being accessed."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"type"}),": Type of data modification operation (e.g., INSERT, UPDATE, DELETE)."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"values",children:"Values"}),"\n",(0,r.jsxs)(n.p,{children:["Produces literal in-memory rows as input (e.g., ",(0,r.jsx)(n.code,{children:"VALUES (1), (2)"}),")."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Attributes:"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"tuples"}),": List of literal tuples to return."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"est"}),": Estimated number of output rows."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"fieldNames"}),": List of names of columns in produced rows. Optional."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/bcb7ad38.22a77969.js b/docs/ignite3/assets/js/bcb7ad38.22a77969.js deleted file mode 100644 index 29333078ec..0000000000 --- a/docs/ignite3/assets/js/bcb7ad38.22a77969.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1665],{11627:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"configure-and-operate/operations/index","title":"Operations","description":"Cluster lifecycle and operational procedures.","source":"@site/docs/configure-and-operate/operations/index.mdx","sourceDirName":"configure-and-operate/operations","slug":"/configure-and-operate/operations/","permalink":"/docs/ignite3/3.1.0/configure-and-operate/operations/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Operations"},"sidebar":"tutorialSidebar","previous":{"title":"Cluster Security","permalink":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security"},"next":{"title":"Lifecycle","permalink":"/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle"}}');var s=n(74848),t=n(28453);const o={title:"Operations"},a="Operations",c={},d=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const r={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components},{IIcon:n}=r;return n||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"operations",children:"Operations"})}),"\n",(0,s.jsx)(r.p,{children:"Cluster lifecycle and operational procedures."}),"\n",(0,s.jsx)(r.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:play-pause",height:"24"})," Lifecycle Management"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Start, stop, and manage cluster lifecycle operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./operations/lifecycle",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:backup-restore",height:"24"})," Disaster Recovery"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Backup, restore, and disaster recovery procedures."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./operations/disaster-recovery",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:alert-circle-outline",height:"24"})," Handle Exceptions"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Exception handling and error recovery strategies."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./operations/handle-exceptions",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(n,{icon:"mdi:sitemap",height:"24"})," Colocation"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Data colocation strategies for performance optimization."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./operations/colocation",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(r.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.a,{href:"configuration",children:"Configuration"})," - Configure your cluster"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.a,{href:"monitoring",children:"Monitoring"})," - Monitor cluster health"]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.a,{href:"../getting-started",children:"Getting Started"})," - Quick start guide"]}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453:(e,r,n)=>{n.d(r,{R:()=>o,x:()=>a});var i=n(96540);const s={},t=i.createContext(s);function o(e){const r=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/be3682b6.94c0bcbc.js b/docs/ignite3/assets/js/be3682b6.94c0bcbc.js deleted file mode 100644 index a8d92c89a2..0000000000 --- a/docs/ignite3/assets/js/be3682b6.94c0bcbc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6193],{28453:(e,i,n)=>{n.d(i,{R:()=>a,x:()=>o});var t=n(96540);const s={},r=t.createContext(s);function a(e){const i=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(r.Provider,{value:i},e.children)}},61841:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/storage-5b255ab63bb718db1ac062ed20385833.png"},75454:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>a,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"administrators-guide/storage/index","title":"Storage","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/storage/index.md","sourceDirName":"administrators-guide/storage","slug":"/administrators-guide/storage/","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Storage","sidebar_label":"Storage"},"sidebar":"tutorialSidebar","previous":{"title":"CLI Configuration","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/cli-config"},"next":{"title":"Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/"}}');var s=n(74848),r=n(28453);const a={title:"Storage",sidebar_label:"Storage"},o=void 0,l={},d=[{value:"What is a Storage Engine?",id:"what-is-a-storage-engine",level:2},{value:"Available Storage Engines",id:"available-storage-engines",level:2},{value:"AIMemory Storage (Volatile)",id:"aimemory-storage-volatile",level:3},{value:"AIPersist Storage (B+ tree)",id:"aipersist-storage-b-tree",level:3},{value:"RocksDB Storage (LSM tree)",id:"rocksdb-storage-lsm-tree",level:3},{value:"Configuring Storage Engines",id:"configuring-storage-engines",level:2},{value:"What is a Storage Profile?",id:"what-is-a-storage-profile",level:2},{value:"Default Storage Profile",id:"default-storage-profile",level:2},{value:"Creating and Using Storage Profiles",id:"creating-and-using-storage-profiles",level:2},{value:"Defining Tables With Storage Profiles",id:"defining-tables-with-storage-profiles",level:2}];function c(e){const i={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n",(0,s.jsx)(i.p,{children:"Apache Ignite 3 features a modern and highly configurable storage system that allows you to choose where and how your data is stored. This topic provides an overview of storage principles in Apache Ignite."}),"\n",(0,s.jsx)(i.p,{children:"The diagram below depicts the relationship between tables, distribution zones, storage profiles and storage engines:"}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{src:n(61841).A+"",width:"987",height:"572"})}),"\n",(0,s.jsx)(i.p,{children:"In Apache Ignite, storage has both cluster-wide and node-specific components:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Cluster-wide Components"}),": Table definitions, Distribution Zone configurations, and Profile names/types are consistent across the entire cluster."]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Node-specific Components"}),": The actual implementation of a Storage Profile is configured locally on each node."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"In Apache Ignite's architecture:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Tables contain your data and are assigned to distribution zones"}),"\n",(0,s.jsx)(i.li,{children:"Distribution zones determine how data is partitioned and distributed across the cluster"}),"\n",(0,s.jsx)(i.li,{children:"Storage profiles define which storage engine to use and how to configure it"}),"\n",(0,s.jsx)(i.li,{children:"Storage engines handle the actual storage and retrieval of data"}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:['For example, all nodes using a profile named "fast_storage" must configure it with the same engine type (e.g., ',(0,s.jsx)(i.code,{children:"aimem"}),"), but can have different settings in storage profiles (like memory allocation) based on each node's capabilities."]}),"\n",(0,s.jsx)(i.h2,{id:"what-is-a-storage-engine",children:"What is a Storage Engine?"}),"\n",(0,s.jsx)(i.p,{children:"Storage engines handle how your data is physically written to and read from storage media. Each engine has its own approach to organizing and accessing data, optimized for different usage patterns. It defines:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"The binary format of stored data"}),"\n",(0,s.jsx)(i.li,{children:"Configuration properties for specific data formats"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Apache Ignite supports different storage engines that can be used interchangeably, depending on your expected database workload."}),"\n",(0,s.jsx)(i.h2,{id:"available-storage-engines",children:"Available Storage Engines"}),"\n",(0,s.jsx)(i.h3,{id:"aimemory-storage-volatile",children:"AIMemory Storage (Volatile)"}),"\n",(0,s.jsx)(i.p,{children:"Apache Ignite Volatile storage provides quick, in-memory storage without persistence guarantees. All data is stored in RAM and will be lost on cluster shutdown."}),"\n",(0,s.jsx)(i.h3,{id:"aipersist-storage-b-tree",children:"AIPersist Storage (B+ tree)"}),"\n",(0,s.jsx)(i.p,{children:"Apache Ignite Persistence provides responsive persistent storage. It stores all data on disk, loading as much as possible into RAM for processing. Each partition is stored in a separate file, along with indexes and metadata."}),"\n",(0,s.jsx)(i.h3,{id:"rocksdb-storage-lsm-tree",children:"RocksDB Storage (LSM tree)"}),"\n",(0,s.jsx)(i.p,{children:"RocksDB is an experimental persistent storage engine based on LSM tree, optimized for environments with a high number of write requests."}),"\n",(0,s.jsx)(i.h2,{id:"configuring-storage-engines",children:"Configuring Storage Engines"}),"\n",(0,s.jsx)(i.p,{children:"Storage engine configuration applies to all profiles using that engine. All storage engines start with their respective default configuration. To change storage engine configuration, use the CLI tool:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"node config show ignite.storage.engines\r\nnode config update ignite.storage.engines.aipersist.checkpoint.intervalMillis = 16000\n"})}),"\n",(0,s.jsx)(i.p,{children:"After updating the configuration, restart the node for changes to take effect."}),"\n",(0,s.jsx)(i.h2,{id:"what-is-a-storage-profile",children:"What is a Storage Profile?"}),"\n",(0,s.jsxs)(i.p,{children:["A storage profile is the Apache Ignite node entity that defines the configuration parameters for a Storage Engine. A ",(0,s.jsx)(i.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"Distribution Zone"})," must be configured to use a set of Storage Profiles declared in the node configuration. A table can only have a single primary storage profile defined."]}),"\n",(0,s.jsx)(i.p,{children:"Storage profiles define:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Which storage engine is used to store data"}),"\n",(0,s.jsx)(i.li,{children:"Configuration values for that storage engine"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"You can declare any number of storage profiles on a node."}),"\n",(0,s.jsx)(i.h2,{id:"default-storage-profile",children:"Default Storage Profile"}),"\n",(0,s.jsxs)(i.p,{children:["Apache Ignite creates a ",(0,s.jsx)(i.code,{children:"default"})," storage profile that uses the persistent Apache Ignite storage engine (",(0,s.jsx)(i.code,{children:"aipersist"}),"). Unless otherwise specified, distribution zones will use this storage profile. To check the currently available profiles on a node, use:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"node config show ignite.storage.profiles\n"})}),"\n",(0,s.jsx)(i.h2,{id:"creating-and-using-storage-profiles",children:"Creating and Using Storage Profiles"}),"\n",(0,s.jsxs)(i.p,{children:["While Apache Ignite creates the ",(0,s.jsx)(i.code,{children:"default"})," storage profile automatically, you can create additional profiles as needed. To create a new profile, pass the profile configuration to the ",(0,s.jsx)(i.code,{children:"storage.profiles"})," parameter:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'node config update "ignite.storage.profiles:{rocksProfile{engine:rocksdb,sizeBytes:10000}}"\n'})}),"\n",(0,s.jsx)(i.p,{children:"After configuration is updated and the node restarted, the new storage profile becomes available for use by distribution zones."}),"\n",(0,s.jsx)(i.h2,{id:"defining-tables-with-storage-profiles",children:"Defining Tables With Storage Profiles"}),"\n",(0,s.jsxs)(i.p,{children:["After defining storage profiles and ",(0,s.jsx)(i.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"distribution zones"}),", you can create tables using SQL or ",(0,s.jsx)(i.a,{href:"/docs/ignite3/3.0.0/developers-guide/java-to-tables",children:"from code"}),". Both zone and storage profile cannot be changed after table creation."]}),"\n",(0,s.jsx)(i.p,{children:"To create a table with a specific storage profile:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone STORAGE PROFILES ['default, profile1'];\r\n\r\nCREATE TABLE exampleTable (key INT PRIMARY KEY, my_value VARCHAR)\r\nZONE exampleZone STORAGE PROFILE 'profile1';\n"})}),"\n",(0,s.jsxs)(i.p,{children:["In this case, ",(0,s.jsx)(i.code,{children:"exampleTable"})," uses the storage engine with parameters specified in the ",(0,s.jsx)(i.code,{children:"profile1"})," storage profile. If a node doesn't have ",(0,s.jsx)(i.code,{children:"profile1"})," configured, the table won't be stored on that node. Each node may have different configuration for ",(0,s.jsx)(i.code,{children:"profile1"}),", and data will be stored according to local configuration."]})]})}function g(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/bfca4c52.8a1266bb.js b/docs/ignite3/assets/js/bfca4c52.8a1266bb.js deleted file mode 100644 index 1b4aabf180..0000000000 --- a/docs/ignite3/assets/js/bfca4c52.8a1266bb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5853],{28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>d});var i=t(96540);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}},84906:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"developers-guide/code-deployment/code-deployment","title":"Code Deployment","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/code-deployment/code-deployment.md","sourceDirName":"developers-guide/code-deployment","slug":"/developers-guide/code-deployment/","permalink":"/docs/ignite3/3.0.0/developers-guide/code-deployment/","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Code Deployment","sidebar_label":"Code Deployment"},"sidebar":"tutorialSidebar","previous":{"title":"Streaming Data","permalink":"/docs/ignite3/3.0.0/developers-guide/data-streamer"},"next":{"title":"Working with Events","permalink":"/docs/ignite3/3.0.0/developers-guide/events/"}}');var s=t(74848),o=t(28453);const r={title:"Code Deployment",sidebar_label:"Code Deployment"},d=void 0,l={},c=[{value:"Deploying Units with Folder Structures",id:"deploying-units-with-folder-structures",level:2},{value:"Deployment Unit Location",id:"deployment-unit-location",level:2},{value:"Deploy New Unit",id:"deploy-new-unit",level:2},{value:"Deploy via CLI",id:"deploy-via-cli",level:3},{value:"Deploy via REST",id:"deploy-via-rest",level:3},{value:"Deploy Manually",id:"deploy-manually",level:3},{value:"Getting Unit Information",id:"getting-unit-information",level:2},{value:"Get Unit Information via CLI",id:"get-unit-information-via-cli",level:3},{value:"Get Unit Information via REST",id:"get-unit-information-via-rest",level:3},{value:"Undeploying Unit",id:"undeploying-unit",level:2},{value:"Undeploy via CLI",id:"undeploy-via-cli",level:3},{value:"Undeploy via REST",id:"undeploy-via-rest",level:3}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n",(0,s.jsxs)(n.p,{children:["When working with Ignite 3, you may need to deploy user code to cluster nodes so that it can be executed across the cluster, as shown in the ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/compute/",children:"Distributed Computing"})," section."]}),"\n",(0,s.jsxs)(n.p,{children:["In Ignite 3 the code is deployed as an immutable ",(0,s.jsx)(n.strong,{children:"deployment unit"})," with a unique ID and version."]}),"\n",(0,s.jsx)(n.p,{children:"While there are no strict policies on what a deployment unit can contain, Ignite 3 currently supports compute jobs implemented in Java and .NET."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"You can invoke compute job execution from any client (.NET, Java, C++, etc. ), but the job itself must be written in Java or .NET."})}),"\n",(0,s.jsx)(n.p,{children:"If you want to use any other programming language in a compute job, you must load that file as part of the job's code. A code file deployed on its own will not be loaded by the JVM and thus cannot be used directly."}),"\n",(0,s.jsx)(n.p,{children:"The example below demonstrates how to load a script that is packaged within a JAR's resources:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'public class MyJob implements ComputeJob {\r\n @Override\r\n public CompletableFuture executeAsync(JobExecutionContext ctx, String arg) {\r\n Ignite ignite = ctx.ignite();\r\n\r\n /** Full path to the script we want to run */\r\n final String resPath = "/org/apache/ignite/example/code/deployment/resources/script.sh";\r\n\r\n try (InputStream in = MyJob.class.getResourceAsStream(resPath)) {\r\n if (in == null) {\r\n throw new IllegalStateException("Resource not found: " + resPath);\r\n }\r\n\r\n byte[] script = in.readAllBytes();\r\n\r\n Process p = new ProcessBuilder("sh", "-s", "--", arg)\r\n .redirectErrorStream(true)\r\n .start();\r\n\r\n try (OutputStream os = p.getOutputStream()) {\r\n os.write(script);\r\n }\r\n\r\n String out;\r\n try (InputStream procOut = p.getInputStream()) {\r\n out = new String(procOut.readAllBytes(), StandardCharsets.UTF_8).strip();\r\n }\r\n\r\n int exit = p.waitFor();\r\n if (exit != 0) {\r\n throw new RuntimeException("Script exited with code " + exit + ":\\n" + out);\r\n }\r\n\r\n String result = "Node: " + ignite.name()\r\n + "\\nArg: " + arg\r\n + "\\nScript output:\\n" + out;\r\n\r\n return CompletableFuture.completedFuture(result);\r\n } catch (Exception e) {\r\n throw new RuntimeException("Failed to run script", e);\r\n }\r\n }\r\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["You can manage deployment units using either ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool",children:"CLI"})," commands or the ",(0,s.jsx)(n.a,{href:"https://ignite.apache.org/releases/3.0.0/openapi.yaml",children:"REST API"}),". Both methods provide the same functionality for deploying, listing, and undeploying code."]}),"\n",(0,s.jsx)(n.h2,{id:"deploying-units-with-folder-structures",children:"Deploying Units with Folder Structures"}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Currently, you can only deploy ZIP archives via REST."})}),"\n",(0,s.jsx)(n.p,{children:"Apache Ignite supports deploying units that contain folder structures using ZIP archives. You can package complex deployment units with multiple files organized in directories, which are automatically extracted and preserved during deployment."}),"\n",(0,s.jsx)(n.p,{children:"To deploy your code this way, package your files into a ZIP archive and deploy it to the cluster. Apache Ignite will preserve the folder structure."}),"\n",(0,s.jsx)(n.h2,{id:"deployment-unit-location",children:"Deployment Unit Location"}),"\n",(0,s.jsxs)(n.p,{children:["By default, nodes store the deployment units in the ",(0,s.jsx)(n.code,{children:"{IGNITE_HOME}/work/deployment"})," directory. This can be changed with the ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config#code-deployment-configuration",children:(0,s.jsx)(n.code,{children:"ignite.deployment.location"})})," node configuration parameter."]}),"\n",(0,s.jsx)(n.p,{children:"The deployment units have the following structure:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"deployment\r\n\u251c\u2500 unit1Id\r\n\u2502 \u251c\u2500 version1\r\n\u2502 \u2514\u2500 version2\r\n\u2514\u2500 unit2Id\r\n \u251c\u2500 version1\r\n \u2514\u2500 version2\n"})}),"\n",(0,s.jsx)(n.p,{children:"Each deployment unit is stored in a separate directory, with each version having its own subdirectory."}),"\n",(0,s.jsx)(n.h2,{id:"deploy-new-unit",children:"Deploy New Unit"}),"\n",(0,s.jsx)(n.p,{children:"Deploying a new unit requires specifying a unique string ID for the code and a version number."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"To update the code, deploy a new unit. The new unit can use the same ID as the existing one, but it must have a different version."})}),"\n",(0,s.jsx)(n.h3,{id:"deploy-via-cli",children:"Deploy via CLI"}),"\n",(0,s.jsxs)(n.p,{children:["When deploying a new unit, use ",(0,s.jsx)(n.code,{children:"cluster unit deploy"})," command with unit's ID and set the following options:"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"version"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," Deployment unit version in ",(0,s.jsx)(n.code,{children:"x.y.z"})," format. If a unit with the same name and version already exists, a ",(0,s.jsx)(n.code,{children:"Unit already exists"})," error will be thrown."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"path"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," Path to the deployment unit file or directory. It is recommended to use an absolute path."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"nodes"}),(0,s.jsxs)(n.td,{children:["Defines the target nodes for deployment. Use ",(0,s.jsx)(n.code,{children:"ALL"})," to deploy to every node immediately, ",(0,s.jsx)(n.code,{children:"MAJORITY"})," to deploy to enough nodes for a management group majority (with remaining nodes updated later), or list specific node names (comma-separated) for immediate deployment to those nodes."]})]})]})]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["You cannot deploy multiple units simultaneously, you need to run ",(0,s.jsx)(n.code,{children:"unit deploy"})," command separately for each file you want to deploy."]})}),"\n",(0,s.jsx)(n.p,{children:"For example, to deploy to the majority of nodes use the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit deploy test-unit --version 1.0.0 --path $ABSOLUTE_PATH_TO_CODE_UNIT --nodes MAJORITY\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Here ",(0,s.jsx)(n.code,{children:"$ABSOLUTE_PATH_TO_CODE_UNIT"})," refers to the absolute path to the code unit file or directory."]}),"\n",(0,s.jsx)(n.h3,{id:"deploy-via-rest",children:"Deploy via REST"}),"\n",(0,s.jsxs)(n.p,{children:["To deploy a new unit via the REST API, send a ",(0,s.jsx)(n.code,{children:"POST"})," request to the ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/units/{unitId}/{unitVersion}"})," endpoint with the following parameters:"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"unitId"}),(0,s.jsx)(n.td,{children:"path"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," Unique unit ID. If a deployment unit with this ID does not exist, it is created."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"unitVersion"}),(0,s.jsx)(n.td,{children:"path"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"}),' Unique version of the deployment unit. If a deployment unit with the specified ID and version already exists, HTTP 409 "Conflict" response is returned.']})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"unitContent"}),(0,s.jsx)(n.td,{children:"file (multipart)"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," JAR file to deploy, provided as a file upload via multipart/form-data."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"deployMode"}),(0,s.jsx)(n.td,{children:"query"}),(0,s.jsxs)(n.td,{children:["Defines how many nodes the unit will be deployed to. If set to ",(0,s.jsx)(n.code,{children:"MAJORITY"}),", the unit will be deployed to enough nodes to form cluster management group majority. If set to ",(0,s.jsx)(n.code,{children:"ALL"}),", the unit will be deployed to all nodes. Cannot be used with the ",(0,s.jsx)(n.code,{children:"initialNodes"})," parameter."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"initialNodes"}),(0,s.jsx)(n.td,{children:"query"}),(0,s.jsxs)(n.td,{children:["The list of names of specific nodes to deploy the unit to. Cannot be used with the ",(0,s.jsx)(n.code,{children:"deployMode"})," parameter."]})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"For example, you can deploy a new unit to specific nodes in your local cluster as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'curl -X POST \'http://localhost:10300/management/v1/deployment/units/unit/1.0.0?initialNodes=node1,node2\' \\\r\n -H "Content-Type: multipart/form-data" \\\r\n -F "unitContent=@/path/to/your/unit.jar"\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["You can target nodes using either the ",(0,s.jsx)(n.code,{children:"deployMode"})," or ",(0,s.jsx)(n.code,{children:"initialNodes"})," parameter. These options serve the same purpose as the similar CLI parameters, ensuring the unit propagates as needed."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["For additional details see the corresponding ",(0,s.jsx)(n.a,{href:"https://ignite.apache.org/releases/3.0.0/openapi.yaml",children:"API documentation"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"deploy-manually",children:"Deploy Manually"}),"\n",(0,s.jsx)(n.p,{children:"If necessary, you can deploy a new unit manually by adding your code to the deployment unit storage on the node. Unlike other deployment options, node restart is required to load new deployment units."}),"\n",(0,s.jsx)(n.p,{children:"To deploy the code:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Find the ",(0,s.jsx)(n.a,{href:"#deployment-unit-location",children:"deployment unit location"})," on the node."]}),"\n",(0,s.jsx)(n.li,{children:"Create a new directory. This directory will be used as the deployment unit ID."}),"\n",(0,s.jsxs)(n.li,{children:["Create a new subdirectory. This directory will be used as the deployment unit version. You must use ",(0,s.jsx)(n.a,{href:"https://semver.org/",children:"semantic version"})," as its name."]}),"\n",(0,s.jsx)(n.li,{children:"Add your code to the subdirectory."}),"\n",(0,s.jsx)(n.li,{children:"Restart the node to load the new code."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"As a result, your directory structure may look like this:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"deployment\r\n\u2514\u2500 myUnit\r\n \u2514\u2500 1.0.0\r\n \u2514\u2500 [code files]\n"})}),"\n",(0,s.jsx)(n.h2,{id:"getting-unit-information",children:"Getting Unit Information"}),"\n",(0,s.jsx)(n.p,{children:"This section explains how get all deployments on the cluster or on a specific node, view unit details such as status and version, and search or filter deployments by these attributes."}),"\n",(0,s.jsx)(n.h3,{id:"get-unit-information-via-cli",children:"Get Unit Information via CLI"}),"\n",(0,s.jsxs)(n.p,{children:["You can list deployment units using ",(0,s.jsx)(n.code,{children:"unit list"})," command."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["When you run the ",(0,s.jsx)(n.code,{children:"unit list"})," command in the CLI, the output shows a list of deployment units. An asterisk (*) indicates the active version, which is always the highest ",(0,s.jsx)(n.a,{href:"https://semver.org/",children:"semantic version"}),", regardless of deployment order."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.code,{children:"cluster unit list"})," command to see all deployed units on the cluster."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.code,{children:"node unit list"})," command to view only the units on the node where the command is executed."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Pass the unit's ID to the command to get information for the specific unit:"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit list test-unit\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Search units by adding ",(0,s.jsx)(n.code,{children:"version"})," command options:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit list test-unit --version 1.0.0\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Or filter by ",(0,s.jsx)(n.code,{children:"status"}),":"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit list test-unit --status deployed\n"})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"statuses"}),(0,s.jsxs)(n.td,{children:["Filter units by status.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"UPLOADING"})," - the unit is being deployed to the cluster",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"DEPLOYED"})," - the unit is deployed to the cluster and can be used",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"OBSOLETE"})," - the command to remove unit has been received, but it is still used in some jobs",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"REMOVING"})," - the unit is being removed",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),"If not specified, deployment units in all statuses will be returned."]})]})})]}),"\n",(0,s.jsx)(n.h3,{id:"get-unit-information-via-rest",children:"Get Unit Information via REST"}),"\n",(0,s.jsxs)(n.p,{children:["You can also retrieve deployment unit details via ",(0,s.jsx)(n.code,{children:"GET"})," requests."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["To get information for a specific unit on a node or across the cluster, use ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/node/units/{unitId}"})," and ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/cluster/units/{unitId}"})," respectively."]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl -X GET 'http://localhost:10300/management/v1/deployment/cluster/units/test-unit/1.0.0'\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["To list all deployment units for the node or across the cluster, use ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/node/units"})," and ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/cluster/units"})," respectively."]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl -X GET 'http://localhost:10300/management/v1/deployment/cluster/units/'\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"You can further narrow down the search by looking up only deployments with specific versions or statuses."}),"\n"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"unitId"}),(0,s.jsx)(n.td,{children:"path"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," Unique unit ID of the deployment unit."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"version"}),(0,s.jsx)(n.td,{children:"query"}),(0,s.jsx)(n.td,{children:"Unique version of the deployment unit. If not specified, all versions of deployment unit will be returned."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"statuses"}),(0,s.jsx)(n.td,{children:"query"}),(0,s.jsxs)(n.td,{children:["Statuses of the deployment units to return. Possible values:",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"UPLOADING"})," - the unit is being deployed to the cluster",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"DEPLOYED"})," - the unit is deployed to the cluster and can be used",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"OBSOLETE"})," - the command to remove unit has been received, but it is still used in some jobs",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"REMOVING"})," - the unit is being removed",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),"If not specified, deployment units in all statuses will be returned."]})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"undeploying-unit",children:"Undeploying Unit"}),"\n",(0,s.jsx)(n.p,{children:"When you no longer need a deployment unit version, you can undeploy it from the cluster."}),"\n",(0,s.jsx)(n.h3,{id:"undeploy-via-cli",children:"Undeploy via CLI"}),"\n",(0,s.jsxs)(n.p,{children:["Use the ",(0,s.jsx)(n.code,{children:"cluster unit undeploy"})," command. Provide unit ID and unit ",(0,s.jsx)(n.code,{children:"version"})," to remove."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit undeploy test-unit --version 1.0.0\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You cannot undeploy all units with the same ID at once, you must remove them by version."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"When you undeploy a unit that has multiple versions, the active code rolls back to the next most recent version, determined by the version number."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"undeploy-via-rest",children:"Undeploy via REST"}),"\n",(0,s.jsxs)(n.p,{children:["To undeploy a unit from specific nodes, use a ",(0,s.jsx)(n.code,{children:"DELETE"})," request to ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/units/{unitId}/{unitVersion}"})," endpoint."]}),"\n",(0,s.jsx)(n.p,{children:"For instance, to undeploy the same unit from nodes node1 and node2, use the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl -X DELETE 'http://localhost:10300/management/v1/deployment/units/test-unit/1.0.0?nodes=node1,node2'\n"})}),"\n",(0,s.jsxs)(n.p,{children:["When the cluster receives the request, it will delete the specified deployment unit version on all nodes.\r\nIf the unit is used in a job, it will instead be moved to the ",(0,s.jsx)(n.code,{children:"OBSOLETE"})," status and removed once it is no longer required."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/c196937a.4151a0e4.js b/docs/ignite3/assets/js/c196937a.4151a0e4.js deleted file mode 100644 index 66f0d5fe9a..0000000000 --- a/docs/ignite3/assets/js/c196937a.4151a0e4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8498],{13269:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"developers-guide/events/index","title":"Working with Events","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/events/index.md","sourceDirName":"developers-guide/events","slug":"/developers-guide/events/","permalink":"/docs/ignite3/3.0.0/developers-guide/events/","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Working with Events","sidebar_label":"Working with Events"},"sidebar":"tutorialSidebar","previous":{"title":"Code Deployment","permalink":"/docs/ignite3/3.0.0/developers-guide/code-deployment/"},"next":{"title":"Working with Events","permalink":"/docs/ignite3/3.0.0/developers-guide/events/"}}');var s=t(74848),i=t(28453);const l={title:"Working with Events",sidebar_label:"Working with Events"},d=void 0,c={},o=[{value:"Enabling Events",id:"enabling-events",level:2},{value:"Sink Structure",id:"sink-structure",level:2},{value:"Channel Structure",id:"channel-structure",level:2},{value:"Event Structure",id:"event-structure",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n",(0,s.jsx)(n.p,{children:"Apache Ignite can generate events for a variety of operations happening in the cluster and notify your application about those operations. There are many types of events, including cache events, node discovery events, distributed task execution events, and many more."}),"\n",(0,s.jsx)(n.h2,{id:"enabling-events",children:"Enabling Events"}),"\n",(0,s.jsxs)(n.p,{children:["In Ignite 3, events are configured cluster-wide, in ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config",children:"cluster configuration"}),". Events are organized in ",(0,s.jsx)(n.strong,{children:"channels"}),", each channel tracking one or more event types. You cannot enable or disable individual events, instead you need to disable event channels."]}),"\n",(0,s.jsx)(n.p,{children:"To create an event channel:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:'cluster config update ignite.eventlog.channels.exampleChannel.events=["USER_AUTHENTICATION_SUCCESS"]\n'})}),"\n",(0,s.jsxs)(n.p,{children:["This channel will track the ",(0,s.jsx)(n.code,{children:"USER_AUTHENTICATION_SUCCESS"}),", but not trigger yet. For the events to trigger, a ",(0,s.jsx)(n.strong,{children:"sink"})," must be configured. It sends the event information to the configured logger category at the configured level. Currently, only the ",(0,s.jsx)(n.code,{children:"log"})," sink type is supported, and it writes output to Apache Ignite log. Here is how you can enable log sink by using the CLI tool:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:'cluster config update ignite.eventlog.sinks.exampleSink = {type="log", channel="exampleChannel"}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Now, the authorization events will be written to the log. Here is how the event may look like:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'2024-06-04 16:19:29:840 +0300 [INFO][%defaultNode%sql-execution-pool-1][EventLog] {"type":"USER_AUTHORIZATION_SUCCESS","timestamp":1717507169840,"productVersion":"3.0.0","user":{"username":"ignite","authenticationProvider":"basic"},"fields":{"privileges":[{"action":"CREATE_TABLE","on":{"objectType":"TABLE","objectName":"TEST2","schema":"PUBLIC"}}],"roles":["system"]}}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Below is the cluster configuration config in JSON."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "eventlog" : {\r\n "channels" : [ {\r\n "enabled" : true,\r\n "events" : [ "USER_AUTHENTICATION_SUCCESS" ],\r\n "name" : "exampleChannel"\r\n } ],\r\n "sinks" : [ {\r\n "channel" : "exampleChannel",\r\n "criteria" : "EventLog",\r\n "format" : "JSON",\r\n "level" : "INFO",\r\n "name" : "sampleSink",\r\n "type" : "log"\r\n } ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.h2,{id:"sink-structure",children:"Sink Structure"}),"\n",(0,s.jsx)(n.p,{children:"Data sink configuration in Apache Ignite 3 has the following structure:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\r\n "channel" : "exampleChannel",\r\n "criteria" : "EventLog",\r\n "format" : "JSON",\r\n "level" : "INFO",\r\n "name" : "sampleSink",\r\n "type" : "log"\r\n}\n'})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Field"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"channel"}),(0,s.jsx)(n.td,{children:"The name of the event channel the data sink logs data for."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"criteria"}),(0,s.jsx)(n.td,{children:"Logging criteria. By default, only EventLog messages are logged."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"format"}),(0,s.jsxs)(n.td,{children:["Output format. Currently, only ",(0,s.jsx)(n.code,{children:"JSON"})," messages are supported."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"level"}),(0,s.jsxs)(n.td,{children:["The level the messages are posted to the log at. Supported values: ",(0,s.jsx)(n.code,{children:"ALL"}),", ",(0,s.jsx)(n.code,{children:"TRACE"}),", ",(0,s.jsx)(n.code,{children:"DEBUG"}),", ",(0,s.jsx)(n.code,{children:"INFO"}),", ",(0,s.jsx)(n.code,{children:"WARNING"}),", ",(0,s.jsx)(n.code,{children:"ERROR"}),", ",(0,s.jsx)(n.code,{children:"OFF"}),". Default value: ",(0,s.jsx)(n.code,{children:"INFO"}),"."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"name"}),(0,s.jsx)(n.td,{children:"Arbitrary sink name."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"type"}),(0,s.jsxs)(n.td,{children:["Type of event sink. Currently, only ",(0,s.jsx)(n.code,{children:"log"})," sink is supported, and is used to write events to log."]})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"channel-structure",children:"Channel Structure"}),"\n",(0,s.jsx)(n.p,{children:"Event channel configuration in Apache Ignite 3 has the following structure:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\r\n "enabled" : true,\r\n "events" : [ "USER_AUTHENTICATION_SUCCESS" ],\r\n "name" : "exampleChannel"\r\n}\n'})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Field"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"enabled"}),(0,s.jsx)(n.td,{children:"Defines if this event channel is enabled."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"events"}),(0,s.jsxs)(n.td,{children:["The list of events tracked by the event channel. For the full list of event types, see ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/events/events-list",children:"Events List"}),"."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"name"}),(0,s.jsx)(n.td,{children:"Arbitrary channel name."})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"event-structure",children:"Event Structure"}),"\n",(0,s.jsxs)(n.p,{children:["All events in Apache Ignite 3 follow the same basic structure described below. Some events provide additional context in the ",(0,s.jsx)(n.code,{children:"data"})," field."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\r\n "type": "AUTHENTICATION",\r\n "user": { "username": "John", "authenticationProvider": "basic" },\r\n "timestamp": 1715169617,\r\n "productVersion": "3.0.0",\r\n "fields": {}\r\n}\n'})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Field"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"type"}),(0,s.jsxs)(n.td,{children:["The type of the event. For the full list of event types, see ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/events/events-list",children:"Events List"}),"."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"user"}),(0,s.jsxs)(n.td,{children:["The name of the user, and the ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/security/authentication",children:"authentication"})," provider used to authorize."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"timestamp"}),(0,s.jsx)(n.td,{children:"Even time in UNIX epoch time."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"productVersion"}),(0,s.jsx)(n.td,{children:"Apache Ignite version used by the client."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"fields"}),(0,s.jsx)(n.td,{children:"Event-specific data."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>d});var r=t(96540);const s={},i=r.createContext(s);function l(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/c2c5a8d2.6be2a0c4.js b/docs/ignite3/assets/js/c2c5a8d2.6be2a0c4.js deleted file mode 100644 index d5dc75703a..0000000000 --- a/docs/ignite3/assets/js/c2c5a8d2.6be2a0c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2521],{28453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>a});var n=t(96540);const s={},r=n.createContext(s);function o(e){const i=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(r.Provider,{value:i},e.children)}},39715:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>g,frontMatter:()=>o,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"administrators-guide/storage/engines/aipersist","title":"Persistent Storage","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/storage/engines/aipersist.md","sourceDirName":"administrators-guide/storage/engines","slug":"/administrators-guide/storage/engines/aipersist","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Persistent Storage","sidebar_label":"Persistent Storage"},"sidebar":"tutorialSidebar","previous":{"title":"Storage Engines and Profiles","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/"},"next":{"title":"RocksDB Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb"}}');var s=t(74848),r=t(28453);const o={title:"Persistent Storage",sidebar_label:"Persistent Storage"},a=void 0,d={},c=[{value:"Overview",id:"overview",level:2},{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Checkpointing",id:"checkpointing",level:2},{value:"Write Throttling",id:"write-throttling",level:2},{value:"Storage Configuration",id:"storage-configuration",level:2}];function l(e){const i={a:"a",code:"code",em:"em",h2:"h2",p:"p",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n",(0,s.jsx)(i.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(i.p,{children:"Apache Ignite Persistence is designed to provide a quick and responsive persistent storage.\r\nWhen using the persistent storage, Apache Ignite stores all the data on disk, and loads as much data as it can into RAM for processing."}),"\n",(0,s.jsx)(i.p,{children:"When persistence is enabled, Apache Ignite stores each partition in a separate file on disk. In addition to data partitions, Apache Ignite stores indexes and metadata."}),"\n",(0,s.jsx)(i.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,s.jsx)(i.p,{children:"Each Apache Ignite storage engine can have several storage profiles."}),"\n",(0,s.jsx)(i.h2,{id:"checkpointing",children:"Checkpointing"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.em,{children:"Checkpointing"})," is the process of copying dirty pages from RAM to partition files on disk. A dirty page is a page that was updated in RAM but was not written to the respective partition file."]}),"\n",(0,s.jsx)(i.p,{children:"After a checkpoint is created, all changes are persisted to disk and will be available if the node crashes and is restarted."}),"\n",(0,s.jsx)(i.p,{children:"Checkpointing is designed to ensure durability of data and recovery in case of a node failure."}),"\n",(0,s.jsx)(i.p,{children:"This process helps you utilize disk space frugally by keeping pages in the most up-to-date state on disk."}),"\n",(0,s.jsxs)(i.p,{children:["You can fine-tune checkpoint settings in the ",(0,s.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config#storage-configuration",children:"aipersist"})," storage engine configuration."]}),"\n",(0,s.jsx)(i.h2,{id:"write-throttling",children:"Write Throttling"}),"\n",(0,s.jsxs)(i.p,{children:["If a dirty page, scheduled for checkpointing, is updated before being written to disk, its previous state is copied to a special region called a checkpointing buffer. If the buffer overflows, Apache Ignite would have to stop processing all updates until the ",(0,s.jsx)(i.a,{href:"#checkpointing",children:"Checkpointing"})," is over. As a result, write performance would drop to zero until the checkpointing cycle is completed."]}),"\n",(0,s.jsx)(i.p,{children:"To avoid the scenario where all updates are stopped, Apache Ignite always performs write throttling once the checkpoint buffer is two thirds full. Once the threshold is reached, checkpoint writer priority is increased, and more priority is given to checkpointing over new updates as the buffer fills more. This prevents buffer overflow while also slowing down update rate."}),"\n",(0,s.jsxs)(i.p,{children:["In most cases, write throttling is caused by a slow drive, or a high update rate, and should not be a part of normal node operation. You can track write throttling by using the ",(0,s.jsx)(i.code,{children:"storage.aipersist"})," metrics in the ",(0,s.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list",children:"Available Metrics"})," reference."]}),"\n",(0,s.jsx)(i.h2,{id:"storage-configuration",children:"Storage Configuration"}),"\n",(0,s.jsxs)(i.p,{children:["In Apache Ignite 3, all storage configuration is consolidated under ",(0,s.jsx)(i.code,{children:"ignite.storage"})," ",(0,s.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config#storage-configuration",children:"node configuration"}),". For more information on how storage is configured, see ",(0,s.jsx)(i.a,{href:"/docs/ignite3/3.0.0/administrators-guide/storage/",children:"Storage Profiles and Engines"})," documentation."]})]})}function g(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/c4101606.aca8d35b.js b/docs/ignite3/assets/js/c4101606.aca8d35b.js deleted file mode 100644 index bdf8cc8b5f..0000000000 --- a/docs/ignite3/assets/js/c4101606.aca8d35b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[270],{26366:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"administrators-guide/config/storage/volatile","title":"Volatile Storage","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/config/storage/volatile.md","sourceDirName":"administrators-guide/config/storage","slug":"/administrators-guide/config/storage/volatile","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Volatile Storage","sidebar_label":"Volatile Storage"},"sidebar":"tutorialSidebar","previous":{"title":"RocksDB Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb"},"next":{"title":"Cluster Lifecycle","permalink":"/docs/ignite3/3.0.0/administrators-guide/lifecycle"}}');var r=i(74848),o=i(28453);const a={title:"Volatile Storage",sidebar_label:"Volatile Storage"},s="Volatile Storage",l={},d=[{value:"Overview",id:"overview",level:2},{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Configuration Example",id:"configuration-example",level:2}];function c(e){const t={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"volatile-storage",children:"Volatile Storage"})}),"\n",(0,r.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(t.p,{children:"Apache Ignite Volatile storage is designed to provide a quick and responsive storage without guarantees of data persistence."}),"\n",(0,r.jsx)(t.p,{children:"When it is enabled for the data region, Apache Ignite stores all data in the data region in RAM. Data will be lost on cluster shutdown, so make sure to have a separate data region for persistent storage."}),"\n",(0,r.jsx)(t.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,r.jsx)(t.p,{children:"Each Apache Ignite storage engine can have several storage profiles. Each profile has the following properties:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Property"}),(0,r.jsx)(t.th,{children:"Default"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"engine"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"The name of the storage engine."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"name"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"The name of the storage profile."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"initSizeBytes"}),(0,r.jsx)(t.td,{children:"268435456"}),(0,r.jsx)(t.td,{children:"Initial memory region size in bytes, when the used memory size exceeds this value, new chunks of memory will be allocated."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"maxSizeBytes"}),(0,r.jsx)(t.td,{children:"268435456"}),(0,r.jsx)(t.td,{children:"Maximum memory region size in bytes."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"configuration-example",children:"Configuration Example"}),"\n",(0,r.jsxs)(t.p,{children:['In Apache Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,r.jsx)(t.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node. The example below shows how to configure one data region that uses volatile storage."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "storage" : {\r\n "profiles" : [\r\n {\r\n "engine": "aimem",\r\n "name": "default_aimem",\r\n "initSizeBytes": 268435456,\r\n "maxSizeBytes": 268435456\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(t.p,{children:["You can then use the profile (in this case, ",(0,r.jsx)(t.code,{children:"default_aimem"}),") in your distribution zone configuration."]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},28453:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>s});var n=i(96540);const r={},o=n.createContext(r);function a(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/c564e63a.0fc94840.js b/docs/ignite3/assets/js/c564e63a.0fc94840.js deleted file mode 100644 index 55803fd706..0000000000 --- a/docs/ignite3/assets/js/c564e63a.0fc94840.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6667],{28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>i});var r=t(96540);const s={},a=r.createContext(s);function l(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),r.createElement(a.Provider,{value:n},e.children)}},60816:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"api-reference/native-clients/dotnet/sql-api","title":"SQL API","description":"The SQL API executes SQL queries and scripts against Ignite tables. It supports parameterized queries, typed result mapping, metadata access, and both result set and data reader patterns for consuming query results.","source":"@site/docs/api-reference/native-clients/dotnet/sql-api.md","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/sql-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"SQL API","id":"sql-api","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Data Streamer API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api"},"next":{"title":"ADO.NET API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api"}}');var s=t(74848),a=t(28453);const l={title:"SQL API",id:"sql-api",sidebar_position:4},i="SQL API",c={},o=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Result Handling",id:"result-handling",level:3},{value:"Transaction Integration",id:"transaction-integration",level:3},{value:"Lazy Loading",id:"lazy-loading",level:3},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Basic Query Execution",id:"basic-query-execution",level:3},{value:"Typed Query Results",id:"typed-query-results",level:3},{value:"Parameterized Queries",id:"parameterized-queries",level:3},{value:"DML Operations",id:"dml-operations",level:3},{value:"DDL Operations",id:"ddl-operations",level:3},{value:"Using Data Reader",id:"using-data-reader",level:3},{value:"Batch Execution",id:"batch-execution",level:3},{value:"Script Execution",id:"script-execution",level:3},{value:"Query with Metadata",id:"query-with-metadata",level:3},{value:"Transactional Queries",id:"transactional-queries",level:3},{value:"Cancellation Support",id:"cancellation-support",level:3},{value:"Collecting Results",id:"collecting-results",level:3},{value:"Reference",id:"reference",level:2},{value:"ISql Interface",id:"isql-interface",level:3},{value:"IResultSet<T> Interface",id:"iresultsett-interface",level:3},{value:"IResultSetMetadata Interface",id:"iresultsetmetadata-interface",level:3},{value:"IColumnMetadata Interface",id:"icolumnmetadata-interface",level:3},{value:"IgniteDbDataReader Class",id:"ignitedbdatareader-class",level:3},{value:"SqlStatement Record",id:"sqlstatement-record",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"sql-api",children:"SQL API"})}),"\n",(0,s.jsx)(n.p,{children:"The SQL API executes SQL queries and scripts against Ignite tables. It supports parameterized queries, typed result mapping, metadata access, and both result set and data reader patterns for consuming query results."}),"\n",(0,s.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,s.jsx)(n.p,{children:"SQL queries in Ignite 3 execute against distributed tables using a Calcite-based SQL engine. Queries can span multiple tables and leverage distributed execution across cluster nodes."}),"\n",(0,s.jsx)(n.h3,{id:"result-handling",children:"Result Handling"}),"\n",(0,s.jsx)(n.p,{children:"Query results are available through two interfaces. IResultSet provides async enumeration with full metadata access and is suitable for LINQ operations. IgniteDbDataReader provides forward-only access compatible with ADO.NET patterns."}),"\n",(0,s.jsx)(n.h3,{id:"transaction-integration",children:"Transaction Integration"}),"\n",(0,s.jsx)(n.p,{children:"All SQL operations accept an optional transaction parameter. Pass null for auto-commit mode or pass an ITransaction to execute queries within a transaction scope. This ensures consistency across SQL and key-value operations."}),"\n",(0,s.jsx)(n.h3,{id:"lazy-loading",children:"Lazy Loading"}),"\n",(0,s.jsx)(n.p,{children:"Result sets use lazy loading. Rows are fetched from the cluster only as you enumerate them. This reduces memory usage for large result sets but means result sets can only be enumerated once."}),"\n",(0,s.jsx)(n.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,s.jsx)(n.h3,{id:"basic-query-execution",children:"Basic Query Execution"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'var sql = client.Sql;\r\n\r\n// Execute query returning untyped tuples\r\nvar statement = new SqlStatement("SELECT * FROM customers WHERE region = ?");\r\nvar resultSet = await sql.ExecuteAsync(null, statement, "West");\r\n\r\nawait foreach (var row in resultSet)\r\n{\r\n Console.WriteLine($"Customer: {row["name"]}, Email: {row["email"]}");\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"typed-query-results",children:"Typed Query Results"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'public class CustomerDto\r\n{\r\n public long Id { get; set; }\r\n public string Name { get; set; }\r\n public string Email { get; set; }\r\n}\r\n\r\nvar statement = new SqlStatement("SELECT id, name, email FROM customers WHERE region = ?");\r\nvar resultSet = await sql.ExecuteAsync(null, statement, "West");\r\n\r\nawait foreach (var customer in resultSet)\r\n{\r\n Console.WriteLine($"{customer.Name}: {customer.Email}");\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"parameterized-queries",children:"Parameterized Queries"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'// Positional parameters\r\nvar stmt = new SqlStatement(\r\n "SELECT * FROM orders WHERE customer_id = ? AND order_date > ?");\r\nvar results = await sql.ExecuteAsync(\r\n null, stmt, customerId, DateTime.UtcNow.AddDays(-30));\r\n\r\nawait foreach (var order in results)\r\n{\r\n Console.WriteLine($"Order {order["order_id"]}: ${order["amount"]}");\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"dml-operations",children:"DML Operations"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'// Insert\r\nvar insertStmt = new SqlStatement(\r\n "INSERT INTO customers (id, name, email) VALUES (?, ?, ?)");\r\nvar insertResult = await sql.ExecuteAsync(\r\n null, insertStmt, 100L, "Alice", "alice@example.com");\r\n\r\nConsole.WriteLine($"Inserted {insertResult.AffectedRows} rows");\r\n\r\n// Update\r\nvar updateStmt = new SqlStatement(\r\n "UPDATE customers SET email = ? WHERE id = ?");\r\nvar updateResult = await sql.ExecuteAsync(\r\n null, updateStmt, "alice@newdomain.com", 100L);\r\n\r\nConsole.WriteLine($"Updated {updateResult.AffectedRows} rows");\r\n\r\n// Delete\r\nvar deleteStmt = new SqlStatement("DELETE FROM customers WHERE id = ?");\r\nvar deleteResult = await sql.ExecuteAsync(null, deleteStmt, 100L);\r\n\r\nConsole.WriteLine($"Deleted {deleteResult.AffectedRows} rows");\n'})}),"\n",(0,s.jsx)(n.h3,{id:"ddl-operations",children:"DDL Operations"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'// Create table\r\nvar createStmt = new SqlStatement(@"\r\n CREATE TABLE IF NOT EXISTS products (\r\n id BIGINT PRIMARY KEY,\r\n name VARCHAR,\r\n price DECIMAL(10, 2)\r\n )");\r\n\r\nvar result = await sql.ExecuteAsync(null, createStmt);\r\nConsole.WriteLine($"Table created: {result.WasApplied}");\r\n\r\n// Drop table\r\nvar dropStmt = new SqlStatement("DROP TABLE IF EXISTS products");\r\nawait sql.ExecuteAsync(null, dropStmt);\n'})}),"\n",(0,s.jsx)(n.h3,{id:"using-data-reader",children:"Using Data Reader"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'var statement = new SqlStatement("SELECT * FROM orders WHERE amount > ?");\r\nusing var reader = await sql.ExecuteReaderAsync(null, statement, 100.0);\r\n\r\nwhile (await reader.ReadAsync())\r\n{\r\n var orderId = reader.GetInt64(0);\r\n var amount = reader.GetDecimal(3);\r\n Console.WriteLine($"Order {orderId}: ${amount}");\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"batch-execution",children:"Batch Execution"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'var statement = new SqlStatement(\r\n "INSERT INTO customers (id, name, email) VALUES (?, ?, ?)");\r\n\r\nvar argSets = new[]\r\n{\r\n new object[] { 1L, "Alice", "alice@example.com" },\r\n new object[] { 2L, "Bob", "bob@example.com" },\r\n new object[] { 3L, "Carol", "carol@example.com" }\r\n};\r\n\r\nvar affectedRows = await sql.ExecuteBatchAsync(null, statement, argSets);\r\n\r\nfor (int i = 0; i < affectedRows.Length; i++)\r\n{\r\n Console.WriteLine($"Statement {i}: {affectedRows[i]} rows affected");\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"script-execution",children:"Script Execution"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:"var script = new SqlStatement(@\"\r\n CREATE TABLE temp_data (id BIGINT PRIMARY KEY, value VARCHAR);\r\n INSERT INTO temp_data VALUES (1, 'test');\r\n INSERT INTO temp_data VALUES (2, 'data');\r\n\");\r\n\r\nawait sql.ExecuteScriptAsync(script);\r\nConsole.WriteLine(\"Script executed successfully\");\n"})}),"\n",(0,s.jsx)(n.h3,{id:"query-with-metadata",children:"Query with Metadata"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'var statement = new SqlStatement("SELECT id, name, email, created_at FROM customers");\r\nvar resultSet = await sql.ExecuteAsync(null, statement);\r\n\r\nif (resultSet.Metadata != null)\r\n{\r\n Console.WriteLine("Columns:");\r\n foreach (var column in resultSet.Metadata.Columns)\r\n {\r\n Console.WriteLine($" {column.Name}: {column.Type} " +\r\n $"(nullable: {column.Nullable}, precision: {column.Precision})");\r\n }\r\n}\r\n\r\nawait foreach (var row in resultSet)\r\n{\r\n // Process rows\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"transactional-queries",children:"Transactional Queries"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'var tx = await client.Transactions.BeginAsync();\r\ntry\r\n{\r\n // Query within transaction\r\n var selectStmt = new SqlStatement(\r\n "SELECT balance FROM accounts WHERE id = ?");\r\n var result = await sql.ExecuteAsync(tx, selectStmt, accountId);\r\n\r\n var accounts = await result.ToListAsync();\r\n var account = accounts[0];\r\n\r\n // Update within same transaction\r\n var updateStmt = new SqlStatement(\r\n "UPDATE accounts SET balance = ? WHERE id = ?");\r\n await sql.ExecuteAsync(tx, updateStmt, account.Balance - 100, accountId);\r\n\r\n await tx.CommitAsync();\r\n}\r\ncatch\r\n{\r\n await tx.RollbackAsync();\r\n throw;\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"cancellation-support",children:"Cancellation Support"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'using var cts = new CancellationTokenSource();\r\ncts.CancelAfter(TimeSpan.FromSeconds(30));\r\n\r\ntry\r\n{\r\n var statement = new SqlStatement("SELECT * FROM large_table");\r\n var resultSet = await sql.ExecuteAsync(null, statement, cts.Token);\r\n\r\n await foreach (var row in resultSet.WithCancellation(cts.Token))\r\n {\r\n // Process rows\r\n }\r\n}\r\ncatch (OperationCanceledException)\r\n{\r\n Console.WriteLine("Query cancelled");\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"collecting-results",children:"Collecting Results"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-csharp",children:'var statement = new SqlStatement("SELECT id, name FROM customers");\r\nvar resultSet = await sql.ExecuteAsync(null, statement);\r\n\r\n// Collect to list\r\nvar customers = await resultSet.ToListAsync();\r\n\r\n// Collect to dictionary\r\nvar customerMap = await resultSet.ToDictionaryAsync(\r\n c => c.Id,\r\n c => c.Name);\r\n\r\n// Custom collection\r\nvar customResult = await resultSet.CollectAsync(\r\n constructor: size => new List(size),\r\n accumulator: (list, customer) => list.Add(customer));\n'})}),"\n",(0,s.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,s.jsx)(n.h3,{id:"isql-interface",children:"ISql Interface"}),"\n",(0,s.jsx)(n.p,{children:"Query execution methods:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ExecuteAsync(ITransaction?, SqlStatement, params object?[]?)"})," - Execute query returning IResultSet"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ExecuteAsync(ITransaction?, SqlStatement, CancellationToken, params object?[]?)"})," - With cancellation token"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ExecuteAsync(ITransaction?, SqlStatement, params object?[]?)"})," - Execute query returning IResultSet"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ExecuteAsync(ITransaction?, SqlStatement, CancellationToken, params object?[]?)"})," - With cancellation token"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Data reader methods:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ExecuteReaderAsync(ITransaction?, SqlStatement, params object?[]?)"})," - Return forward-only data reader"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ExecuteReaderAsync(ITransaction?, SqlStatement, CancellationToken, params object?[]?)"})," - With cancellation token"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Batch and script methods:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ExecuteScriptAsync(SqlStatement, params object?[]?)"})," - Execute multi-statement script"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ExecuteScriptAsync(SqlStatement, CancellationToken, params object?[]?)"})," - With cancellation token"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ExecuteBatchAsync(ITransaction?, SqlStatement, IEnumerable>, CancellationToken)"})," - Execute statement with multiple argument sets (DML only)"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"iresultsett-interface",children:"IResultSet Interface"}),"\n",(0,s.jsx)(n.p,{children:"Properties:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Metadata"})," - Result set metadata (null for DML/DDL statements)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"HasRowSet"})," - True if result contains rows (SELECT queries)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"AffectedRows"})," - Number of rows affected by DML operation (0 for DDL, -1 if not applicable)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"WasApplied"})," - True if conditional DDL statement (CREATE IF NOT EXISTS) was applied"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Enumeration:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Implements ",(0,s.jsx)(n.strong,{children:"IAsyncEnumerable"})," for async iteration"]}),"\n",(0,s.jsx)(n.li,{children:"Can only be enumerated once"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Collection methods:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ToListAsync()"})," - Collect all rows into a list"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ToDictionaryAsync(Func keySelector, Func valSelector, IEqualityComparer?)"})," - Collect into dictionary"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"CollectAsync(Func constructor, Action accumulator)"})," - Custom collection logic"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Resource management:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Implements ",(0,s.jsx)(n.strong,{children:"IAsyncDisposable"})," and ",(0,s.jsx)(n.strong,{children:"IDisposable"})]}),"\n",(0,s.jsx)(n.li,{children:"Automatically disposed after enumeration completes"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"iresultsetmetadata-interface",children:"IResultSetMetadata Interface"}),"\n",(0,s.jsx)(n.p,{children:"Properties:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Columns"})," - Read-only list of column metadata in result order"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Methods:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"IndexOf(string columnName)"})," - Get column index by name (returns -1 if not found)"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"icolumnmetadata-interface",children:"IColumnMetadata Interface"}),"\n",(0,s.jsx)(n.p,{children:"Properties:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Name"})," - Column name"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Type"})," - Column data type (ColumnType enum)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Precision"})," - Column precision (-1 if not applicable)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Scale"})," - Column scale for numeric types"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Nullable"})," - Whether column allows null values"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Origin"})," - Original column information for aliased columns"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The precision meaning varies by type. For numeric types it represents decimal digits, for string types it represents maximum length."}),"\n",(0,s.jsx)(n.h3,{id:"ignitedbdatareader-class",children:"IgniteDbDataReader Class"}),"\n",(0,s.jsx)(n.p,{children:"Forward-only data reader implementing ADO.NET patterns:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Extends ",(0,s.jsx)(n.strong,{children:"DbDataReader"})," for ADO.NET compatibility"]}),"\n",(0,s.jsxs)(n.li,{children:["Supports ",(0,s.jsx)(n.strong,{children:"ReadAsync()"})," for row-by-row access"]}),"\n",(0,s.jsxs)(n.li,{children:["Provides typed ",(0,s.jsx)(n.strong,{children:"Get"}),"* methods (GetInt64, GetString, GetDecimal, etc.)"]}),"\n",(0,s.jsxs)(n.li,{children:["Supports ",(0,s.jsx)(n.strong,{children:"IsDBNull()"})," for null checking"]}),"\n",(0,s.jsxs)(n.li,{children:["Implements ",(0,s.jsx)(n.strong,{children:"IAsyncDisposable"})," for resource cleanup"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Use this when you need forward-only access or compatibility with ADO.NET-based tools."}),"\n",(0,s.jsx)(n.h3,{id:"sqlstatement-record",children:"SqlStatement Record"}),"\n",(0,s.jsx)(n.p,{children:"Represents a SQL statement with parameters:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"SqlStatement(string query)"})," - Create statement with query text"]}),"\n",(0,s.jsx)(n.li,{children:"Supports positional parameters using ? placeholders"}),"\n",(0,s.jsx)(n.li,{children:"Parameters passed separately to execute methods"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Query text should use ? for parameter placeholders. Parameters are bound in order."})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/c6f94207.a6c30d83.js b/docs/ignite3/assets/js/c6f94207.a6c30d83.js deleted file mode 100644 index df9e6103ba..0000000000 --- a/docs/ignite3/assets/js/c6f94207.a6c30d83.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4430],{20863:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>d,metadata:()=>a,toc:()=>o});const a=JSON.parse('{"id":"sql/reference/language-definition/index","title":"Language Definition","description":"SQL language definition including DDL, DML, distribution zones, transactions, and grammar.","source":"@site/docs/sql/reference/language-definition/index.mdx","sourceDirName":"sql/reference/language-definition","slug":"/sql/reference/language-definition/","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Language Definition"},"sidebar":"tutorialSidebar","previous":{"title":"SQL Reference","permalink":"/docs/ignite3/3.1.0/sql/reference/"},"next":{"title":"Data Definition Language (DDL)","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/ddl"}}');var s=i(74848),r=i(28453);const d={title:"Language Definition"},t="Language Definition",c={},o=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components},{IIcon:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"language-definition",children:"Language Definition"})}),"\n",(0,s.jsx)(n.p,{children:"SQL language definition including DDL, DML, distribution zones, transactions, and grammar."}),"\n",(0,s.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:file-document-outline",height:"24"})," DDL Commands"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Data definition language including CREATE, ALTER, and DROP statements for schema management."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./language-definition/ddl",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:database-edit-outline",height:"24"})," DML Commands"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Data manipulation language including SELECT, INSERT, UPDATE, and DELETE operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./language-definition/dml",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:view-grid-outline",height:"24"})," Distribution Zones"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Control data distribution across cluster nodes for performance optimization."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./language-definition/distribution-zones",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:swap-horizontal-circle",height:"24"})," Transactions"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Transaction control statements for ACID-compliant data operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./language-definition/transactions",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"mdi:code-tags",height:"24"})," Grammar Reference"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Complete SQL syntax with railroad diagrams showing valid statement structures."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./language-definition/grammar-reference",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"data-types-and-functions",children:"Data Types and Functions"})," - SQL types and functions"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"sql-conformance",children:"SQL Conformance"})," - Standards compliance"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"../advanced",children:"Advanced SQL"})," - Performance tuning"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>d,x:()=>t});var a=i(96540);const s={},r=a.createContext(s);function d(e){const n=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/c851e8ef.ddc8e531.js b/docs/ignite3/assets/js/c851e8ef.ddc8e531.js deleted file mode 100644 index 3f3e600cdb..0000000000 --- a/docs/ignite3/assets/js/c851e8ef.ddc8e531.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5318],{28453:(e,t,i)=>{i.d(t,{R:()=>h,x:()=>r});var n=i(96540);const s={},a=n.createContext(s);function h(e){const t=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:h(e.components),n.createElement(a.Provider,{value:t},e.children)}},63367:(e,t,i)=>{i.d(t,{A:()=>X});var n=i(96540);const s={},a=!1,h=8,r=10,d="railroad-diagram",o=!0,l="center",c=8.5,m=7;class p{constructor(e,t,i){this.children=i||[],this.tagName=e,this.attrs=k(t,{})}format(e,t,i){}addTo(e){if(e instanceof p)return e.children.push(this),this;var t=this.toSVG();return e.appendChild(t),t}toSVG(){var e=function(e,t,i){t=t||{},i=i||"";var n=document.createElementNS("http://www.w3.org/2000/svg",e);for(var s in t)"xlink:href"===s?n.setAttributeNS("http://www.w3.org/1999/xlink","href",t[s]):n.setAttribute(s,t[s]);return n.textContent=i,n}(this.tagName,this.attrs);return"string"==typeof this.children?e.textContent=this.children:this.children.forEach(function(t){e.appendChild(t.toSVG())}),e}toString(){var e="<"+this.tagName,t="g"==this.tagName||"svg"==this.tagName;for(var i in this.attrs)e+=" "+i+'="'+(this.attrs[i]+"").replace(/&/g,"&").replace(/"/g,""")+'"';return e+=">",t&&(e+="\n"),"string"==typeof this.children?e+=this.children.replace(/[*_\`\[\]<&]/g,function(e){return"&#"+e.charCodeAt(0)+";"}):this.children.forEach(function(t){e+=t}),e+="\n"}walk(e){e(this)}}class u extends p{constructor(e,t){super("path"),this.attrs.d="M"+e+" "+t}m(e,t){return this.attrs.d+="m"+e+" "+t,this}h(e){return this.attrs.d+="h"+e,this}right(e){return this.h(Math.max(0,e))}left(e){return this.h(-Math.max(0,e))}v(e){return this.attrs.d+="v"+e,this}down(e){return this.v(Math.max(0,e))}up(e){return this.v(-Math.max(0,e))}arc(e){var t,i=r,n=r;return"e"!=e[0]&&"w"!=e[1]||(i*=-1),"s"!=e[0]&&"n"!=e[1]||(n*=-1),t="ne"==e||"es"==e||"sw"==e||"wn"==e?1:0,this.attrs.d+="a"+r+" "+r+" 0 0 "+t+" "+i+" "+n,this}arc_8(e,t){const i=r,n=1/Math.sqrt(2)*i,s=i-n;let a="a "+i+" "+i+" 0 0 "+("cw"==t?"1":"0")+" ";const h=e+t;return a+=("ncw"==h?[n,s]:"necw"==h?[s,n]:"ecw"==h?[-s,n]:"secw"==h?[-n,s]:"scw"==h?[-n,-s]:"swcw"==h?[-s,-n]:"wcw"==h?[s,-n]:"nwcw"==h?[n,-s]:"nccw"==h?[-n,s]:"nwccw"==h?[-s,n]:"wccw"==h?[s,n]:"swccw"==h?[n,s]:"sccw"==h?[n,-s]:"seccw"==h?[s,-n]:"eccw"==h?[-s,-n]:"neccw"==h?[-n,-s]:null).join(" "),this.attrs.d+=a,this}l(e,t){return this.attrs.d+="l"+e+" "+t,this}format(){return this.attrs.d+="h.5",this}}class w extends p{constructor(e,t,i,n){super(e,i,n),this.items=t.map(q)}walk(e){e(this),this.items.forEach(t=>t.walk(e))}}class x extends w{constructor(...e){super("svg",e,{class:d}),this.items[0]instanceof _||this.items.unshift(new _),this.items[this.items.length-1]instanceof I||this.items.push(new I),this.up=this.down=this.height=this.width=0;for(const t of this.items)this.width+=t.width+(t.needsSpace?20:0),this.up=Math.max(this.up,t.up-this.height),this.height+=t.height,this.down=Math.max(this.down-t.height,t.down);this.formatted=!1}format(e,t,i,n){e=k(e,20),t=k(t,e,20),i=k(i,e,20);var s=n=k(n,t,20),a=e;a+=this.up;for(var h=new p("g",o?{transform:"translate(.5 .5)"}:{}),r=0;rnew x(...e);class g extends p{constructor(...e){var t=new x(...e);return t.items[0]=new _({type:"complex"}),t.items[t.items.length-1]=new I({type:"complex"}),t}}s.ComplexDiagram=(...e)=>new g(...e);class T extends w{constructor(...e){super("g",e);this.items.length;this.needsSpace=!0,this.up=this.down=this.height=this.width=0;for(var t=0;t0&&(new u(e,t).h(10).addTo(this),e+=10),a.format(e,t,a.width).addTo(this),e+=a.width,t+=a.height,a.needsSpace&&snew T(...e);class f extends w{constructor(...e){if(super("g",e),0===e.length)throw new RangeError("Stack() must have at least one child.");this.width=Math.max.apply(null,this.items.map(function(e){return e.width+(e.needsSpace?20:0)})),this.items.length>1&&(this.width+=2*r),this.needsSpace=!0,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=0;for(var t=this.items.length-1,i=0;i0&&(this.height+=Math.max(2*r,n.up+h)),i1&&(new u(e,t).h(r).addTo(this),e+=r);for(var a=0;a1?2*r:0);d.format(e,t,o).addTo(this),e+=o,t+=d.height,a!==this.items.length-1&&(new u(e,t).arc("ne").down(Math.max(0,d.down+h-2*r)).arc("es").left(o).arc("nw").down(Math.max(0,this.items[a+1].up+h-2*r)).arc("ws").addTo(this),t+=Math.max(d.down+h,2*r)+Math.max(this.items[a+1].up+h,2*r),e=s+r)}return this.items.length>1&&(new u(e,t).h(r).addTo(this),e+=r),new u(e,t).h(n[1]).addTo(this),this}}s.Stack=(...e)=>new f(...e);class E extends w{constructor(...e){if(super("g",e),0===e.length)throw new RangeError("OptionalSequence() must have at least one child.");if(1===e.length)return new T(e);var t=r;this.needsSpace=!1,this.width=0,this.up=0,this.height=U(this.items,function(e){return e.height}),this.down=this.items[0].down;for(var i=0,n=0;n0&&(this.down=Math.max(this.height+this.down,i+Math.max(2*t,s.down+h))-this.height);var d=(s.needsSpace?10:0)+s.width;this.width+=0===n?t+Math.max(d,t):2*t+Math.max(d,t)+t}a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="optseq")}format(e,t,i){var n=r,s=P(i,this.width);new u(e,t).right(s[0]).addTo(this),new u(e+s[0]+this.width,t+this.height).right(s[1]).addTo(this),e+=s[0];for(var a=t-this.up,d=this.items.length-1,o=0;onew E(...e);class j extends w{constructor(...e){if(super("g",e),1===e.length)return new T(e);if(2!==e.length)throw new RangeError("AlternatingSequence() must have one or two children.");this.needsSpace=!1;const t=r,i=h,n=Math.max,s=this.items[0],d=this.items[1],o=1/Math.sqrt(2)*t*2,l=(1-1/Math.sqrt(2))*t*2,c=Math.max(t,h),m=c-l+o,p=n(t+t,c/2+t+t,c/2+i+s.down);this.up=p+s.height+s.up;const u=n(t+t,c/2+t+t,c/2+i+d.up);this.down=u+d.height+d.down,this.height=0;const w=2*(s.needsSpace?10:0)+s.width,x=2*(d.needsSpace?10:0)+d.width;this.width=2*t+n(w,m,x)+2*t,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="altseq")}format(e,t,i){const n=r,s=P(i,this.width);new u(e,t).right(s[0]).addTo(this),e+=s[0],new u(e+this.width,t).right(s[1]).addTo(this);const a=this.items[0],d=this.items[1],o=this.up-a.up,l=this.up-a.up-a.height;new u(e,t).arc("se").up(o-2*n).arc("wn").addTo(this),a.format(e+2*n,t-o,this.width-4*n).addTo(this),new u(e+this.width-2*n,t-l).arc("ne").down(l-2*n).arc("ws").addTo(this);const c=this.down-d.down-d.height,m=this.down-d.down;new u(e,t).arc("ne").down(c-2*n).arc("ws").addTo(this),d.format(e+2*n,t+c,this.width-4*n).addTo(this),new u(e+this.width-2*n,t+m).arc("se").up(m-2*n).arc("wn").addTo(this);const p=1/Math.sqrt(2)*n*2,w=(1-1/Math.sqrt(2))*n*2,x=Math.max(n,h),g=x-w+p,T=(this.width-4*n-g)/2;return new u(e+n,t-x/2-n).arc("ws").right(T).arc_8("n","cw").l(g-p,x-w).arc_8("sw","ccw").right(T).arc("ne").addTo(this),new u(e+n,t+x/2+n).arc("wn").right(T).arc_8("s","ccw").l(g-p,-(x-w)).arc_8("nw","cw").right(T).arc("se").addTo(this),this}}s.AlternatingSequence=(...e)=>new j(...e);class b extends w{constructor(e,...t){if(super("g",t),"number"!=typeof e||e!==Math.floor(e))throw new TypeError("The first argument of Choice() must be an integer.");if(e<0||e>=t.length)throw new RangeError("The first argument of Choice() must be an index for one of the items.");this.normal=e;var i,n=t.length-1;this.width=Math.max.apply(null,this.items.map(function(e){return e.width}))+4*r,this.height=this.items[e].height,this.up=this.items[0].up;for(var s=0;s=0;o--){let i=this.items[o];o==this.normal-1&&(s=Math.max(2*r,this.items[this.normal].up+h+i.down+i.height)),new u(e,t).arc("se").up(s-2*r).arc("wn").addTo(this),i.format(e+2*r,t-s,d).addTo(this),new u(e+2*r+d,t-s+i.height).arc("ne").down(s-i.height+this.height-2*r).arc("ws").addTo(this),s+=Math.max(r,i.up+h+(0===o?0:this.items[o-1].down+this.items[o-1].height))}for(new u(e,t).right(2*r).addTo(this),this.items[this.normal].format(e+2*r,t,d).addTo(this),new u(e+2*r+d,t+this.height).right(2*r).addTo(this),o=this.normal+1;o<=a;o++){let i=this.items[o];o==this.normal+1&&(s=Math.max(2*r,this.height+this.items[this.normal].down+h+i.up)),new u(e,t).arc("ne").down(s-2*r).arc("ws").addTo(this),i.format(e+2*r,t+s,d).addTo(this),new u(e+2*r+d,t+s+i.height).arc("se").up(s-2*r+i.height-this.height).arc("wn").addTo(this),s+=Math.max(r,i.height+i.down+h+(o==a?0:this.items[o+1].up))}return this}}s.Choice=(...e)=>new b(...e);class S extends w{constructor(...e){if(super("g",e),0===e.length)throw new RangeError("HorizontalChoice() must have at least one child.");if(1===e.length)return new T(e);const t=this.items.slice(0,-1),i=this.items.slice(1,-1),n=this.items[0],s=this.items[this.items.length-1];this.needsSpace=!1,this.width=r,this.width+=2*r*(this.items.length-1),this.width+=U(this.items,e=>e.width+(e.needsSpace?20:0)),this.width+=s.height>0?r:0,this.width+=r,this.height=0,this._upperTrack=Math.max(2*r,h,B(t,e=>e.up)+h),this.up=Math.max(this._upperTrack,s.up),this._lowerTrack=Math.max(h,B(i,e=>e.height+Math.max(e.down+h,2*r)),s.height+s.down+h),n.heighte.width+(e.needsSpace?20:0))+(this.items.length-2)*r*2-r;new u(e,t).arc("se").v(-(this._upperTrack-2*r)).arc("wn").h(d).addTo(this);var o=U(h,e=>e.width+(e.needsSpace?20:0))+(this.items.length-2)*r*2+(a.height>0?r:0)-r,l=e+r+s.width+(s.needsSpace?20:0)+2*r;new u(l,t+this._lowerTrack).h(o).arc("se").v(-(this._lowerTrack-2*r)).arc("wn").addTo(this);for(const[m,p]of function*(e){var t=0;for(const i of e)yield[t,i],t++}(this.items)){0===m?(new u(e,t).h(r).addTo(this),e+=r):(new u(e,t-this._upperTrack).arc("ne").v(this._upperTrack-2*r).arc("ws").addTo(this),e+=2*r);var c=p.width+(p.needsSpace?20:0);p.format(e,t,c).addTo(this),e+=c,m===this.items.length-1?0===p.height?new u(e,t).h(r).addTo(this):new u(e,t+p.height).arc("se").addTo(this):0===m&&p.height>this._lowerTrack?p.height-this._lowerTrack>=2*r?new u(e,t+p.height).arc("se").v(this._lowerTrack-p.height+2*r).arc("wn").addTo(this):new u(e,t+p.height).l(2*r,this._lowerTrack-p.height).addTo(this):new u(e,t+p.height).arc("ne").v(this._lowerTrack-p.height-2*r).arc("ws").addTo(this)}return this}}s.HorizontalChoice=(...e)=>new S(...e);class v extends w{constructor(e,t,...i){if(super("g",i),"number"!=typeof e||e!==Math.floor(e))throw new TypeError("The first argument of MultipleChoice() must be an integer.");if(e<0||e>=i.length)throw new RangeError("The first argument of MultipleChoice() must be an index for one of the items.");if(this.normal=e,"any"!=t&&"all"!=t)throw new SyntaxError("The second argument of MultipleChoice must be 'any' or 'all'.");this.type=t,this.needsSpace=!0,this.innerWidth=B(this.items,function(e){return e.width}),this.width=30+r+this.innerWidth+r+20,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=this.items[e].height;for(var n=0;ne&&(this.down+=Math.max(t,i.up+h+this.items[n-1].down+this.items[n-1].height))}this.down-=this.items[e].height,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="multiplechoice")}format(e,t,i){var n=P(i,this.width);new u(e,t).right(n[0]).addTo(this),new u(e+n[0]+this.width,t+this.height).right(n[1]).addTo(this),e+=n[0];for(var s,a=this.items[this.normal],d=this.normal-1;d>=0;d--){var o=this.items[d];d==this.normal-1&&(s=Math.max(10+r,a.up+h+o.down+o.height)),new u(e+30,t).up(s-r).arc("wn").addTo(this),o.format(e+30+r,t-s,this.innerWidth).addTo(this),new u(e+30+r+this.innerWidth,t-s+o.height).arc("ne").down(s-o.height+this.height-r-10).addTo(this),0!==d&&(s+=Math.max(r,o.up+h+this.items[d-1].down+this.items[d-1].height))}for(new u(e+30,t).right(r).addTo(this),a.format(e+30+r,t,this.innerWidth).addTo(this),new u(e+30+r+this.innerWidth,t+this.height).right(r).addTo(this),d=this.normal+1;dnew v(...e);class A extends p{constructor(e,t){if(void 0===t)return new b(1,new R,e);if("skip"===t)return new b(0,new R,e);throw"Unknown value for Optional()'s 'skip' argument."}}s.Optional=(...e)=>new A(...e);class L extends p{constructor(e,t){super("g"),t=t||new R,this.item=q(e),this.rep=q(t),this.width=Math.max(this.item.width,this.rep.width)+2*r,this.height=this.item.height,this.up=this.item.up,this.down=Math.max(2*r,this.item.down+h+this.rep.up+this.rep.height+this.rep.down),this.needsSpace=!0,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="oneormore")}format(e,t,i){var n=P(i,this.width);new u(e,t).h(n[0]).addTo(this),new u(e+n[0]+this.width,t+this.height).h(n[1]).addTo(this),e+=n[0],new u(e,t).right(r).addTo(this),this.item.format(e+r,t,this.width-2*r).addTo(this),new u(e+this.width-r,t+this.height).right(r).addTo(this);var s=Math.max(2*r,this.item.height+this.item.down+h+this.rep.up);return new u(e+r,t).arc("nw").down(s-2*r).arc("ws").addTo(this),this.rep.format(e+r,t+s,this.width-2*r).addTo(this),new u(e+this.width-r,t+s+this.rep.height).arc("se").up(s-2*r+this.rep.height-this.item.height).arc("en").addTo(this),this}walk(e){e(this),this.item.walk(e),this.rep.walk(e)}}s.OneOrMore=(...e)=>new L(...e);class N extends p{constructor(e,t,i){return new A(new L(e,t),i)}}s.ZeroOrMore=(...e)=>new N(...e);class y extends p{constructor(e,t){super("g"),this.item=q(e),this.label=t instanceof p?t:t?new D(t):void 0,this.width=Math.max(this.item.width+(this.item.needsSpace?20:0),this.label?this.label.width:0,2*r),this.height=this.item.height,this.boxUp=this.up=Math.max(this.item.up+h,r),this.label&&(this.up+=this.label.up+this.label.height+this.label.down),this.down=Math.max(this.item.down+h,r),this.needsSpace=!0,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="group")}format(e,t,i){var n=P(i,this.width);return new u(e,t).h(n[0]).addTo(this),new u(e+n[0]+this.width,t+this.height).h(n[1]).addTo(this),e+=n[0],new p("rect",{x:e,y:t-this.boxUp,width:this.width,height:this.boxUp+this.height+this.down,rx:r,ry:r,class:"group-box"}).addTo(this),this.item.format(e,t,this.width).addTo(this),this.label&&this.label.format(e,t-(this.boxUp+this.label.down+this.label.height),this.label.width).addTo(this),this}walk(e){e(this),this.item.walk(e),this.label.walk(e)}}s.Group=(...e)=>new y(...e);class _ extends p{constructor({type:e="simple",label:t}={}){super("g"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=e,t&&(this.label=""+t,this.width=Math.max(20,this.label.length*c+10)),a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="start")}format(e,t){let i=new u(e,t-10);return"complex"===this.type?i.down(20).m(0,-10).right(this.width).addTo(this):i.down(20).m(10,-20).down(20).m(-10,-10).right(this.width).addTo(this),this.label&&new p("text",{x:e,y:t-15,style:"text-anchor:start"},this.label).addTo(this),this}}s.Start=(...e)=>new _(...e);class I extends p{constructor({type:e="simple"}={}){super("path"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=e,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="end")}format(e,t){return"complex"===this.type?this.attrs.d="M "+e+" "+t+" h 20 m 0 -10 v 20":this.attrs.d="M "+e+" "+t+" h 20 m -10 -10 v 20 m 10 -20 v 20",this}}s.End=(...e)=>new I(...e);class O extends p{constructor(e,{href:t,title:i,cls:n}={}){super("g",{class:["terminal",n].join(" ")}),this.text=""+e,this.href=t,this.title=i,this.cls=n,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="terminal")}format(e,t,i){var n=P(i,this.width);new u(e,t).h(n[0]).addTo(this),new u(e+n[0]+this.width,t).h(n[1]).addTo(this),e+=n[0],new p("rect",{x:e,y:t-11,width:this.width,height:this.up+this.down,rx:10,ry:10}).addTo(this);var s=new p("text",{x:e+this.width/2,y:t+4},this.text);return this.href?new p("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new p("title",{},[this.title]).addTo(this),this}}s.Terminal=(...e)=>new O(...e);class M extends p{constructor(e,{href:t,title:i,cls:n=""}={}){super("g",{class:["non-terminal",n].join(" ")}),this.text=""+e,this.href=t,this.title=i,this.cls=n,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="nonterminal")}format(e,t,i){var n=P(i,this.width);new u(e,t).h(n[0]).addTo(this),new u(e+n[0]+this.width,t).h(n[1]).addTo(this),e+=n[0],new p("rect",{x:e,y:t-11,width:this.width,height:this.up+this.down}).addTo(this);var s=new p("text",{x:e+this.width/2,y:t+4},this.text);return this.href?new p("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new p("title",{},[this.title]).addTo(this),this}}s.NonTerminal=(...e)=>new M(...e);class D extends p{constructor(e,{href:t,title:i,cls:n=""}={}){super("g",{class:["comment",n].join(" ")}),this.text=""+e,this.href=t,this.title=i,this.cls=n,this.width=this.text.length*m+10,this.height=0,this.up=8,this.down=8,this.needsSpace=!0,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="comment")}format(e,t,i){var n=P(i,this.width);new u(e,t).h(n[0]).addTo(this),new u(e+n[0]+this.width,t+this.height).h(n[1]).addTo(this),e+=n[0];var s=new p("text",{x:e+this.width/2,y:t+5,class:"comment"},this.text);return this.href?new p("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new p("title",{},this.title).addTo(this),this}}s.Comment=(...e)=>new D(...e);class R extends p{constructor(){super("g"),this.width=0,this.height=0,this.up=0,this.down=0,this.needsSpace=!1,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="skip")}format(e,t,i){return new u(e,t).right(i).addTo(this),this}}s.Skip=(...e)=>new R(...e);class C extends p{constructor({width:e=50,up:t=15,height:i=25,down:n=15,needsSpace:s=!0}={}){super("g"),this.width=e,this.height=i,this.up=t,this.down=n,this.needsSpace=!0,a&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="block")}format(e,t,i){var n=P(i,this.width);return new u(e,t).h(n[0]).addTo(this),new u(e+n[0]+this.width,t).h(n[1]).addTo(this),e+=n[0],new p("rect",{x:e,y:t-this.up,width:this.width,height:this.up+this.height+this.down}).addTo(this),this}}function k(...e){return e.reduce(function(e,t){return void 0!==e?e:t})}function P(e,t){var i=e-t;switch(l){case"left":return[0,i];case"right":return[i,0];default:return[i/2,i/2]}}function q(e){return e instanceof p?e:new O(""+e)}function U(e,t){return t||(t=function(e){return e}),e.map(t).reduce(function(e,t){return e+t},0)}function B(e,t){return t||(t=function(e){return e}),Math.max.apply(null,e.map(t))}s.Block=(...e)=>new C(...e);var F=i(74848);function X({children:e}){const t=(0,n.useRef)(null),i=(0,n.useRef)(null),[s,a]=(0,n.useState)(!1),h=t=>{if(t.current)try{const n=(...e)=>new x(...e),s=(...e)=>new O(...e),a=(...e)=>new M(...e),h=(...e)=>new A(...e),r=(...e)=>new T(...e),d=(...e)=>new b(...e),o=(...e)=>new R(...e),l=(...e)=>new D(...e),c=(...e)=>new L(...e),m=(...e)=>new N(...e),p=e.replace(/ComplexDiagram\(/g,"Diagram(").replace(/Start\([^)]*\),?\s*/g,"").replace(/,?\s*End\([^)]*\)/g,"").trim();try{const e=new Function("Diagram","Terminal","NonTerminal","Optional","Sequence","Choice","Skip","Comment","OneOrMore","ZeroOrMore",`'use strict'; return ${p};`)(n,s,a,h,r,d,o,l,c,m);if(!e||"function"!=typeof e.toSVG)throw new Error("Diagram function did not return a valid diagram object");t.current.innerHTML="";const i=e.toSVG();i.querySelectorAll("a[*|href]").forEach(e=>{const t=e.getAttributeNS("http://www.w3.org/1999/xlink","href");t&&e.setAttribute("href",t)}),t.current.appendChild(i)}catch(i){throw console.error("Error in diagram generation:",i),i}}catch(n){console.error("Error rendering railroad diagram:",n),t.current.innerHTML='

                                                              Error rendering diagram. Check console for details.

                                                              '}};(0,n.useEffect)(()=>{h(t)},[e]),(0,n.useEffect)(()=>{if(s){h(i);const e=e=>{"Escape"===e.key&&a(!1)};return document.addEventListener("keydown",e),document.body.style.overflow="hidden",()=>{document.removeEventListener("keydown",e),document.body.style.overflow=""}}},[s,e]);return(0,F.jsxs)(F.Fragment,{children:[(0,F.jsxs)("div",{className:"railroad-diagram-wrapper",children:[(0,F.jsx)("button",{className:"railroad-expand-button",onClick:()=>a(!0),"aria-label":"Expand diagram",title:"View full size",children:(0,F.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:(0,F.jsx)("path",{d:"M1.5 1a.5.5 0 0 0-.5.5v4a.5.5 0 0 1-1 0v-4A1.5 1.5 0 0 1 1.5 0h4a.5.5 0 0 1 0 1h-4zM10 .5a.5.5 0 0 1 .5-.5h4A1.5 1.5 0 0 1 16 1.5v4a.5.5 0 0 1-1 0v-4a.5.5 0 0 0-.5-.5h-4a.5.5 0 0 1-.5-.5zM.5 10a.5.5 0 0 1 .5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 1 0 1h-4A1.5 1.5 0 0 1 0 14.5v-4a.5.5 0 0 1 .5-.5zm15 0a.5.5 0 0 1 .5.5v4a1.5 1.5 0 0 1-1.5 1.5h-4a.5.5 0 0 1 0-1h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 1 .5-.5z"})})}),(0,F.jsx)("div",{ref:t,className:"railroad-diagram-container"})]}),s&&(0,F.jsx)("div",{className:"railroad-modal-overlay",onClick:e=>{e.target===e.currentTarget&&a(!1)},children:(0,F.jsxs)("div",{className:"railroad-modal-content",children:[(0,F.jsx)("button",{className:"railroad-modal-close",onClick:()=>a(!1),"aria-label":"Close",title:"Close (ESC)",children:"\xd7"}),(0,F.jsx)("div",{ref:i,className:"railroad-diagram-container railroad-diagram-modal"})]})})]})}},89160:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>m,frontMatter:()=>r,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"sql/reference/language-definition/ddl","title":"Data Definition Language (DDL)","description":"{/*","source":"@site/docs/sql/reference/language-definition/ddl.mdx","sourceDirName":"sql/reference/language-definition","slug":"/sql/reference/language-definition/ddl","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/ddl","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"ddl","title":"Data Definition Language (DDL)"},"sidebar":"tutorialSidebar","previous":{"title":"Language Definition","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/"},"next":{"title":"Data Manipulation Language (DML)","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/dml"}}');var s=i(74848),a=i(28453),h=i(63367);const r={id:"ddl",title:"Data Definition Language (DDL)"},d=void 0,o={},l=[{value:"CREATE TABLE",id:"create-table",level:2},{value:"ALTER TABLE",id:"alter-table",level:2},{value:"ALTER TABLE IF EXISTS table ADD COLUMN (column1 int, column2 int)",id:"alter-table-if-exists-table-add-column-column1-int-column2-int",level:3},{value:"ALTER TABLE IF EXISTS table DROP COLUMN (column1, column2 int)",id:"alter-table-if-exists-table-drop-column-column1-column2-int",level:3},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET DATA TYPE",id:"alter-table-if-exists-table-alter-column-column-set-data-type",level:3},{value:"Supported Transitions",id:"supported-transitions",level:4},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET NOT NULL",id:"alter-table-if-exists-table-alter-column-column-set-not-null",level:3},{value:"Supported Transitions",id:"supported-transitions-1",level:4},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column DROP NOT NULL",id:"alter-table-if-exists-table-alter-column-column-drop-not-null",level:3},{value:"Supported Transitions",id:"supported-transitions-2",level:4},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET DEFAULT",id:"alter-table-if-exists-table-alter-column-column-set-default",level:3},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column DROP DEFAULT",id:"alter-table-if-exists-table-alter-column-column-drop-default",level:3},{value:"DROP TABLE",id:"drop-table",level:2},{value:"CREATE INDEX",id:"create-index",level:2},{value:"DROP INDEX",id:"drop-index",level:2}];function c(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n","\n",(0,s.jsx)(t.p,{children:"This section walks you through all data definition language (DDL) commands supported by Ignite 3.0."}),"\n",(0,s.jsx)(t.h2,{id:"create-table",children:"CREATE TABLE"}),"\n",(0,s.jsx)(t.p,{children:"Creates a new table."}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:["This can also be done via the ",(0,s.jsx)(t.a,{href:"../../../develop/work-with-data/java-to-tables",children:"Java API"}),"."]})}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('CREATE'),\nTerminal('TABLE'),\nOptional(Terminal('IF NOT EXISTS')),\nNonTerminal('table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('('),\nChoice(1,\nNonTerminal('constraint', {href:'./grammar-reference#constraint'}),\nNonTerminal('column_definition', {href:'./grammar-reference#column_definition'}),\nTerminal(',')),\nTerminal(')'),\nOptional(\nSequence(\nTerminal('COLOCATE'),\nOptional('BY'),\nTerminal('('),\nNonTerminal('column_list', {href:'./grammar-reference#column_list'}),\nTerminal(')'),\n)\n),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nOptional(\nSequence(\nTerminal('ZONE'),\nNonTerminal('zone_name')\n)\n),\nOptional(\nSequence(\nTerminal('STORAGE PROFILE'),\nNonTerminal('profile_name')\n)\n)\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF NOT EXISTS"})," - create the table only if a table with the same name does not exist."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"COLOCATE BY"})," - colocation key. The key can be composite. Primary key must include colocation key."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"ZONE"})," - sets the ",(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"Distribution Zone"}),". Can be specified as a case-sensitive string or case-insensitive identifier. Does not need to exist at the moment of table creation, and can be created before writing data."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"STORAGE PROFILE"})," - sets the ",(0,s.jsx)(t.a,{href:"../../../configure-and-operate/reference/node-configuration",children:"storage profile"})," that will be used to store the table. Must be specified as a case-sensitive string."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Examples:"}),"\n",(0,s.jsx)(t.p,{children:"Creates a Person table:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int primary key,\r\n city_id int,\r\n name varchar,\r\n age int,\r\n company varchar\r\n)\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Creates a Person table that uses distribution zone ",(0,s.jsx)(t.code,{children:"MYZONE"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int primary key,\r\n city_id int,\r\n name varchar,\r\n age int,\r\n company varchar\r\n) ZONE MYZONE\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Creates a Person table that uses the ",(0,s.jsx)(t.code,{children:"default"})," storage profile regardless of the storage profile specified in the distribution zone:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int primary key,\r\n city_id int,\r\n name varchar,\r\n age int,\r\n company varchar\r\n) PRIMARY ZONE MYZONE STORAGE PROFILE 'default'\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Creates a Person table where the default value of the ",(0,s.jsx)(t.code,{children:"city_id"})," column is 1:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int primary key,\r\n city_id int default 1,\r\n name varchar,\r\n age int,\r\n company varchar\r\n)\n"})}),"\n",(0,s.jsx)(t.h2,{id:"alter-table",children:"ALTER TABLE"}),"\n",(0,s.jsx)(t.p,{children:"Modifies the structure of an existing table."}),"\n",(0,s.jsx)(t.h3,{id:"alter-table-if-exists-table-add-column-column1-int-column2-int",children:"ALTER TABLE IF EXISTS table ADD COLUMN (column1 int, column2 int)"}),"\n",(0,s.jsx)(t.p,{children:"Adds column(s) to an existing table."}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('ALTER TABLE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('ADD'),\nOptional(Terminal('COLUMN')),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nNonTerminal('column_definition_or_list', {href:'./grammar-reference#column_definition_or_list'})\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Examples:"}),"\n",(0,s.jsx)(t.p,{children:"Add a column to the table:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"ALTER TABLE Person ADD COLUMN city varchar;\n"})}),"\n",(0,s.jsx)(t.p,{children:"Add a column only if the table exists:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"ALTER TABLE IF EXISTS Person ADD number bigint;\n"})}),"\n",(0,s.jsx)(t.p,{children:"Add several columns to the table at once:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"ALTER TABLE Person ADD COLUMN (code varchar, gdp double);\n"})}),"\n",(0,s.jsx)(t.h3,{id:"alter-table-if-exists-table-drop-column-column1-column2-int",children:"ALTER TABLE IF EXISTS table DROP COLUMN (column1, column2 int)"}),"\n",(0,s.jsx)(t.p,{children:"Removes column(s) from an existing table. Once a column is removed, it cannot be accessed within queries. This command has the following limitations:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"If the column was indexed, the index has to be dropped manually in advance by using the 'DROP INDEX' command."}),"\n",(0,s.jsx)(t.li,{children:"It is not possible to remove a column if it represents the entire value stored in the cluster. The limitation is relevant for primitive values."}),"\n"]}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('ALTER TABLE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('DROP'),\nOptional(Terminal('COLUMN')),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nNonTerminal('column_list', {href:'./grammar-reference#column_list'})\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Examples:"}),"\n",(0,s.jsx)(t.p,{children:"Drop a column from the table:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"ALTER TABLE Person DROP COLUMN city;\n"})}),"\n",(0,s.jsx)(t.p,{children:"Drop a column only if the table exists:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"ALTER TABLE IF EXISTS Person DROP COLUMN number;\n"})}),"\n",(0,s.jsx)(t.p,{children:"Drop several columns from the table at once:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"ALTER TABLE Person DROP COLUMN (code, gdp);\n"})}),"\n",(0,s.jsx)(t.h3,{id:"alter-table-if-exists-table-alter-column-column-set-data-type",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET DATA TYPE"}),"\n",(0,s.jsx)(t.p,{children:"Changes the data type for the column(s) in an existing table."}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('ALTER TABLE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('ALTER COLUMN'),\nNonTerminal('column_name_or_list', {href:'./grammar-reference#column_name_or_list'}),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nTerminal('SET DATA TYPE'),\nNonTerminal('data_type'),\nOptional(Sequence(\nTerminal('('),\nChoice (0,'NULLABLE','NOT NULL'),\nTerminal(')')\n)))\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"data_type"})," - a valid ",(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/data-types-and-functions/data-types",children:"data type"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Examples:"}),"\n",(0,s.jsx)(t.p,{children:"Alter a column in the table:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"ALTER TABLE Person ALTER COLUMN city SET DATA TYPE varchar;\n"})}),"\n",(0,s.jsx)(t.h4,{id:"supported-transitions",children:"Supported Transitions"}),"\n",(0,s.jsx)(t.p,{children:"Not all data type transitions are supported. The limitations are listed below:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"FLOAT"})," can be transitioned to ",(0,s.jsx)(t.code,{children:"DOUBLE"})]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"INT8"}),", ",(0,s.jsx)(t.code,{children:"INT16"})," and ",(0,s.jsx)(t.code,{children:"INT32"})," can be transitioned to ",(0,s.jsx)(t.code,{children:"INT64"})]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"TYPE SCALE"})," change is forbidden"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"TYPE PRECISION"})," increase is allowed for DECIMAL non PK column"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"TYPE LENGTH"})," increase is allowed for STRING and BYTE_ARRAY non PK column"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Other transitions are not supported."}),"\n",(0,s.jsx)(t.p,{children:"Examples:"}),"\n",(0,s.jsx)(t.p,{children:"Changes the possible range of IDs to BIGINT ranges:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"ALTER TABLE Person ALTER COLUMN age SET DATA TYPE BIGINT\n"})}),"\n",(0,s.jsx)(t.p,{children:"Sets the length of a column text to 11:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"ALTER TABLE Person ALTER COLUMN Name SET DATA TYPE varchar(11)\n"})}),"\n",(0,s.jsx)(t.h3,{id:"alter-table-if-exists-table-alter-column-column-set-not-null",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET NOT NULL"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('ALTER TABLE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('ALTER COLUMN'),\nNonTerminal('column_name_or_list', {href:'./grammar-reference#column_name_or_list'}),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nTerminal('SET NOT NULL'),\nEnd({type:'simple'})\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,s.jsx)(t.h4,{id:"supported-transitions-1",children:"Supported Transitions"}),"\n",(0,s.jsx)(t.p,{children:"Not all data type transitions are supported. The limitations are listed below:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"NULLABLE"})," to ",(0,s.jsx)(t.code,{children:"NOT NULL"})," transition is forbidden"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"alter-table-if-exists-table-alter-column-column-drop-not-null",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column DROP NOT NULL"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('ALTER TABLE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('ALTER COLUMN'),\nNonTerminal('column_name_or_list', {href:'./grammar-reference#column_name_or_list'}),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nTerminal('DROP NOT NULL'),\nEnd({type:'simple'})\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,s.jsx)(t.h4,{id:"supported-transitions-2",children:"Supported Transitions"}),"\n",(0,s.jsx)(t.p,{children:"Not all data type transitions are supported. The limitations are listed below:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"NOT NULL"})," to ",(0,s.jsx)(t.code,{children:"NULLABLE"})," transition is allowed for any non-PK column"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"alter-table-if-exists-table-alter-column-column-set-default",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET DEFAULT"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('ALTER TABLE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('ALTER COLUMN'),\nNonTerminal('column_name_or_list', {href:'./grammar-reference#column_name_or_list'}),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nTerminal('SET DATA TYPE'),\nNonTerminal('data_type'),\nOptional(Sequence(\nChoice (0,'NULL','NOT NULL'),\n)),\nOptional(Sequence(\nTerminal('DEFAULT'),\nSequence(Choice(0,\nNonTerminal('literal_value')\n),),\n))\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"alter-table-if-exists-table-alter-column-column-drop-default",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column DROP DEFAULT"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('ALTER TABLE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nTerminal('ALTER COLUMN'),\nNonTerminal('column_name_or_list', {href:'./grammar-reference#column_name_or_list'}),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nTerminal('DROP DEFAULT'),\nEnd({type:'simple'})\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"drop-table",children:"DROP TABLE"}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"DROP TABLE"})," command drops an existing table. The table will be marked for deletion and will be removed by garbage collection after the ",(0,s.jsx)(t.a,{href:"../../../understand/core-concepts/data-partitioning#version-storage",children:"low watermark"})," point is reached. Until the data is removed, it will be available to ",(0,s.jsx)(t.a,{href:"../../../develop/work-with-data/transactions#read-only-transactions",children:"read-only transactions"})," that check the time before the table was marked for deletion."]}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:["This can also be done via the ",(0,s.jsx)(t.a,{href:"../../../develop/work-with-data/java-to-tables",children:"Java API"}),"."]})}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('DROP TABLE'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'})\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF EXISTS"})," - do not throw an error if a table with the same name does not exist."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Examples:"}),"\n",(0,s.jsx)(t.p,{children:"Drop Person table if the one exists:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:'DROP TABLE IF EXISTS "Person";\n'})}),"\n",(0,s.jsx)(t.h2,{id:"create-index",children:"CREATE INDEX"}),"\n",(0,s.jsx)(t.p,{children:"Creates a new index."}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:["This can also be done via the ",(0,s.jsx)(t.a,{href:"../../../develop/work-with-data/java-to-tables",children:"Java API"}),"."]})}),"\n",(0,s.jsx)(t.p,{children:'When you create a new index, it will start building only after all transactions started before the index creation had been completed. Index build will not start if there are any "hung" transactions in the logical topology of the cluster.'}),"\n",(0,s.jsx)(t.p,{children:'The index status, with the status reason description (e.g., PENDING - "Waiting for transaction ABC to complete") is reflected in the system view.'}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"The index cannot include the same column more than once."})}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('CREATE INDEX'),\nOptional(Terminal('IF NOT EXISTS')),\nNonTerminal('name'),\nTerminal('ON'),\nNonTerminal('qualified_table_name', {href:'./grammar-reference#qualified_table_name'}),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nSequence(\nChoice (0,\nSequence(\nTerminal('USING'),\nChoice (0,\nSequence('TREE',NonTerminal ('sorted_column_list', {href:'./grammar-reference#sorted_column_list'})),\nSequence('HASH',NonTerminal ('column_list', {href:'./grammar-reference#column_list'}))\n),\n),\nNonTerminal ('sorted_column_list', {href:'./grammar-reference#sorted_column_list'})\n)),\nEnd({type:'simple'})\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF NOT EXISTS"})," - create the index only if an index with the same name does not exist."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"name"})," - name of the index."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"ON"})," - create index on the defined table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"USING TREE"})," -if specified, creates a tree index."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"USING HASH"})," - if specified, creates a hash index."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Examples:"}),"\n",(0,s.jsxs)(t.p,{children:["Create an index ",(0,s.jsx)(t.code,{children:"department_name_idx"})," for the Person table:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"CREATE INDEX IF NOT EXISTS department_name_idx ON Person (department_id DESC, name ASC);\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Create a hash index ",(0,s.jsx)(t.code,{children:"department_name_idx"})," for the Person table:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"CREATE INDEX name_surname_idx ON Person USING HASH (name, surname);\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Create a tree index ",(0,s.jsx)(t.code,{children:"department_city_idx"})," for the Person table:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"CREATE INDEX department_city_idx ON Person USING TREE (department_id ASC, city_id DESC);\n"})}),"\n",(0,s.jsx)(t.h2,{id:"drop-index",children:"DROP INDEX"}),"\n",(0,s.jsx)(t.p,{children:"Drops an index."}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:["This can also be done via the ",(0,s.jsx)(t.a,{href:"../../../develop/work-with-data/java-to-tables",children:"Java API"}),"."]})}),"\n",(0,s.jsx)(t.p,{children:'When you drop an index, it stays in the STOPPING status until all transactions started before the DROP INDEX command had been completed (even those that do not affect any of the tables for which the index is being dropped).\r\nUpon completion of all transactions described above, the space the dropped index had occupied is freed up only when LWM of the relevant partition becomes greater than the time when the index dropping had been activated.\r\nThe index status, with the status reason description (e.g., PENDING - "Waiting for transaction ABC to complete") is reflected in the system view.'}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('DROP INDEX'),\nOptional(Terminal('IF EXISTS')),\nNonTerminal('index_name')\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"index_name"})," - the name of the index."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"IF EXISTS"})," - do not throw an error if an index with the specified name does not exist."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Examples:"}),"\n",(0,s.jsx)(t.p,{children:"Drop index if the one exists:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"DROP INDEX IF EXISTS department_name_idx;\n"})})]})}function m(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/c96ce734.26e0b28f.js b/docs/ignite3/assets/js/c96ce734.26e0b28f.js deleted file mode 100644 index 07ee6f9634..0000000000 --- a/docs/ignite3/assets/js/c96ce734.26e0b28f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7363],{11470:(e,n,r)=>{r.d(n,{A:()=>w});var s=r(96540),i=r(34164),t=r(17559),l=r(23104),o=r(56347),a=r(205),c=r(57485),d=r(31682),u=r(70679);function h(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function x(e){const{values:n,children:r}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:r,default:s}})=>({value:e,label:n,attributes:r,default:s}))}(r);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,o.W6)(),i=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(i),(0,s.useCallback)(e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})},[i,r])]}function j(e){const{defaultValue:n,queryString:r=!1,groupId:i}=e,t=x(e),[l,o]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t})),[c,d]=g({queryString:r,groupId:i}),[h,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,i]=(0,u.Dv)(n);return[r,(0,s.useCallback)(e=>{n&&i.set(e)},[n,i])]}({groupId:i}),y=(()=>{const e=c??h;return p({value:e,tabValues:t})?e:null})();(0,a.A)(()=>{y&&o(y)},[y]);return{selectedValue:l,selectValue:(0,s.useCallback)(e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),j(e)},[d,j,t]),tabValues:t}}var y=r(92303);const m={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=r(74848);function A({className:e,block:n,selectedValue:r,selectValue:s,tabValues:t}){const o=[],{blockElementScrollPositionUntilNextRender:a}=(0,l.a_)(),c=e=>{const n=e.currentTarget,i=o.indexOf(n),l=t[i].value;l!==r&&(a(n),s(l))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},e),children:t.map(({value:e,label:n,attributes:s})=>(0,b.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:d,onClick:c,...s,className:(0,i.A)("tabs__item",m.tabItem,s?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function v({lazy:e,children:n,selectedValue:r}){const t=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=t.find(e=>e.props.value===r);return e?(0,s.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:t.map((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function f(e){const n=j(e);return(0,b.jsxs)("div",{className:(0,i.A)(t.G.tabs.container,"tabs-container",m.tabList),children:[(0,b.jsx)(A,{...n,...e}),(0,b.jsx)(v,{...n,...e})]})}function w(e){const n=(0,y.A)();return(0,b.jsx)(f,{...e,children:h(e.children)},String(n))}},19365:(e,n,r)=>{r.d(n,{A:()=>l});r(96540);var s=r(34164);const i={tabItem:"tabItem_Ymn6"};var t=r(74848);function l({children:e,hidden:n,className:r}){return(0,t.jsx)("div",{role:"tabpanel",className:(0,s.A)(i.tabItem,r),hidden:n,children:e})}},28453:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>o});var s=r(96540);const i={},t=s.createContext(i);function l(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(t.Provider,{value:n},e.children)}},43205:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>x,frontMatter:()=>a,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"developers-guide/clients/linq","title":".NET LINQ Queries","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/clients/linq.md","sourceDirName":"developers-guide/clients","slug":"/developers-guide/clients/linq","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/linq","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":".NET LINQ Queries","sidebar_label":"LINQ"},"sidebar":"tutorialSidebar","previous":{"title":"ADO.NET","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/ado"},"next":{"title":"JDBC","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver"}}');var i=r(74848),t=r(28453),l=r(11470),o=r(19365);const a={title:".NET LINQ Queries",sidebar_label:"LINQ"},c=void 0,d={},u=[{value:"Getting Started With LINQ",id:"getting-started-with-linq",level:2},{value:"Using LINQ",id:"using-linq",level:2},{value:"Inspecting Generated SQL",id:"inspecting-generated-sql",level:3},{value:"Transactions",id:"transactions",level:3},{value:"Custom Query Options",id:"custom-query-options",level:3},{value:"Result Materialization",id:"result-materialization",level:3},{value:"Iteration",id:"iteration",level:4},{value:"Converting to Collections",id:"converting-to-collections",level:4},{value:"Ignite-specific IResultSet",id:"ignite-specific-iresultset",level:4},{value:"Supported LINQ Features",id:"supported-linq-features",level:2},{value:"Projection",id:"projection",level:3},{value:"Inner Joins",id:"inner-joins",level:3},{value:"Outer Joins",id:"outer-joins",level:3},{value:"Grouping",id:"grouping",level:3},{value:"Ordering",id:"ordering",level:3},{value:"Union, Intersect, Except",id:"union-intersect-except",level:3},{value:"Aggregate Functions",id:"aggregate-functions",level:3},{value:"Math Functions",id:"math-functions",level:3},{value:"String Functions",id:"string-functions",level:3},{value:"Regular Expressions",id:"regular-expressions",level:3},{value:"DML (Bulk Update and Delete)",id:"dml-bulk-update-and-delete",level:3},{value:"Composing Queries",id:"composing-queries",level:3},{value:"Column Name Mapping",id:"column-name-mapping",level:3},{value:"KeyValueView",id:"keyvalueview",level:3}];function h(e){const n={admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n","\n",(0,i.jsx)(n.p,{children:"Ignite .NET client provides LINQ support that is integrated with Ignite SQL APIs. You can avoid working with SQL syntax directly and write queries in C# with LINQ. C# LINQ expressions are then translated into Ignite-specific SQL. For example, the following two snippets achieve the same result:"}),"\n",(0,i.jsxs)(l.A,{groupId:"programming-languages",children:[(0,i.jsx)(o.A,{value:"LINQ",label:"LINQ",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var table = await Client.Tables.GetTableAsync("TBL1");\r\nIQueryable query = table!.GetRecordView().AsQueryable()\r\n .Where(x => x.Key > 3)\r\n .OrderBy(x => x.Key);\r\nList queryResults = await query.ToListAsync();\n'})})}),(0,i.jsx)(o.A,{value:"SQL",label:"SQL",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var query = "select KEY, VAL from PUBLIC.TBL1 where (KEY > ?) order by KEY asc";\r\nawait using IResultSet resultSet = await Client.Sql.\r\n ExecuteAsync(transaction: null, query, 3);\r\nvar queryResults = new List();\r\nawait foreach (IIgniteTuple row in resultSet)\r\n{\r\n queryResults.Add(new Poco { Key = (long)row[0]!, Val = (string?)row[1] });\r\n}\n'})})})]}),"\n",(0,i.jsx)(n.p,{children:"LINQ has the following advantages over SQL:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Queries are strongly typed and checked at compilation;"}),"\n",(0,i.jsx)(n.li,{children:"It is easier to write and maintain with IDE support (auto-completion, navigation, find usages);"}),"\n",(0,i.jsx)(n.li,{children:"LINQ is refactoring-friendly: rename a column and all queries are updated at once;"}),"\n",(0,i.jsx)(n.li,{children:"Ignite-specific SQL knowledge is not required, and most C# developers are already familiar with LINQ;"}),"\n",(0,i.jsx)(n.li,{children:"LINQ is safe against SQL injections;"}),"\n",(0,i.jsx)(n.li,{children:"Results are mapped to types naturally."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In real-world scenarios the performance of Ignite LINQ queries is on par with equivalent SQL queries.\r\nHowever, a small overhead still exists (due to query translation), and your mileage may vary depending on the query complexity, so it is recommended to measure the performance of your queries."}),"\n",(0,i.jsx)(n.h2,{id:"getting-started-with-linq",children:"Getting Started With LINQ"}),"\n",(0,i.jsx)(n.p,{children:"Here is how you can create a simple table in Ignite:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Create a table:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'await Client.Sql.ExecuteAsync(\r\n null, @"CREATE TABLE PUBLIC.PERSON (NAME VARCHAR PRIMARY KEY, AGE INT)");\n'})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Define the classes (or records) that represent tables:"}),"\n"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Member names should match column names (case-insensitive)."}),"\n",(0,i.jsxs)(n.li,{children:["If a column name is not a valid C# identifier, use ",(0,i.jsx)(n.code,{children:'[Column("name")]'})," attribute to specify the name."]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"public record Person(string Name, int Age, string Address, string Status);\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Obtain a table reference:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'ITable table = await Client.Tables.GetTableAsync("PERSON");\n'})}),"\n",(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsxs)(n.li,{children:["Use the ",(0,i.jsx)(n.code,{children:"GetRecordView()"})," method to get a typed view of the table:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IRecordView view = table.GetRecordView();\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.code,{children:"AsQueryable()"})," to perform LINQ queries on ",(0,i.jsx)(n.code,{children:"IRecordView"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"List names = await view.AsQueryable()\r\n .Where(x => x.Age > 30)\r\n .Select(x => x.Name)\r\n .ToListAsync();\n"})}),"\n",(0,i.jsx)(n.h2,{id:"using-linq",children:"Using LINQ"}),"\n",(0,i.jsx)(n.h3,{id:"inspecting-generated-sql",children:"Inspecting Generated SQL"}),"\n",(0,i.jsx)(n.p,{children:"Viewing generated SQL is useful for debugging and performance tuning. There are two ways to do it:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteQueryableExtensions.ToQueryString()"})," extension method:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IQueryable query = table.GetRecordView()\r\n .AsQueryable()\r\n .Where(x => x.Age > 30);\r\nstring sql = query.ToQueryString();\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Debug logging:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var cfg = new IgniteClientConfiguration\r\n{\r\n Logger = new ConsoleLogger { MinLevel = LogLevel.Debug },\r\n ...\r\n};\r\nusing var client = IgniteClient.StartAsync(cfg);\r\n...\n"})}),"\n",(0,i.jsxs)(n.p,{children:["All generated SQL will be logged with ",(0,i.jsx)(n.code,{children:"Debug"})," level to the specified logger."]}),"\n",(0,i.jsx)(n.h3,{id:"transactions",children:"Transactions"}),"\n",(0,i.jsxs)(n.p,{children:["Transaction can be passed to the LINQ provider by using the ",(0,i.jsx)(n.code,{children:"AsQueryable"})," parameter:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'await using var tx = await client.Transactions.BeginAsync();\r\nvar view = (await client.Tables.GetTableAsync("person"))!.GetRecordView();\r\npocoView.AsQueryable(tx)...;\n'})}),"\n",(0,i.jsx)(n.h3,{id:"custom-query-options",children:"Custom Query Options"}),"\n",(0,i.jsxs)(n.p,{children:["Custom query options (timeout, page size) can be specified by using the second ",(0,i.jsx)(n.code,{children:"AsQueryable"})," parameter with ",(0,i.jsx)(n.code,{children:"QueryableOptions"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var options = new QueryableOptions\r\n{\r\n PageSize = 512,\r\n Timeout = TimeSpan.FromSeconds(30)\r\n};\r\ntable.GetRecordView().AsQueryable(options: options)...;\n"})}),"\n",(0,i.jsx)(n.h3,{id:"result-materialization",children:"Result Materialization"}),"\n",(0,i.jsxs)(n.p,{children:["Materialization is the process of converting query results (",(0,i.jsx)(n.code,{children:"IQueryable"}),") into an object or a collection of objects."]}),"\n",(0,i.jsx)(n.p,{children:"LINQ is lazy. Nothing happens (no network calls, no SQL translation) until the query is materialized.\r\nFor example, the following code only constructs an expression, but does not execute anything:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IQueryable query = table!.GetRecordView().AsQueryable()\r\n .Where(x => x.Key > 3)\r\n .OrderBy(x => x.Key);\n"})}),"\n",(0,i.jsx)(n.p,{children:"Query execution and materialization can be triggered in multiple ways:"}),"\n",(0,i.jsx)(n.h4,{id:"iteration",children:"Iteration"}),"\n",(0,i.jsxs)(n.p,{children:["You can iterate through query results by using ",(0,i.jsx)(n.code,{children:"foreach"})," statement, or asynchronously by using the ",(0,i.jsx)(n.code,{children:"AsAsyncEnumerable"})," method:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"foreach (var person in query) { ... }\r\nawait foreach (var person in query.AsAsyncEnumerable()) { ... }\n"})}),"\n",(0,i.jsx)(n.h4,{id:"converting-to-collections",children:"Converting to Collections"}),"\n",(0,i.jsxs)(n.p,{children:["You can convert queries to collections by using the ",(0,i.jsx)(n.code,{children:"ToList"})," and ",(0,i.jsx)(n.code,{children:"ToDictionary"})," methods, or ",(0,i.jsx)(n.code,{children:"ToListAsync"})," and ",(0,i.jsx)(n.code,{children:"ToDictionaryAsync"})," methods to do it asynchronously:"]}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"Synchronous",label:"Synchronous",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"List list = query.ToList();\r\nDictionary dict = query.ToDictionary(x => x.Name, x => x.Age);\n"})})}),(0,i.jsx)(o.A,{value:"Asynchronous",label:"Asynchronous",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"List list = await query.ToListAsync();\r\nDictionary dict = await query.\r\n ToDictionaryAsync(x => x.Name, x => x.Age);\n"})})})]}),"\n",(0,i.jsx)(n.h4,{id:"ignite-specific-iresultset",children:"Ignite-specific IResultSet"}),"\n",(0,i.jsxs)(n.p,{children:["Underlying ",(0,i.jsx)(n.code,{children:"IResultSet"})," can be obtained by using the ",(0,i.jsx)(n.code,{children:"IgniteQueryableExtensions.ToResultSetAsync()"})," extension method:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"await using IResultSet resultSet = await query.ToResultSetAsync();\r\nConsole.WriteLine(resultSet.Metadata);\r\nvar rows = resultSet.CollectAsync(...);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Obtaining ",(0,i.jsx)(n.code,{children:"IResultSet"})," can be useful for access to metadata and ",(0,i.jsx)(n.code,{children:"CollectAsync"})," method, which provides more control over result materialization."]}),"\n",(0,i.jsx)(n.h2,{id:"supported-linq-features",children:"Supported LINQ Features"}),"\n",(0,i.jsx)(n.h3,{id:"projection",children:"Projection"}),"\n",(0,i.jsx)(n.p,{children:"Projection is the process of converting query results into a different type.\r\nAmong other things, projections are used to select a subset of columns."}),"\n",(0,i.jsxs)(n.p,{children:["For example, ",(0,i.jsx)(n.code,{children:"Person"})," table may have many columns, but we only need ",(0,i.jsx)(n.code,{children:"Name"})," and ",(0,i.jsx)(n.code,{children:"Age"}),"."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"First, create a projection class:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"public record PersonInfo(string Name, int Age);\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Then, use ",(0,i.jsx)(n.code,{children:"Select"})," to project query results:"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"List result = query\r\n .Select(x => new PersonInfo(x.Name, x.Age))\r\n .ToList();\n"})}),"\n",(0,i.jsx)(n.p,{children:"Resulting SQL will select only those two columns, avoiding overfetching\r\n(a common issue that happens when ORM-generated query includes all table columns, but only a few of them are needed by the business logic)."}),"\n",(0,i.jsx)(n.p,{children:"Ignite also supports anonymous type projections:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var result = query.Select(x => new { x.Name, x.Age }).ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"inner-joins",children:"Inner Joins"}),"\n",(0,i.jsxs)(n.p,{children:["Use the standard ",(0,i.jsx)(n.code,{children:"Join"})," method to perform joins on other tables:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var customerQuery = customerTable.GetRecordView().AsQueryable();\r\nvar orderQuery = orderTable.GetRecordView().AsQueryable();\r\nvar ordersByCustomer = customerQuery\r\n .Join(orderQuery,\r\n cust => cust.Id,\r\n order => order.CustId,\r\n (cust, order) => new { cust.Name, order.Amount })\r\n .ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"outer-joins",children:"Outer Joins"}),"\n",(0,i.jsxs)(n.p,{children:["Outer joins are supported through the ",(0,i.jsx)(n.code,{children:"DefaultIfEmpty"})," method.\r\nFor example, not every book in a library is borrowed by a student, so a left outer join is used to retrieve all books and their current borrowers (if any):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var bookQuery = bookTable.GetRecordView().AsQueryable();\r\nvar studentQuery = studentTable.GetRecordView().AsQueryable();\r\nvar booksWithStudents = bookQuery\r\n .Join(studentQuery.DefaultIfEmpty(),\r\n book => book.StudentId,\r\n student => student.Id,\r\n (book, student) => new { book.Title, student.Name })\r\n .ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"grouping",children:"Grouping"}),"\n",(0,i.jsxs)(n.p,{children:["Grouping is supported through ",(0,i.jsx)(n.code,{children:"GroupBy"})," method. This is equivalent to SQL GROUP BY operator. You can get both single and multiple columns in your queries. When working with multiple columns, use anonymous type:"]}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"Single Column",label:"Single Column",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var bookCountByAuthor = bookTable.GetRecordView().AsQueryable()\r\n .GroupBy(book => book.Author)\r\n .Select(grp => new { Author = grp.Key, Count = grp.Count() })\r\n .ToList();\n"})})}),(0,i.jsx)(o.A,{value:"Multiple Columns",label:"Multiple Columns",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var bookCountByAuthorAndYear = bookTable.GetRecordView().AsQueryable()\r\n .GroupBy(book => new { book.Author, book.Year })\r\n .Select(grp => new { Author = grp.Key.Author,\r\n Year = grp.Key.Year,\r\n Count = grp.Count() })\r\n .ToList();\n"})})})]}),"\n",(0,i.jsxs)(n.p,{children:["Aggregate functions ",(0,i.jsx)(n.code,{children:"Count"}),", ",(0,i.jsx)(n.code,{children:"Sum"}),", ",(0,i.jsx)(n.code,{children:"Min"}),", ",(0,i.jsx)(n.code,{children:"Max"}),", ",(0,i.jsx)(n.code,{children:"Average"})," can be used with groupings."]}),"\n",(0,i.jsx)(n.h3,{id:"ordering",children:"Ordering"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"OrderBy"}),", ",(0,i.jsx)(n.code,{children:"OrderByDescending"}),", ",(0,i.jsx)(n.code,{children:"ThenBy"}),", ",(0,i.jsx)(n.code,{children:"ThenByDescending"})," are supported. You can combine them to order by multiple columns:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var booksOrderedByAuthorAndYear = bookTable.GetRecordView().AsQueryable()\r\n .OrderBy(book => book.Author)\r\n .ThenByDescending(book => book.Year)\r\n .ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"union-intersect-except",children:"Union, Intersect, Except"}),"\n",(0,i.jsxs)(n.p,{children:["Multiple result sets can be combined by using the ",(0,i.jsx)(n.code,{children:"Union"}),", ",(0,i.jsx)(n.code,{children:"Intersect"}),", ",(0,i.jsx)(n.code,{children:"Except"})," methods. For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IQueryable employeeEmails = employeeTable\r\n .GetRecordView().AsQueryable()\r\n .Select(x => x.Email);\r\n\r\nIQueryable customerEmails = customerTable\r\n .GetRecordView().AsQueryable()\r\n .Select(x => x.Email);\r\n\r\nList allEmails = employeeEmails.Union(customerEmails)\r\n .OrderBy(x => x)\r\n .ToList();\r\n\r\nList employeesThatAreCustomers = employeeEmails\r\n .Intersect(customerEmails).ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"aggregate-functions",children:"Aggregate Functions"}),"\n",(0,i.jsx)(n.p,{children:"Below is a list of .NET aggregate functions and their SQL equivalents that are supported in Ignite:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"LINQ synchronous method"}),(0,i.jsx)(n.th,{children:"LINQ asynchronous method"}),(0,i.jsx)(n.th,{children:"SQL Operator"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"First"}),(0,i.jsx)(n.td,{children:"FirstAsync"}),(0,i.jsx)(n.td,{children:"FIRST"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"FirstOrDefault"}),(0,i.jsx)(n.td,{children:"FirstOrDefaultAsync"}),(0,i.jsx)(n.td,{children:"FIRST ... LIMIT 1"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Single"}),(0,i.jsx)(n.td,{children:"SingleAsync"}),(0,i.jsx)(n.td,{children:"FIRST"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"SingleOrDefault"}),(0,i.jsx)(n.td,{children:"SingleOrDefaultAsync"}),(0,i.jsx)(n.td,{children:"FIRST ... LIMIT 2"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Max"}),(0,i.jsx)(n.td,{children:"MaxAsync"}),(0,i.jsx)(n.td,{children:"MAX"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Min"}),(0,i.jsx)(n.td,{children:"MinAsync"}),(0,i.jsx)(n.td,{children:"MIN"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Average"}),(0,i.jsx)(n.td,{children:"AverageAsync"}),(0,i.jsx)(n.td,{children:"AVG"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Sum"}),(0,i.jsx)(n.td,{children:"SumAsync"}),(0,i.jsx)(n.td,{children:"SUM"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Count"}),(0,i.jsx)(n.td,{children:"CountAsync"}),(0,i.jsx)(n.td,{children:"COUNT"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"LongCount"}),(0,i.jsx)(n.td,{children:"LongCountAsync"}),(0,i.jsx)(n.td,{children:"COUNT"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Any"}),(0,i.jsx)(n.td,{children:"AnyAsync"}),(0,i.jsx)(n.td,{children:"ANY"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"All"}),(0,i.jsx)(n.td,{children:"AllAsync"}),(0,i.jsx)(n.td,{children:"ALL"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"Here are examples of how you can use these methods:"}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"Synchronous",label:"Synchronous",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"Person first = query.First();\r\nPerson? firstOrDefault = query.FirstOrDefault();\r\nPerson single = query.Single();\r\nPerson? singleOrDefault = query.SingleOrDefault();\r\nint maxAge = query.Max(x => x.Age);\r\nint minAge = query.Min(x => x.Age);\r\nint avgAge = query.Average(x => x.Age);\r\nint sumAge = query.Sum(x => x.Age);\r\nint count = query.Count();\r\nlong longCount = query.LongCount();\r\nbool any = query.Any(x => x.Age > 30);\r\nbool all = query.All(x => x.Age > 30);\n"})})}),(0,i.jsx)(o.A,{value:"Asynchronous",label:"Asynchronous",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"Person first = await query.FirstAsync();\r\nPerson? firstOrDefault = await query.FirstOrDefaultAsync();\r\nPerson single = await query.SingleAsync();\r\nPerson? singleOrDefault = await query.SingleOrDefaultAsync();\r\nint maxAge = await query.MaxAsync(x => x.Age);\r\nint minAge = await query.MinAsync(x => x.Age);\r\nint avgAge = await query.AverageAsync(x => x.Age);\r\nint sumAge = await query.SumAsync(x => x.Age);\r\nint count = await query.CountAsync();\r\nlong longCount = await query.LongCountAsync();\r\nbool any = await query.AnyAsync(x => x.Age > 30);\r\nbool all = await query.AllAsync(x => x.Age > 30);\n"})})})]}),"\n",(0,i.jsx)(n.h3,{id:"math-functions",children:"Math Functions"}),"\n",(0,i.jsxs)(n.p,{children:["The following ",(0,i.jsx)(n.code,{children:"Math"})," functions are supported (will be translated to SQL equivalents):\r\n",(0,i.jsx)(n.code,{children:"Abs"}),", ",(0,i.jsx)(n.code,{children:"Cos"}),", ",(0,i.jsx)(n.code,{children:"Cosh"}),", ",(0,i.jsx)(n.code,{children:"Acos"}),", ",(0,i.jsx)(n.code,{children:"Sin"}),", ",(0,i.jsx)(n.code,{children:"Sinh"}),", ",(0,i.jsx)(n.code,{children:"Asin"}),", ",(0,i.jsx)(n.code,{children:"Tan"}),", ",(0,i.jsx)(n.code,{children:"Tanh"}),", ",(0,i.jsx)(n.code,{children:"Atan"}),", ",(0,i.jsx)(n.code,{children:"Ceiling"}),", ",(0,i.jsx)(n.code,{children:"Floor"}),",\r\n",(0,i.jsx)(n.code,{children:"Exp"}),", ",(0,i.jsx)(n.code,{children:"Log"}),", ",(0,i.jsx)(n.code,{children:"Log10"}),", ",(0,i.jsx)(n.code,{children:"Pow"}),", ",(0,i.jsx)(n.code,{children:"Round"}),", ",(0,i.jsx)(n.code,{children:"Sign"}),", ",(0,i.jsx)(n.code,{children:"Sqrt"}),", ",(0,i.jsx)(n.code,{children:"Truncate"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The following ",(0,i.jsx)(n.code,{children:"Math"})," functions are NOT supported (no equivalent in Ignite SQL engine):\r\n",(0,i.jsx)(n.code,{children:"Acosh"}),", ",(0,i.jsx)(n.code,{children:"Asinh"}),", ",(0,i.jsx)(n.code,{children:"Atanh"}),", ",(0,i.jsx)(n.code,{children:"Atan2"}),", ",(0,i.jsx)(n.code,{children:"Log2"}),", ",(0,i.jsx)(n.code,{children:"Log(x, y)"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Here is the example of how you can use math functions:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var triangles = table.GetRecordView().AsQueryable()\r\n .Select(t => new {\r\n Hypotenuse,\r\n Opposite = t.Hypotenuse * Math.Sin(t.Angle),\r\n Adjacent = t.Hypotenuse * Math.Cos(t.Angle)\r\n })\r\n .ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"string-functions",children:"String Functions"}),"\n",(0,i.jsxs)(n.p,{children:["The following string functions are supported: ",(0,i.jsx)(n.code,{children:"string.Compare(string)"}),", ",(0,i.jsx)(n.code,{children:"string.Compare(string, bool ignoreCase)"}),", concatenation ",(0,i.jsx)(n.code,{children:"s1 + s2 + s3"}),", ",(0,i.jsx)(n.code,{children:"ToUpper"}),", ",(0,i.jsx)(n.code,{children:"ToLower"}),",\r\n",(0,i.jsx)(n.code,{children:"Substring(start)"}),", ",(0,i.jsx)(n.code,{children:"Substring(start, len)"}),",\r\n",(0,i.jsx)(n.code,{children:"Trim"}),", ",(0,i.jsx)(n.code,{children:"Trim(char)"}),", ",(0,i.jsx)(n.code,{children:"TrimStart"}),", ",(0,i.jsx)(n.code,{children:"TrimStart(char)"}),", ",(0,i.jsx)(n.code,{children:"TrimEnd"}),", ",(0,i.jsx)(n.code,{children:"TrimEnd(char)"}),",\r\n",(0,i.jsx)(n.code,{children:"Contains"}),", ",(0,i.jsx)(n.code,{children:"StartsWith"}),", ",(0,i.jsx)(n.code,{children:"EndsWith"}),", ",(0,i.jsx)(n.code,{children:"IndexOf"}),", ",(0,i.jsx)(n.code,{children:"Length"}),", ",(0,i.jsx)(n.code,{children:"Replace"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Here is the example of how you can use string functions:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'List fullNames = table.GetRecordView().AsQueryable()\r\n .Where(p => p.FirstName.StartsWith("Jo"))\r\n .Select(p => new {\r\n FullName = p.FirstName.ToUpper() +\r\n " " +\r\n p.LastName.ToLower() })\r\n .ToList();\n'})}),"\n",(0,i.jsx)(n.h3,{id:"regular-expressions",children:"Regular Expressions"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Regex.Replace"})," is translated to ",(0,i.jsx)(n.code,{children:"regexp_replace"})," function. Here is how you can use regular expressions in your code:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'List addresses = table.GetRecordView().AsQueryable()\r\n .Select(p => new { Address = Regex.Replace(p.Address, @"(\\d+)", "[$1]")\r\n .ToList();\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Regular expression engine within SQL may behave differently from .NET engine."})}),"\n",(0,i.jsx)(n.h3,{id:"dml-bulk-update-and-delete",children:"DML (Bulk Update and Delete)"}),"\n",(0,i.jsxs)(n.p,{children:["Bulk update and delete with optional conditions are supported through ",(0,i.jsx)(n.code,{children:"ExecuteUpdateAsync"})," and ",(0,i.jsx)(n.code,{children:"ExecuteDeleteAsync"})," extensions methods on ",(0,i.jsx)(n.code,{children:"IQueryable"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var orders = orderTable.GetRecordView().AsQueryable();\r\nawait orders.Where(x => x.Amount == 0).ExecuteDeleteAsync();\n"})}),"\n",(0,i.jsx)(n.p,{children:"Update statement can set properties to constant values or to an expression based on other properties of the same row:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var orders = orderTable.GetRecordView().AsQueryable();\r\nawait orders\r\n .Where(x => x.CustomerId == customerId)\r\n .ExecuteUpdateAsync(\r\n order => order.SetProperty(x => x.Discount, 0.1m)\r\n .SetProperty(x => x.Note, x => x.Note +\r\n " Happy birthday, " +\r\n x.CustomerName));\n'})}),"\n",(0,i.jsx)(n.p,{children:"Resulting SQL:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"update PUBLIC.tbl1 as _T0\r\nset NOTE = concat(concat(_T0.NOTE, ?), _T0.CUSTOMERNAME), DISCOUNT = ?\r\nwhere (_T0.CUSTOMERID IS NOT DISTINCT FROM ?)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"composing-queries",children:"Composing Queries"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"IQueryable"})," expressions can be composed dynamically. A common use case is to compose a query based on user input.\r\nFor example, optional filters on different columns can be applied to a query:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"public List GetBooks(string? author, int? year)\r\n{\r\n IQueryable query = bookTable.GetRecordView().AsQueryable();\r\n if (!string.IsNullOrEmpty(author))\r\n query = query.Where(x => x.Author == author);\r\n\r\n if (year != null)\r\n query = query.Where(x => x.Year == year);\r\n return query.ToList();\r\n}\n"})}),"\n",(0,i.jsx)(n.h3,{id:"column-name-mapping",children:"Column Name Mapping"}),"\n",(0,i.jsxs)(n.p,{children:["Unless custom mapping is provided with ",(0,i.jsx)(n.code,{children:"[Column]"}),", LINQ provider will use property or field names as column names,\r\nusing unquoted identifiers, which are case-insensitive."]}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"C#",label:"C#",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"bookTable.GetRecordView().AsQueryable().Select(x => x.Author).ToList();\n"})})}),(0,i.jsx)(o.A,{value:"Resulting SQL",label:"Resulting SQL",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"select _T0.AUTHOR from PUBLIC.books as _T0\n"})})})]}),"\n",(0,i.jsxs)(n.p,{children:["To use quoted identifiers, or to map column names to different property names, use ",(0,i.jsx)(n.code,{children:"[Column]"})," attribute:"]}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"C#",label:"C#",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'public class Book\r\n{\r\n [Column("book_author")]\r\n public string Author { get; set; }\r\n}\r\n// Or a record:\r\npublic record Book([property: Column("book_author")] string Author);\n'})})}),(0,i.jsx)(o.A,{value:"Resulting SQL",label:"Resulting SQL",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:'SELECT _T0."book_author" FROM PUBLIC.books AS _T0\n'})})})]}),"\n",(0,i.jsx)(n.h3,{id:"keyvalueview",children:"KeyValueView"}),"\n",(0,i.jsxs)(n.p,{children:["All examples above use ",(0,i.jsx)(n.code,{children:"IRecordView"})," to perform queries; LINQ provider supports ",(0,i.jsx)(n.code,{children:"IKeyValueView"})," equally well:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IQueryable> query =\r\n bookTable.GetKeyValueView().AsQueryable();\r\nList books = query\r\n .Where(x => x.Key > 10)\r\n .Select(x => x.Value)\r\n .ToList();\n"})})]})}function x(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/c9838793.52a208ba.js b/docs/ignite3/assets/js/c9838793.52a208ba.js deleted file mode 100644 index 0a01d10656..0000000000 --- a/docs/ignite3/assets/js/c9838793.52a208ba.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8943],{28453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>r});var s=i(96540);const t={},l=s.createContext(t);function a(e){const n=s.useContext(l);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(l.Provider,{value:n},e.children)}},94323:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"sql-reference/ddl","title":"Data Definition Language (DDL)","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-reference/ddl.md","sourceDirName":"sql-reference","slug":"/sql-reference/ddl","permalink":"/docs/ignite3/3.0.0/sql-reference/ddl","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Data Definition Language (DDL)","sidebar_label":"DDL"},"sidebar":"tutorialSidebar","previous":{"title":"Errors and Solutions","permalink":"/docs/ignite3/3.0.0/administrators-guide/handling-exceptions"},"next":{"title":"DDL","permalink":"/docs/ignite3/3.0.0/sql-reference/ddl"}}');var t=i(74848),l=i(28453);const a={title:"Data Definition Language (DDL)",sidebar_label:"DDL"},r=void 0,d={},o=[{value:"CREATE TABLE",id:"create-table",level:2},{value:"ALTER TABLE",id:"alter-table",level:2},{value:"ALTER TABLE IF EXISTS table ADD COLUMN (column1 int, column2 int)",id:"alter-table-if-exists-table-add-column-column1-int-column2-int",level:3},{value:"ALTER TABLE IF EXISTS table DROP COLUMN (column1, column2 int)",id:"alter-table-if-exists-table-drop-column-column1-column2-int",level:3},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET DATA TYPE",id:"alter-table-if-exists-table-alter-column-column-set-data-type",level:3},{value:"Supported Transitions",id:"supported-transitions",level:4},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET NOT NULL",id:"alter-table-if-exists-table-alter-column-column-set-not-null",level:3},{value:"Supported Transitions",id:"supported-transitions-1",level:4},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column DROP NOT NULL",id:"alter-table-if-exists-table-alter-column-column-drop-not-null",level:3},{value:"Supported Transitions",id:"supported-transitions-2",level:4},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET DEFAULT",id:"alter-table-if-exists-table-alter-column-column-set-default",level:3},{value:"ALTER TABLE IF EXISTS table ALTER COLUMN column DROP DEFAULT",id:"alter-table-if-exists-table-alter-column-column-drop-default",level:3},{value:"DROP TABLE",id:"drop-table",level:2},{value:"CREATE INDEX",id:"create-index",level:2},{value:"DROP INDEX",id:"drop-index",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:["\n",(0,t.jsx)(n.p,{children:"This section walks you through all data definition language (DDL) commands supported by Ignite 3.0."}),"\n",(0,t.jsx)(n.h2,{id:"create-table",children:"CREATE TABLE"}),"\n",(0,t.jsx)(n.p,{children:"Creates a new table."}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["This can also be done via the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/java-to-tables",children:"Java API"}),"."]})}),"\n","\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF NOT EXISTS"})," - create the table only if a table with the same name does not exist."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"COLOCATE BY"})," - colocation key. The key can be composite. Primary key must include colocation key."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ZONE"})," - sets the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"Distribution Zone"}),". Can be specified as a case-sensitive string or case-insensitive identifier. Does not need to exist at the moment of table creation, and can be created before writing data."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"STORAGE PROFILE"})," - sets the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config#storage-configuration",children:"storage profile"})," that will be used to store the table. Must be specified as a case-sensitive string."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples:"}),"\n",(0,t.jsx)(n.p,{children:"Creates a Person table:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int primary key,\r\n city_id int,\r\n name varchar,\r\n age int,\r\n company varchar\r\n)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a Person table that uses distribution zone ",(0,t.jsx)(n.code,{children:"MYZONE"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int primary key,\r\n city_id int,\r\n name varchar,\r\n age int,\r\n company varchar\r\n) ZONE MYZONE\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a Person table that uses the ",(0,t.jsx)(n.code,{children:"default"})," storage profile regardless of the storage profile specified in the distribution zone:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int primary key,\r\n city_id int,\r\n name varchar,\r\n age int,\r\n company varchar\r\n) PRIMARY ZONE MYZONE STORAGE PROFILE 'default'\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Creates a Person table where the default value of the ",(0,t.jsx)(n.code,{children:"city_id"})," column is 1:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int primary key,\r\n city_id int default 1,\r\n name varchar,\r\n age int,\r\n company varchar\r\n)\n"})}),"\n",(0,t.jsx)(n.h2,{id:"alter-table",children:"ALTER TABLE"}),"\n",(0,t.jsx)(n.p,{children:"Modifies the structure of an existing table."}),"\n",(0,t.jsx)(n.h3,{id:"alter-table-if-exists-table-add-column-column1-int-column2-int",children:"ALTER TABLE IF EXISTS table ADD COLUMN (column1 int, column2 int)"}),"\n",(0,t.jsx)(n.p,{children:"Adds column(s) to an existing table."}),"\n","\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples:"}),"\n",(0,t.jsx)(n.p,{children:"Add a column to the table:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER TABLE Person ADD COLUMN city varchar;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Add a column only if the table exists:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER TABLE IF EXISTS Person ADD number bigint;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Add several columns to the table at once:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER TABLE Person ADD COLUMN (code varchar, gdp double);\n"})}),"\n",(0,t.jsx)(n.h3,{id:"alter-table-if-exists-table-drop-column-column1-column2-int",children:"ALTER TABLE IF EXISTS table DROP COLUMN (column1, column2 int)"}),"\n",(0,t.jsx)(n.p,{children:"Removes column(s) from an existing table. Once a column is removed, it cannot be accessed within queries. This command has the following limitations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"If the column was indexed, the index has to be dropped manually in advance by using the 'DROP INDEX' command."}),"\n",(0,t.jsx)(n.li,{children:"It is not possible to remove a column if it represents the entire value stored in the cluster. The limitation is relevant for primitive values."}),"\n"]}),"\n","\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples:"}),"\n",(0,t.jsx)(n.p,{children:"Drop a column from the table:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER TABLE Person DROP COLUMN city;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Drop a column only if the table exists:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER TABLE IF EXISTS Person DROP COLUMN number;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Drop several columns from the table at once:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER TABLE Person DROP COLUMN (code, gdp);\n"})}),"\n",(0,t.jsx)(n.h3,{id:"alter-table-if-exists-table-alter-column-column-set-data-type",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET DATA TYPE"}),"\n",(0,t.jsx)(n.p,{children:"Changes the data type for the column(s) in an existing table."}),"\n","\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"data_type"})," - a valid ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/data-types",children:"data type"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples:"}),"\n",(0,t.jsx)(n.p,{children:"Alter a column in the table:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER TABLE Person ALTER COLUMN city SET DATA TYPE varchar;\n"})}),"\n",(0,t.jsx)(n.h4,{id:"supported-transitions",children:"Supported Transitions"}),"\n",(0,t.jsx)(n.p,{children:"Not all data type transitions are supported. The limitations are listed below:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"FLOAT"})," can be transitioned to ",(0,t.jsx)(n.code,{children:"DOUBLE"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"INT8"}),", ",(0,t.jsx)(n.code,{children:"INT16"})," and ",(0,t.jsx)(n.code,{children:"INT32"})," can be transitioned to ",(0,t.jsx)(n.code,{children:"INT64"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"TYPE SCALE"})," change is forbidden"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"TYPE PRECISION"})," increase is allowed for DECIMAL non PK column"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"TYPE LENGTH"})," increase is allowed for STRING and BYTE_ARRAY non PK column"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Other transitions are not supported."}),"\n",(0,t.jsx)(n.p,{children:"Examples:"}),"\n",(0,t.jsx)(n.p,{children:"Changes the possible range of IDs to BIGINT ranges:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER TABLE Person ALTER COLUMN age SET DATA TYPE BIGINT\n"})}),"\n",(0,t.jsx)(n.p,{children:"Sets the length of a column text to 11:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER TABLE Person ALTER COLUMN Name SET DATA TYPE varchar(11)\n"})}),"\n",(0,t.jsx)(n.h3,{id:"alter-table-if-exists-table-alter-column-column-set-not-null",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET NOT NULL"}),"\n","\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"supported-transitions-1",children:"Supported Transitions"}),"\n",(0,t.jsx)(n.p,{children:"Not all data type transitions are supported. The limitations are listed below:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"NULLABLE"})," to ",(0,t.jsx)(n.code,{children:"NOT NULL"})," transition is forbidden"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"alter-table-if-exists-table-alter-column-column-drop-not-null",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column DROP NOT NULL"}),"\n","\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"supported-transitions-2",children:"Supported Transitions"}),"\n",(0,t.jsx)(n.p,{children:"Not all data type transitions are supported. The limitations are listed below:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"NOT NULL"})," to ",(0,t.jsx)(n.code,{children:"NULLABLE"})," transition is allowed for any non-PK column"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"alter-table-if-exists-table-alter-column-column-set-default",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column SET DEFAULT"}),"\n","\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"alter-table-if-exists-table-alter-column-column-drop-default",children:"ALTER TABLE IF EXISTS table ALTER COLUMN column DROP DEFAULT"}),"\n","\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a table with the specified table name does not exist."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"drop-table",children:"DROP TABLE"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"DROP TABLE"})," command drops an existing table. The table will be marked for deletion and will be removed by garbage collection after the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions#version-storage",children:"low watermark"})," point is reached. Until the data is removed, it will be available to ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/transactions#read-only-transactions",children:"read-only transactions"})," that check the time before the table was marked for deletion."]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["This can also be done via the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/java-to-tables",children:"Java API"}),"."]})}),"\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a table with the same name does not exist."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples:"}),"\n",(0,t.jsx)(n.p,{children:"Drop Person table if the one exists:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:'DROP TABLE IF EXISTS "Person";\n'})}),"\n",(0,t.jsx)(n.h2,{id:"create-index",children:"CREATE INDEX"}),"\n",(0,t.jsx)(n.p,{children:"Creates a new index."}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["This can also be done via the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/java-to-tables",children:"Java API"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:'When you create a new index, it will start building only after all transactions started before the index creation had been completed. Index build will not start if there are any "hung" transactions in the logical topology of the cluster.'}),"\n",(0,t.jsx)(n.p,{children:'The index status, with the status reason description (e.g., PENDING - "Waiting for transaction ABC to complete") is reflected in the system view.'}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"The index cannot include the same column more than once."})}),"\n","\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF NOT EXISTS"})," - create the index only if an index with the same name does not exist."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"name"})," - name of the index."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"ON"})," - create index on the defined table."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"USING TREE"})," -if specified, creates a tree index."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"USING HASH"})," - if specified, creates a hash index."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples:"}),"\n",(0,t.jsxs)(n.p,{children:["Create an index ",(0,t.jsx)(n.code,{children:"department_name_idx"})," for the Person table:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE INDEX IF NOT EXISTS department_name_idx ON Person (department_id DESC, name ASC);\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Create a hash index ",(0,t.jsx)(n.code,{children:"department_name_idx"})," for the Person table:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE INDEX name_surname_idx ON Person USING HASH (name, surname);\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Create a tree index ",(0,t.jsx)(n.code,{children:"department_city_idx"})," for the Person table:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE INDEX department_city_idx ON Person USING TREE (department_id ASC, city_id DESC);\n"})}),"\n",(0,t.jsx)(n.h2,{id:"drop-index",children:"DROP INDEX"}),"\n",(0,t.jsx)(n.p,{children:"Drops an index."}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["This can also be done via the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/java-to-tables",children:"Java API"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:'When you drop an index, it stays in the STOPPING status until all transactions started before the DROP INDEX command had been completed (even those that do not affect any of the tables for which the index is being dropped).\r\nUpon completion of all transactions described above, the space the dropped index had occupied is freed up only when LWM of the relevant partition becomes greater than the time when the index dropping had been activated.\r\nThe index status, with the status reason description (e.g., PENDING - "Waiting for transaction ABC to complete") is reflected in the system view.'}),"\n","\n",(0,t.jsx)(n.p,{children:"Keywords and parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"index_name"})," - the name of the index."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if an index with the specified name does not exist."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples:"}),"\n",(0,t.jsx)(n.p,{children:"Drop index if the one exists:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"DROP INDEX IF EXISTS department_name_idx;\n"})})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/c98fd205.7a150089.js b/docs/ignite3/assets/js/c98fd205.7a150089.js deleted file mode 100644 index 9622a514fb..0000000000 --- a/docs/ignite3/assets/js/c98fd205.7a150089.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5558],{28453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>t});var r=i(96540);const s={},c=r.createContext(s);function a(e){const n=r.useContext(c);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(c.Provider,{value:n},e.children)}},64672:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"api-reference/api/index","title":"API Documentation","description":"External API documentation links for all supported languages.","source":"@site/docs/api-reference/api/index.mdx","sourceDirName":"api-reference/api","slug":"/api-reference/api/","permalink":"/docs/ignite3/3.1.0/api-reference/api/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"API Documentation"},"sidebar":"tutorialSidebar","previous":{"title":"Python DB-API","permalink":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/python"},"next":{"title":"Java API Reference","permalink":"/docs/ignite3/3.1.0/api-reference/api/java-api-reference"}}');var s=i(74848),c=i(28453);const a={title:"API Documentation"},t="API Documentation",o={},l=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,c.R)(),...e.components},{IIcon:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"api-documentation",children:"API Documentation"})}),"\n",(0,s.jsx)(n.p,{children:"External API documentation links for all supported languages."}),"\n",(0,s.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:openjdk",height:"24"})," Java API Reference"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Complete JavaDoc reference for Apache Ignite 3 Java API."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./api/java-api-reference",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:dotnet",height:"24"})," .NET API Reference"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Complete API reference for Apache Ignite 3 .NET client."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./api/dotnet-api-reference",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:cplusplus",height:"24"})," C++ API Reference"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Complete API reference for Apache Ignite 3 C++ client."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./api/cpp-api-reference",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"native-clients",children:"Native Clients"})," - Native client APIs"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"sql-only-apis",children:"SQL-Only APIs"})," - SQL drivers"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"../develop",children:"Develop"})," - Build applications"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/cb32231c.0f91af19.js b/docs/ignite3/assets/js/cb32231c.0f91af19.js deleted file mode 100644 index 2127afe131..0000000000 --- a/docs/ignite3/assets/js/cb32231c.0f91af19.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4734],{28453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>o});var t=i(96540);const r={},s=t.createContext(r);function a(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(s.Provider,{value:n},e.children)}},88839:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quick-start/persist-data","title":"Getting Started with Ignite 3 Persistent Storage","description":"{/*","source":"@site/versioned_docs/version-3.0.0/quick-start/persist-data.md","sourceDirName":"quick-start","slug":"/quick-start/persist-data","permalink":"/docs/ignite3/3.0.0/quick-start/persist-data","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Getting Started with Ignite 3 Persistent Storage","sidebar_label":"Persist Data"},"sidebar":"tutorialSidebar","previous":{"title":"Explore SQL","permalink":"/docs/ignite3/3.0.0/quick-start/explore-sql"},"next":{"title":"Java API","permalink":"/docs/ignite3/3.0.0/quick-start/java-api"}}');var r=i(74848),s=i(28453);const a={title:"Getting Started with Ignite 3 Persistent Storage",sidebar_label:"Persist Data"},o=void 0,l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"About this Guide",id:"about-this-guide",level:3},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Understanding Persistence in Ignite 3",id:"understanding-persistence-in-ignite-3",level:2},{value:"Persistence Architecture",id:"persistence-architecture",level:3},{value:"Storage Engine Types",id:"storage-engine-types",level:3},{value:"Persistent Storage Options",id:"persistent-storage-options",level:4},{value:"Volatile Storage Options",id:"volatile-storage-options",level:4},{value:"Storage Profiles",id:"storage-profiles",level:3},{value:"Distribution Zones",id:"distribution-zones",level:3},{value:"Setting Up a Persistent Cluster",id:"setting-up-a-persistent-cluster",level:2},{value:"Docker Environment Configuration",id:"docker-environment-configuration",level:3},{value:"Creating the Docker Compose File",id:"creating-the-docker-compose-file",level:3},{value:"Starting the Cluster",id:"starting-the-cluster",level:3},{value:"Verifying Cluster Deployment",id:"verifying-cluster-deployment",level:3},{value:"Configuring Persistent Storage",id:"configuring-persistent-storage",level:2},{value:"Connecting to the Cluster",id:"connecting-to-the-cluster",level:3},{value:"Initializing the Cluster",id:"initializing-the-cluster",level:3},{value:"Examining Storage Profiles",id:"examining-storage-profiles",level:3},{value:"Creating Distribution Zones for Persistence",id:"creating-distribution-zones-for-persistence",level:3},{value:"Building the Chinook Database with Persistence",id:"building-the-chinook-database-with-persistence",level:2},{value:"About the Chinook Database",id:"about-the-chinook-database",level:3},{value:"Creating Persistent Database Tables",id:"creating-persistent-database-tables",level:3},{value:"Loading Sample Data",id:"loading-sample-data",level:3},{value:"Querying the Database",id:"querying-the-database",level:3},{value:"Testing Persistence Capabilities",id:"testing-persistence-capabilities",level:2},{value:"Verifying Data Before Restart",id:"verifying-data-before-restart",level:3},{value:"Restarting the Cluster",id:"restarting-the-cluster",level:3},{value:"Verifying Data Persistence After Restart",id:"verifying-data-persistence-after-restart",level:3},{value:"Wrap Up",id:"wrap-up",level:2},{value:"Summary",id:"summary",level:3},{value:"Additional Resources",id:"additional-resources",level:3}];function c(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,r.jsx)(n.h3,{id:"about-this-guide",children:"About this Guide"}),"\n",(0,r.jsx)(n.p,{children:"This guide will walk you through the basics of setting up and using Ignite 3's RocksDB-based persistent storage with the Chinook database in a Docker-based environment."}),"\n",(0,r.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Up-to-date versions of Docker and Docker Compose;"}),"\n",(0,r.jsx)(n.li,{children:"Terminal or command line access;"}),"\n",(0,r.jsx)(n.li,{children:"Basic SQL knowledge;"}),"\n",(0,r.jsx)(n.li,{children:"At least 8GB of free RAM for the Ignite cluster."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"understanding-persistence-in-ignite-3",children:"Understanding Persistence in Ignite 3"}),"\n",(0,r.jsx)(n.h3,{id:"persistence-architecture",children:"Persistence Architecture"}),"\n",(0,r.jsx)(n.p,{children:"Ignite persistence is designed to provide quick and responsive persistent storage. When using persistent storage:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Ignite stores all its data on disk;"}),"\n",(0,r.jsx)(n.li,{children:"It loads as much data as possible into RAM for processing;"}),"\n",(0,r.jsx)(n.li,{children:"Data is split into multiple partitions, with each partition stored in a separate file on disk;"}),"\n",(0,r.jsx)(n.li,{children:"In addition to data partitions, Ignite stores indexes and metadata on disk."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"This architecture combines the performance benefits of in-memory computing with the durability of disk-based storage."}),"\n",(0,r.jsx)(n.h3,{id:"storage-engine-types",children:"Storage Engine Types"}),"\n",(0,r.jsx)(n.h4,{id:"persistent-storage-options",children:"Persistent Storage Options"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"AIPersist Engine"})," - Default persistent storage engine with checkpointing;"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"RocksDB Engine"})," - LSM-tree based persistent storage optimized for write-heavy workloads."]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"volatile-storage-options",children:"Volatile Storage Options"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"AIMem Engine"})," - In-memory storage with no persistence."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"storage-profiles",children:"Storage Profiles"}),"\n",(0,r.jsxs)(n.p,{children:["In Ignite 3, persistence is configured by using ",(0,r.jsx)(n.strong,{children:"storage profiles"}),". A storage profile defines how data is stored, cached, and managed by the storage engine."]}),"\n",(0,r.jsx)(n.p,{children:"Each storage profile has specific properties depending on the engine type, but all profiles must specify the following properties:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"name"})," - A unique identifier for the profile"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"engine"})," - The storage engine to use"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"distribution-zones",children:"Distribution Zones"}),"\n",(0,r.jsx)(n.p,{children:"Distribution zones control how data is distributed across the cluster and which storage profiles to use. They allow you to:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Control the number of data replicas;"}),"\n",(0,r.jsx)(n.li,{children:"Specify which nodes can store data;"}),"\n",(0,r.jsx)(n.li,{children:"Define how data is partitioned;"}),"\n",(0,r.jsx)(n.li,{children:"Assign storage profiles to determine persistence type."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"setting-up-a-persistent-cluster",children:"Setting Up a Persistent Cluster"}),"\n",(0,r.jsx)(n.h3,{id:"docker-environment-configuration",children:"Docker Environment Configuration"}),"\n",(0,r.jsx)(n.p,{children:"We will use Docker Compose to create a multi-node Ignite cluster with persistent storage."}),"\n",(0,r.jsx)(n.h3,{id:"creating-the-docker-compose-file",children:"Creating the Docker Compose File"}),"\n",(0,r.jsxs)(n.p,{children:["Create a ",(0,r.jsx)(n.code,{children:"docker-compose.yml"})," file in your working directory:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'name: ignite3\r\n\r\nx-ignite-def: &ignite-def\r\n image: apacheignite/ignite:3.0.0\r\n environment:\r\n JVM_MAX_MEM: "4g"\r\n JVM_MIN_MEM: "4g"\r\n configs:\r\n - source: node_config\r\n target: /opt/ignite/etc/ignite-config.conf\r\n\r\nservices:\r\n node1:\r\n <<: *ignite-def\r\n command: --node-name node1\r\n ports:\r\n - "10300:10300"\r\n - "10800:10800"\r\n volumes:\r\n - ./data/node1:/opt/ignite/work\r\n\r\n node2:\r\n <<: *ignite-def\r\n command: --node-name node2\r\n ports:\r\n - "10301:10300"\r\n - "10801:10800"\r\n volumes:\r\n - ./data/node2:/opt/ignite/work\r\n\r\n node3:\r\n <<: *ignite-def\r\n command: --node-name node3\r\n ports:\r\n - "10302:10300"\r\n - "10802:10800"\r\n volumes:\r\n - ./data/node3:/opt/ignite/work\r\n\r\nconfigs:\r\n node_config:\r\n content: |\r\n ignite {\r\n network {\r\n port: 3344\r\n nodeFinder.netClusterNodes = ["node1:3344", "node2:3344", "node3:3344"]\r\n }\r\n "storage": {\r\n "profiles": [\r\n {\r\n name: "rocksDbProfile"\r\n engine: "rocksdb"\r\n }\r\n ]\r\n }\r\n }\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"node_config"})," configuration in the Docker Compose file:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Adds a storage profile named ",(0,r.jsx)(n.code,{children:"rocksDbProfile"})," that uses the RocksDB engine;"]}),"\n",(0,r.jsx)(n.li,{children:"Sets the storage size to 256MB (268435456 bytes) by default."}),"\n",(0,r.jsxs)(n.li,{children:["Stores persistent data in the ",(0,r.jsx)(n.code,{children:"data"})," directory where Docker was run."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"starting-the-cluster",children:"Starting the Cluster"}),"\n",(0,r.jsx)(n.p,{children:"Run the following command to start your cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker-compose up -d\n"})}),"\n",(0,r.jsx)(n.h3,{id:"verifying-cluster-deployment",children:"Verifying Cluster Deployment"}),"\n",(0,r.jsx)(n.p,{children:"Check that all nodes are running:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker compose ps\n"})}),"\n",(0,r.jsx)(n.p,{children:"You should see output similar to:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS\r\nignite3-node1-1 apacheignite/ignite:3.0.0 "docker-entrypoint.s\u2026" node1 37 seconds ago Up 33 seconds 0.0.0.0:10300->10300/tcp, 3344/tcp, 0.0.0.0:10800->10800/tcp\r\nignite3-node2-1 apacheignite/ignite:3.0.0 "docker-entrypoint.s\u2026" node2 37 seconds ago Up 33 seconds 3344/tcp, 0.0.0.0:10301->10300/tcp, 0.0.0.0:10801->10800/tcp\r\nignite3-node3-1 apacheignite/ignite:3.0.0 "docker-entrypoint.s\u2026" node3 37 seconds ago Up 33 seconds 3344/tcp, 0.0.0.0:10302->10300/tcp, 0.0.0.0:10802->10800/tcp\n'})}),"\n",(0,r.jsx)(n.p,{children:"Verify the Docker network:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker network ls\n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuring-persistent-storage",children:"Configuring Persistent Storage"}),"\n",(0,r.jsx)(n.h3,{id:"connecting-to-the-cluster",children:"Connecting to the Cluster"}),"\n",(0,r.jsx)(n.p,{children:"Connect to the Ignite CLI:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker run --rm -it --network=host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 apacheignite/ignite:3.0.0 cli\n"})}),"\n",(0,r.jsx)(n.p,{children:"When the CLI tool offers to connect to default node, confirm the connection. If you ever get disconnected, you can connect again by typing the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"connect http://localhost:10300\n"})}),"\n",(0,r.jsx)(n.h3,{id:"initializing-the-cluster",children:"Initializing the Cluster"}),"\n",(0,r.jsx)(n.p,{children:"Before using the cluster, initialize it:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cluster init --name=ignite3 --metastorage-group=node1,node2,node3\n"})}),"\n",(0,r.jsx)(n.p,{children:'You should see the message "Cluster was initialized successfully".'}),"\n",(0,r.jsx)(n.h3,{id:"examining-storage-profiles",children:"Examining Storage Profiles"}),"\n",(0,r.jsx)(n.p,{children:"Verify the configured storage profiles:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"node config show ignite.storage\n"})}),"\n",(0,r.jsxs)(n.p,{children:["You should see output showing the ",(0,r.jsx)(n.code,{children:"rocksDbProfile"})," configuration along with the default profiles."]}),"\n",(0,r.jsx)(n.h3,{id:"creating-distribution-zones-for-persistence",children:"Creating Distribution Zones for Persistence"}),"\n",(0,r.jsx)(n.p,{children:"Enter the interactive SQL CLI:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"sql\n"})}),"\n",(0,r.jsx)(n.p,{children:"Create a distribution zone that uses our RocksDB storage profile:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE ChinookRocksDB WITH replicas=2, storage_profiles='rocksDbProfile';\n"})}),"\n",(0,r.jsx)(n.h2,{id:"building-the-chinook-database-with-persistence",children:"Building the Chinook Database with Persistence"}),"\n",(0,r.jsx)(n.h3,{id:"about-the-chinook-database",children:"About the Chinook Database"}),"\n",(0,r.jsx)(n.p,{children:"The Chinook database represents a digital media store with tables for artists, albums, tracks, and more. It's commonly used as a sample database for demonstrating database features."}),"\n",(0,r.jsx)(n.h3,{id:"creating-persistent-database-tables",children:"Creating Persistent Database Tables"}),"\n",(0,r.jsx)(n.p,{children:"Create the necessary tables for the Chinook database using our RocksDB persistent zone:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Create Artist table\r\nCREATE TABLE Artist (\r\n ArtistId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (ArtistId)\r\n) ZONE ChinookRocksDB;\r\n\r\n-- Create Album table\r\nCREATE TABLE Album (\r\n AlbumId INT NOT NULL,\r\n Title VARCHAR(160) NOT NULL,\r\n ArtistId INT NOT NULL,\r\n PRIMARY KEY (AlbumId, ArtistId)\r\n) COLOCATE BY (ArtistId) ZONE ChinookRocksDB;\r\n\r\n-- Create Genre table\r\nCREATE TABLE Genre (\r\n GenreId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (GenreId)\r\n) ZONE ChinookRocksDB;\r\n\r\n-- Create MediaType table\r\nCREATE TABLE MediaType (\r\n MediaTypeId INT NOT NULL,\r\n Name VARCHAR(120),\r\n PRIMARY KEY (MediaTypeId)\r\n) ZONE ChinookRocksDB;\r\n\r\n-- Create Track table\r\nCREATE TABLE Track (\r\n TrackId INT NOT NULL,\r\n Name VARCHAR(200) NOT NULL,\r\n AlbumId INT,\r\n MediaTypeId INT NOT NULL,\r\n GenreId INT,\r\n Composer VARCHAR(220),\r\n Milliseconds INT NOT NULL,\r\n Bytes INT,\r\n UnitPrice NUMERIC(10,2) NOT NULL,\r\n PRIMARY KEY (TrackId, AlbumId)\r\n) COLOCATE BY (AlbumId) ZONE ChinookRocksDB;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"loading-sample-data",children:"Loading Sample Data"}),"\n",(0,r.jsx)(n.p,{children:"Insert sample data into the tables:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Insert data into MediaType table\r\nINSERT INTO MediaType (MediaTypeId, Name) VALUES\r\n(1, 'MPEG audio file'),\r\n(2, 'Protected AAC audio file');\r\n\r\n-- Insert data into Artist table\r\nINSERT INTO Artist (ArtistId, Name) VALUES\r\n(1, 'AC/DC'),\r\n(2, 'Accept'),\r\n(3, 'Aerosmith'),\r\n(4, 'Alanis Morissette'),\r\n(5, 'Alice In Chains');\r\n\r\n-- Insert data into Album table\r\nINSERT INTO Album (AlbumId, Title, ArtistId) VALUES\r\n(1, 'For Those About To Rock We Salute You', 1),\r\n(2, 'Balls to the Wall', 2),\r\n(3, 'Restless and Wild', 2),\r\n(4, 'Let There Be Rock', 1),\r\n(5, 'Big Ones', 3);\r\n\r\n-- Insert data into Genre table\r\nINSERT INTO Genre (GenreId, Name) VALUES\r\n(1, 'Rock'),\r\n(2, 'Jazz'),\r\n(3, 'Metal'),\r\n(4, 'Alternative & Punk'),\r\n(5, 'Rock And Roll');\r\n\r\n-- Insert data into Track table\r\nINSERT INTO Track (TrackId, Name, AlbumId, MediaTypeId, GenreId, Composer, Milliseconds, Bytes, UnitPrice) VALUES\r\n(1, 'For Those About To Rock (We Salute You)', 1, 1, 1, 'Angus Young, Malcolm Young, Brian Johnson', 343719, 11170334, 0.99),\r\n(2, 'Balls to the Wall', 2, 2, 1, 'U. Dirkschneider, W. Hoffmann, H. Frank, P. Baltes, S. Kaufmann, G. Hoffmann', 342562, 5510424, 0.99),\r\n(3, 'Fast As a Shark', 3, 2, 1, 'F. Baltes, S. Kaufman, U. Dirkschneider & W. Hoffman', 230619, 3990994, 0.99),\r\n(4, 'Restless and Wild', 3, 2, 1, 'F. Baltes, R.A. Smith-Diesel, S. Kaufman, U. Dirkschneider & W. Hoffman', 252051, 4331779, 0.99),\r\n(5, 'Princess of the Dawn', 3, 2, 1, 'Deaffy & R.A. Smith-Diesel', 375418, 6290521, 0.99);\n"})}),"\n",(0,r.jsx)(n.h3,{id:"querying-the-database",children:"Querying the Database"}),"\n",(0,r.jsx)(n.p,{children:"Test that your data was inserted correctly:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"SELECT a.Name AS Artist, al.Title AS Album, t.Name AS Track\r\nFROM Track t\r\nJOIN Album al ON t.AlbumId = al.AlbumId\r\nJOIN Artist a ON al.ArtistId = a.ArtistId\r\nWHERE t.AlbumId = 1;\n"})}),"\n",(0,r.jsx)(n.h2,{id:"testing-persistence-capabilities",children:"Testing Persistence Capabilities"}),"\n",(0,r.jsx)(n.h3,{id:"verifying-data-before-restart",children:"Verifying Data Before Restart"}),"\n",(0,r.jsx)(n.p,{children:"Perform additional queries to ensure your data is properly stored:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"-- Count tracks by genre\r\nSELECT g.Name AS Genre, COUNT(t.TrackId) AS TrackCount\r\nFROM Track t\r\nJOIN Genre g ON t.GenreId = g.GenreId\r\nGROUP BY g.Name;\r\n\r\n-- Check all albums by artist\r\nSELECT a.Name AS Artist, COUNT(al.AlbumId) AS AlbumCount\r\nFROM Album al\r\nJOIN Artist a ON al.ArtistId = a.ArtistId\r\nGROUP BY a.Name;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"restarting-the-cluster",children:"Restarting the Cluster"}),"\n",(0,r.jsx)(n.p,{children:"To restart the cluster, you need to first exit the CLI tool."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Exit the SQL CLI with the ",(0,r.jsx)(n.code,{children:"exit;"})," command,"]}),"\n",(0,r.jsxs)(n.li,{children:["Then exit the main CLI with the ",(0,r.jsx)(n.code,{children:"exit"})," command."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Restart the Docker containers:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker-compose down\r\ndocker-compose up -d\n"})}),"\n",(0,r.jsx)(n.h3,{id:"verifying-data-persistence-after-restart",children:"Verifying Data Persistence After Restart"}),"\n",(0,r.jsx)(n.p,{children:"Reconnect to the CLI:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker run --rm -it --network=host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 apacheignite/ignite:3.0.0 cli\n"})}),"\n",(0,r.jsx)(n.p,{children:"The cluster is already initialized, so you can go directly to the SQL CLI:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"sql\n"})}),"\n",(0,r.jsx)(n.p,{children:"Run the same query to verify the data persisted through the restart:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:"SELECT a.Name AS Artist, al.Title AS Album, t.Name AS Track\r\nFROM Track t\r\nJOIN Album al ON t.AlbumId = al.AlbumId\r\nJOIN Artist a ON al.ArtistId = a.ArtistId\r\nWHERE t.AlbumId = 1;\n"})}),"\n",(0,r.jsx)(n.h2,{id:"wrap-up",children:"Wrap Up"}),"\n",(0,r.jsx)(n.h3,{id:"summary",children:"Summary"}),"\n",(0,r.jsx)(n.p,{children:"Ignite 3 with RocksDB persistent storage provides a powerful way to maintain data durability while leveraging in-memory computing performance. RocksDB is particularly well-suited for write-intensive workloads, making it an excellent choice for many production environments."}),"\n",(0,r.jsx)(n.h3,{id:"additional-resources",children:"Additional Resources"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://rocksdb.org/docs/",children:"RocksDB Documentation"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/lerocha/chinook-database",children:"Chinook Database Project"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/cb5d1ef8.bb7711ee.js b/docs/ignite3/assets/js/cb5d1ef8.bb7711ee.js deleted file mode 100644 index acb47e494d..0000000000 --- a/docs/ignite3/assets/js/cb5d1ef8.bb7711ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6987],{28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var s=t(96540);const r={},d=s.createContext(r);function i(e){const n=s.useContext(d);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(d.Provider,{value:n},e.children)}},85791:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>h});const s=JSON.parse('{"id":"configure-and-operate/reference/node-configuration","title":"Node Configuration Parameters","description":"Node configuration is individual for each node and is not shared across the whole cluster.","source":"@site/docs/configure-and-operate/reference/node-configuration.md","sourceDirName":"configure-and-operate/reference","slug":"/configure-and-operate/reference/node-configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"node-configuration","title":"Node Configuration Parameters","sidebar_label":"Node Configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Configuration Reference","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/"},"next":{"title":"Cluster Configuration","permalink":"/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration"}}');var r=t(74848),d=t(28453);const i={id:"node-configuration",title:"Node Configuration Parameters",sidebar_label:"Node Configuration"},l=void 0,c={},h=[{value:"Checking Node Configuration",id:"checking-node-configuration",level:2},{value:"Changing Node Configuration",id:"changing-node-configuration",level:2},{value:"Exporting Node Configuration",id:"exporting-node-configuration",level:2},{value:"Configuration Parameters",id:"configuration-parameters",level:2},{value:"Client Connector Configuration",id:"client-connector-configuration",level:3},{value:"Compute Configuration",id:"compute-configuration",level:3},{value:"Code Deployment Configuration",id:"code-deployment-configuration",level:3},{value:"Failure Handler Configuration",id:"failure-handler-configuration",level:3},{value:"Network Configuration",id:"network-configuration",level:3},{value:"Node Attributes",id:"node-attributes",level:3},{value:"RAFT Configuration",id:"raft-configuration",level:3},{value:"REST Configuration",id:"rest-configuration",level:3},{value:"SQL Configuration",id:"sql-configuration",level:3},{value:"Storage Configuration",id:"storage-configuration",level:3},{value:"System Configuration",id:"system-configuration",level:3}];function o(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"Node configuration is individual for each node and is not shared across the whole cluster."}),"\n",(0,r.jsxs)(n.p,{children:['In Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,r.jsx)(n.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node."]}),"\n",(0,r.jsx)(n.h2,{id:"checking-node-configuration",children:"Checking Node Configuration"}),"\n",(0,r.jsx)(n.p,{children:"To get node configuration, use the CLI tool."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Start the CLI tool and connect to the node."}),"\n",(0,r.jsxs)(n.li,{children:["Run the ",(0,r.jsx)(n.code,{children:"node config show"})," command."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"The CLI tool will print the full node configuration. If you only need a part of the configuration, you can narrow down the search by providing the properties you need as the command argument, for example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"node config show ignite.clientConnector\n"})}),"\n",(0,r.jsx)(n.h2,{id:"changing-node-configuration",children:"Changing Node Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Node configuration is changed from the CLI tool. To change the configuration:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:'Start the CLI tool and connect to the node. This becomes the "default" node for subsequent CL commands.'}),"\n",(0,r.jsxs)(n.li,{children:["To update the default node's configuration, run the ",(0,r.jsx)(n.code,{children:"node config update"})," command and provide the update as the command argument, for example:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"node config update ignite.clientConnector.connectTimeoutMillis=10000\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["To update the configuration of a node other than the default one, run the ",(0,r.jsx)(n.code,{children:"node config update"})," command with the target node explicitly specified. For example, for node named ",(0,r.jsx)(n.code,{children:"node1"}),":"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'node config update -n node1 ignite.nodeAttributes.nodeAttributes.clientConnector="10900"\n'})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Restart the node to apply the configuration changes."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"exporting-node-configuration",children:"Exporting Node Configuration"}),"\n",(0,r.jsx)(n.p,{children:"If you need to export node configuration to a HOCON-formatted file, use the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"bin/ignite3 node config show > node-config.conf\n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuration-parameters",children:"Configuration Parameters"}),"\n",(0,r.jsx)(n.h3,{id:"client-connector-configuration",children:"Client Connector Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["See the ",(0,r.jsx)(n.a,{href:"/3.1.0/develop/ignite-clients/",children:"Clients"})," section for information on configuring client connector."]}),"\n",(0,r.jsx)(n.h3,{id:"compute-configuration",children:"Compute Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "compute" : {\r\n "queueMaxSize" : 2147483647,\r\n "statesLifetimeMillis" : 60000,\r\n "threadPoolSize" : 10\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"queueMaxSize"}),(0,r.jsx)(n.td,{children:"2147483647"}),(0,r.jsx)(n.td,{children:"Maximum number of compute tasks in queue."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"statesLifetimeMillis"}),(0,r.jsx)(n.td,{children:"60000"}),(0,r.jsx)(n.td,{children:"The lifetime of job states after the job finishes, in milliseconds."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"threadPoolSize"}),(0,r.jsx)(n.td,{children:"10"}),(0,r.jsx)(n.td,{children:"The number of threads available to compute jobs."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - Integer.MAX_VALUE"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"code-deployment-configuration",children:"Code Deployment Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "deployment" : {\r\n "location" : "deployment"\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"location"}),(0,r.jsx)(n.td,{children:"deployment"}),(0,r.jsx)(n.td,{children:"Relative path to folder in the working directory. All deployment units content will be stored there."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"A valid path"})]})})]}),"\n",(0,r.jsx)(n.h3,{id:"failure-handler-configuration",children:"Failure Handler Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "failureHandler" : {\r\n "dumpThreadsOnFailure" : true,\r\n "dumpThreadsThrottlingTimeoutMillis" : 10000,\r\n "handler" : {\r\n "ignoredFailureTypes" : [\r\n "systemWorkerBlocked", "systemCriticalOperationTimeout"\r\n ],\r\n "type" : "noop"\r\n },\r\n "oomBufferSizeBytes" : 16384\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"dumpThreadsOnFailure"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"The number of items that can be expired at once."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"dumpThreadsThrottlingTimeoutMillis"}),(0,r.jsx)(n.td,{children:"10000"}),(0,r.jsx)(n.td,{children:"Throttling timeout for thread dump generation during failure handling, in milliseconds."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"handler.ignoredFailureTypes"}),(0,r.jsx)(n.td,{children:"[systemWorkerBlocked, systemCriticalOperationTimeout]"}),(0,r.jsx)(n.td,{children:"Types of failures that will be ignored."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"handler.type"}),(0,r.jsx)(n.td,{children:"noop"}),(0,r.jsx)(n.td,{children:"Failure handler configuration type."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"noop, stop, stopOrHalt"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"oomBufferSizeBytes"}),(0,r.jsx)(n.td,{children:"16384"}),(0,r.jsx)(n.td,{children:"Amount of memory reserved in the heap at node start, in bytes."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"1 - inf"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"network-configuration",children:"Network Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["In Apache Ignite 3, you can choose between two node discovery types. With ",(0,r.jsx)(n.code,{children:"STATIC"})," type, you manually specify the node addresses, while ",(0,r.jsx)(n.code,{children:"MULTICAST"})," type automatically detects nodes on your network, making setup simpler."]}),"\n",(0,r.jsxs)(n.p,{children:["Example configuration with a ",(0,r.jsx)(n.code,{children:"STATIC"})," node finder:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "network" : {\r\n "fileTransfer" : {\r\n "chunkSizeBytes" : 1048576,\r\n "maxConcurrentRequests" : 4,\r\n "responseTimeoutMillis" : 10000,\r\n "threadPoolSize" : 8\r\n },\r\n "inbound" : {\r\n "soBacklog" : 128,\r\n "soKeepAlive" : true,\r\n "soLinger" : 0,\r\n "soReuseAddr" : true,\r\n "tcpNoDelay" : true\r\n },\r\n "listenAddresses" : [],\r\n "membership" : {\r\n "failurePingIntervalMillis" : 1000,\r\n "membershipSyncIntervalMillis" : 30000,\r\n "scaleCube" : {\r\n "failurePingRequestMembers" : 3,\r\n "gossipIntervalMillis" : 200,\r\n "gossipRepeatMult" : 3,\r\n "membershipSuspicionMultiplier" : 5,\r\n "metadataTimeoutMillis" : 3000\r\n }\r\n },\r\n "nodeFinder" : {\r\n "netClusterNodes" : [ "localhost:3344" ],\r\n "type" : "STATIC"\r\n },\r\n "outbound" : {\r\n "soKeepAlive" : true,\r\n "soLinger" : 0,\r\n "tcpNoDelay" : true\r\n },\r\n "port" : 3344,\r\n "shutdownQuietPeriodMillis" : 0,\r\n "shutdownTimeoutMillis" : 15000,\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "none",\r\n "enabled" : false,\r\n "keyStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n },\r\n "trustStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["To switch to a ",(0,r.jsx)(n.code,{children:"MULTICAST"})," node finder, update the ",(0,r.jsx)(n.code,{children:"nodeFinder"})," section in your configuration file to the following:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "nodeFinder": {\r\n "type": "MULTICAST",\r\n "multicast" : {\r\n "group": "239.192.0.0",\r\n "port": 47401,\r\n "resultWaitTime": 500,\r\n "ttl": -1\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"fileTransfer"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"File transfer configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"fileTransfer.chunkSizeBytes"}),(0,r.jsx)(n.td,{children:"1048576"}),(0,r.jsx)(n.td,{children:"Chunk size in bytes."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"fileTransfer.maxConcurrentRequests"}),(0,r.jsx)(n.td,{children:"4"}),(0,r.jsx)(n.td,{children:"Maximum number of concurrent requests."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"fileTransfer.responseTimeoutMillis"}),(0,r.jsx)(n.td,{children:"10000"}),(0,r.jsx)(n.td,{children:"Node response timeout during file transfer."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"fileTransfer.threadPoolSize"}),(0,r.jsx)(n.td,{children:"8"}),(0,r.jsx)(n.td,{children:"File sender thread pool size."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"inbound"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["Server socket configuration. See ",(0,r.jsx)(n.a,{href:"https://man7.org/linux/man-pages/man7/tcp.7.html",children:"TCP documentation"})," and ",(0,r.jsx)(n.a,{href:"https://man7.org/linux/man-pages/man7/socket.7.html",children:"socket documentation"})," for more information."]}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"inbound.soBacklog"}),(0,r.jsx)(n.td,{children:"128"}),(0,r.jsx)(n.td,{children:"The size of the backlog."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"inbound.soKeepAlive"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Defines if the keep-alive packets are allowed."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"inbound.soLinger"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Defines how long the closed socket should linger."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - 65535"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"inbound.soReuseAddr"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Defines if the address can be reused."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"inbound.tcpNoDelay"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Defines if the TCP no delay option is used."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"listenAddresses"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"List of addresses (IPs or hostnames) to listen on. If empty, listens on all interfaces. Currently, only a single address is supported."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A list of valid addresses separated by comma"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"membership"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Node membership configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"membership.failurePingIntervalMillis"}),(0,r.jsx)(n.td,{children:"1000"}),(0,r.jsx)(n.td,{children:"Failure detector ping interval."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"membership.membershipSyncIntervalMillis"}),(0,r.jsx)(n.td,{children:"30000"}),(0,r.jsx)(n.td,{children:"Periodic membership data synchronization interval."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"membership.scaleCube"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"ScaleCube-specific configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"scaleCube.failurePingRequestMembers"}),(0,r.jsx)(n.td,{children:"3"}),(0,r.jsx)(n.td,{children:"Number of members that are randomly selected by a cluster node for an indirect ping request."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"scaleCube.gossipIntervalMillis"}),(0,r.jsx)(n.td,{children:"200"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Gossip_protocol",children:"Gossip"})," spreading interval."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"scaleCube.gossipRepeatMult"}),(0,r.jsx)(n.td,{children:"3"}),(0,r.jsx)(n.td,{children:"Gossip repeat multiplier."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"scaleCube.membershipSuspicionMultiplier"}),(0,r.jsx)(n.td,{children:"5"}),(0,r.jsx)(n.td,{children:"The multiplier that is used to calculate the timeout after which the node is considered dead."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"scaleCube.metadataTimeoutMillis"}),(0,r.jsx)(n.td,{children:"3000"}),(0,r.jsx)(n.td,{children:"The timeout on metadata update operation, in milliseconds."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"nodeFinder"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Configuration for how the node finds other nodes in the cluster."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"nodeFinder.netClusterNodes"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["Addresses of all nodes in the cluster in the host",":port"," format. Applicable when ",(0,r.jsx)(n.code,{children:"STATIC"})," node finder type is used."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Addresses in a valid format"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"nodeFinder.type"}),(0,r.jsx)(n.td,{children:"STATIC"}),(0,r.jsxs)(n.td,{children:["Node finder type. Use ",(0,r.jsx)(n.code,{children:"STATIC"})," to manually configure node addresses."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"STATIC"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"nodeFinder.type"}),(0,r.jsx)(n.td,{children:"MULTICAST"}),(0,r.jsxs)(n.td,{children:["Node finder type. Use ",(0,r.jsx)(n.code,{children:"MULTICAST"})," to automatically detect nodes on your network. When using this type, you must also specify a multicast group address."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"MULTICAST"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"nodeFinder.multicast.group"}),(0,r.jsx)(n.td,{children:"239.192.0.0"}),(0,r.jsx)(n.td,{children:"The multicast group address for node discovery."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Multicast address in a valid format"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"nodeFinder.multicast.port"}),(0,r.jsx)(n.td,{children:"47401"}),(0,r.jsx)(n.td,{children:"The port used for multicast."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - 65535"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"nodeFinder.multicast.resultWaitTime"}),(0,r.jsx)(n.td,{children:"500"}),(0,r.jsx)(n.td,{children:"The time in milliseconds a node waits for responses after a discovery request."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"nodeFinder.multicast.ttl"}),(0,r.jsx)(n.td,{children:"-1"}),(0,r.jsx)(n.td,{children:"Sets the maximum number of network hops for multicast packets. By default is set to -1 and uses the default system TTL."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"-1 - 255"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"outbound"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Outbound request configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"outbound.soKeepAlive"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Defines if the keep-alive packets are allowed."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"outbound.soLinger"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Defines how long the closed socket should linger."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - 65535"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"outbound.tcpNoDelay"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"Defines if the TCP no delay option is used."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"port"}),(0,r.jsx)(n.td,{children:"3344"}),(0,r.jsx)(n.td,{children:"Node port."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid port number"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"shutdownQuietPeriodMillis"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"The period during node shutdown when Ignite ensures that no tasks are submitted before the node shuts itself down. If a task is submitted during this period, it is guaranteed to be accepted."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"shutdownTimeoutMillis"}),(0,r.jsx)(n.td,{children:"15000"}),(0,r.jsxs)(n.td,{children:["The maximum amount of time until the node is shut down regardless of if new network messages were submitted during ",(0,r.jsx)(n.code,{children:"shutdownQuietPeriodMillis"}),"."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.ciphers"}),(0,r.jsx)(n.td,{children:'""'}),(0,r.jsx)(n.td,{children:"List of ciphers to enable, comma-separated. Empty for automatic cipher selection."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"TLS_AES_256_GCM_SHA384, etc. (standard cipher ids)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.clientAuth"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Whether the SSL client authentication is enabled and whether it is mandatory."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"none, optional, require"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.enabled"}),(0,r.jsx)(n.td,{children:"false"}),(0,r.jsx)(n.td,{children:"Defines if SSL is enabled for the node."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.keyStore"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"SSL keystore configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"keyStore.password"}),(0,r.jsx)(n.td,{children:"********"}),(0,r.jsx)(n.td,{children:"Keystore password."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid password"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"keyStore.path"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Path to the keystore."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid path"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"keyStore.type"}),(0,r.jsx)(n.td,{children:"PKCS12"}),(0,r.jsx)(n.td,{children:"Keystore type."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"PKCS12, JKS"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.trustStore"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"SSL trustsore configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"trustStore.password"}),(0,r.jsx)(n.td,{children:"********"}),(0,r.jsx)(n.td,{children:"Truststore password."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid password"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"trustStore.path"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Path to the truststore."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid path"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"trustStore.type"}),(0,r.jsx)(n.td,{children:"PKCS12"}),(0,r.jsx)(n.td,{children:"Truststore type."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"PKCS12, JKS"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"node-attributes",children:"Node Attributes"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "nodeAttributes" : {\r\n "nodeAttributes" : { }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"nodeAttributes"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"A collection of node attributes used for dynamically distributing data only to those nodes that have the specified attribute values."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A JSON-formatted object"})]})})]}),"\n",(0,r.jsx)(n.h3,{id:"raft-configuration",children:"RAFT Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "raft" : {\r\n "fsync" : false,\r\n "installSnapshotTimeoutMillis" : 300000,\r\n "logStripesCount" : 4,\r\n "logYieldStrategy" : false,\r\n "responseTimeoutMillis" : 3000,\r\n "retryDelayMillis" : 200,\r\n "retryTimeoutMillis" : 10000,\r\n "stripes" : 10,\r\n "volatileRaft" : {\r\n "logStorageBudget" : {\r\n "name" : "unlimited"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"fsync"}),(0,r.jsx)(n.td,{children:"false"}),(0,r.jsxs)(n.td,{children:["Specifies whether ",(0,r.jsx)(n.code,{children:"fsync"})," is used to safely write Raft log entries to disk on table partition groups before confirming replication. If set to ",(0,r.jsx)(n.code,{children:"false"}),", user data may be lost in the event of an OS crash, but an Ignite application crash will not result in data loss."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"installSnapshotTimeoutMillis"}),(0,r.jsx)(n.td,{children:"300000"}),(0,r.jsx)(n.td,{children:"The maximum period allowed for transferring a RAFT snapshot to a recipient and installing it."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"logStripesCount"}),(0,r.jsx)(n.td,{children:"4"}),(0,r.jsx)(n.td,{children:"Amount of stripes in disruptors of log manager"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"logYieldStrategy"}),(0,r.jsx)(n.td,{children:"false"}),(0,r.jsx)(n.td,{children:"If true, the non-blocking strategy is used in the Disruptor of log manager."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"responseTimeoutMillis"}),(0,r.jsx)(n.td,{children:"3000"}),(0,r.jsx)(n.td,{children:"Period for which the RAFT client will try to receive a response from a remote peer."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"retryDelayMillis"}),(0,r.jsx)(n.td,{children:"200"}),(0,r.jsx)(n.td,{children:"Delay between re-sends of a failed request by the RAFT client."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"retryTimeoutMillis"}),(0,r.jsx)(n.td,{children:"10000"}),(0,r.jsx)(n.td,{children:"Period for which the RAFT client will try to receive a successful response from a remote peer."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"volatileRaft.logStorageBudget.name"}),(0,r.jsx)(n.td,{children:"unlimited"}),(0,r.jsx)(n.td,{children:"The name of the log storage budget used by the node."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No, but the new values are only applied to new partitions"}),(0,r.jsx)(n.td,{children:"unlimited, entry-count"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"rest-configuration",children:"REST Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "rest" : {\r\n "dualProtocol" : false,\r\n "httpToHttpsRedirection" : false,\r\n "port" : 10300,\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "none",\r\n "enabled" : false,\r\n "keyStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n },\r\n "port" : 10400,\r\n "trustStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"dualProtocol"}),(0,r.jsx)(n.td,{children:"false"}),(0,r.jsx)(n.td,{children:"Defines if both HTTP and HTTPS protocols are used by the endpoint."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"httpToHttpsRedirection"}),(0,r.jsx)(n.td,{children:"false"}),(0,r.jsx)(n.td,{children:"Defines if requests to HTTP endpoint will be redirected to HTTPS."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"port"}),(0,r.jsx)(n.td,{children:"10300"}),(0,r.jsx)(n.td,{children:"The port of the node's REST endpoint."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid port"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.ciphers"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Explicitly set node SSL cipher."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsxs)(n.td,{children:["See ",(0,r.jsx)(n.a,{href:"https://www.java.com/en/configure_crypto.html",children:"acceptable values"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.clientAuth"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Client authorization used by the node, if any."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"none, optional, require"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.enabled"}),(0,r.jsx)(n.td,{children:"false"}),(0,r.jsx)(n.td,{children:"Defines if SSL is enabled for the node."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.keyStore"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"SSL keystore configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"keyStore.password"}),(0,r.jsx)(n.td,{children:"********"}),(0,r.jsx)(n.td,{children:"Keystore password."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid password"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"keyStore.path"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Path to the keystore."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid path"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"keyStore.type"}),(0,r.jsx)(n.td,{children:"PKCS12"}),(0,r.jsx)(n.td,{children:"Keystore type."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"PKCS12, JKS"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.port"}),(0,r.jsx)(n.td,{children:"10400"}),(0,r.jsx)(n.td,{children:"Port used for SSL connections."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid port"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ssl.trustStore"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"SSL trustsore configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"trustStore.password"}),(0,r.jsx)(n.td,{children:"********"}),(0,r.jsx)(n.td,{children:"Truststore password."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid password"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"trustStore.path"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Path to the truststore."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A valid path"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"trustStore.type"}),(0,r.jsx)(n.td,{children:"PKCS12"}),(0,r.jsx)(n.td,{children:"Truststore type."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"PKCS12, JKS"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"sql-configuration",children:"SQL Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "sql" : {\r\n "execution" : {\r\n "threadCount" : 4\r\n },\r\n "planner" : {\r\n "threadCount" : 4\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"execution.threadCount"}),(0,r.jsx)(n.td,{children:"4"}),(0,r.jsx)(n.td,{children:"Number of threads for query execution."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - Integer.MAX_VALUE"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"planner.threadCount"}),(0,r.jsx)(n.td,{children:"4"}),(0,r.jsx)(n.td,{children:"Number of threads for query planning."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - Integer.MAX_VALUE"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"storage-configuration",children:"Storage Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Ignite Persistence is designed to provide a quick and responsive persistent storage. When using the persistent storage, Ignite stores all the data on disk, and loads as much data as it can into RAM for processing. When persistence is enabled, Ignite stores each partition in a separate file on disk. In addition to data partitions, Ignite stores indexes and metadata."}),"\n",(0,r.jsxs)(n.p,{children:["Each Ignite storage engine can have several storage ",(0,r.jsx)(n.em,{children:"profiles"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"Checkpointing"})," is the process of copying dirty pages from RAM to partition files on disk. A dirty page is a page that was updated in RAM but was not written to the respective partition file. After a checkpoint is created, all changes are persisted to disk and will be available if the node crashes and is restarted. Checkpointing is designed to ensure durability of data and recovery in case of a node failure. This process helps you utilize disk space frugally by keeping pages in the most up-to-date state on disk."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "storage" : {\r\n "engines" : {\r\n "aimem" : {\r\n "pageSizeBytes" : 16384\r\n },\r\n "aipersist" : {\r\n "checkpoint" : {\r\n "checkpointDelayMillis" : 200,\r\n "checkpointThreads" : 4,\r\n "compactionThreads" : 4,\r\n "intervalMillis" : 180000,\r\n "intervalDeviationPercent" : 40,\r\n "logReadLockThresholdTimeout" : 0,\r\n "readLockTimeoutMillis" : 10000,\r\n "useAsyncFileIoFactory" : true\r\n },\r\n "pageSizeBytes" : 16384\r\n },\r\n "rocksdb" : {\r\n "flushDelayMillis" : 100\r\n }\r\n },\r\n "profiles" : [ {\r\n "engine" : "aipersist",\r\n "name" : "default",\r\n "replacementMode" : "CLOCK",\r\n "sizeBytes" : 268435456\r\n },\r\n {\r\n "engine" : "aimem",\r\n "name" : "default_aimem",\r\n "emptyPagesPoolSize" : 100,\r\n "initSizeBytes" : 268435456,\r\n "maxSizeBytes" : 268435456\r\n },\r\n {\r\n "engine" : "rocksdb",\r\n "name" : "default_rocksdb",\r\n "sizeBytes" : 268435456,\r\n "writeBufferSizeBytes" : 67108864\r\n } ]\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"engines.aimem"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Aimem configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aimem.pageSizeBytes"}),(0,r.jsx)(n.td,{children:"16384"}),(0,r.jsx)(n.td,{children:"The size of pages in the storage, in bytes."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1024-16384"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"engines.aipersist"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Aipersist configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.checkpoint.checkpointDelayMillis"}),(0,r.jsx)(n.td,{children:"200"}),(0,r.jsx)(n.td,{children:"Delay before staring a checkpoint after receiving the command."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.checkpoint.checkpointThreads"}),(0,r.jsx)(n.td,{children:"4"}),(0,r.jsx)(n.td,{children:"Number of CPU threads dedicated to checkpointing."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.checkpoint.compactionThreads"}),(0,r.jsx)(n.td,{children:"4"}),(0,r.jsx)(n.td,{children:"Number of CPU threads dedicated to data compaction."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.checkpoint.intervalMillis"}),(0,r.jsx)(n.td,{children:"180000"}),(0,r.jsx)(n.td,{children:"Interval between checkpoints in milliseconds."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.checkpoint.intervalDeviationPercent"}),(0,r.jsx)(n.td,{children:"40"}),(0,r.jsx)(n.td,{children:"Jitter that will be added or subtracted from time period till next scheduled checkpoint (percentage)."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"0-100"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.checkpoint.logReadLockThresholdTimeoutMillis"}),(0,r.jsx)(n.td,{children:"0"}),(0,r.jsx)(n.td,{children:"Threshold for logging long read locks, in milliseconds."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.checkpoint.readLockTimeoutMillis"}),(0,r.jsx)(n.td,{children:"10000"}),(0,r.jsx)(n.td,{children:"Timeout for checkpoint read lock acquisition, in milliseconds."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.checkpoint.useAsyncFileIoFactory"}),(0,r.jsx)(n.td,{children:"true"}),(0,r.jsx)(n.td,{children:"If Ignite uses asynchronous file I/O operations provider."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"true, false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.pageSizeBytes"}),(0,r.jsx)(n.td,{children:"16384"}),(0,r.jsx)(n.td,{children:"The size of pages in the storage, in bytes."}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"N/A"}),(0,r.jsx)(n.td,{children:"1024-16384"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"engines.rocksdb"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"Rocksdb configuration."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"rocksdb.flushDelayMillis"}),(0,r.jsx)(n.td,{children:"100"}),(0,r.jsx)(n.td,{children:"Delay before executing a flush triggered by RAFT."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Refreshed on engine registration"}),(0,r.jsx)(n.td,{children:"0 - inf"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"profiles"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"The list of available storage profiles."}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"engine"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"The storage engine."}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"N/A"}),(0,r.jsx)(n.td,{children:"aimem, aipersist, rocksdb"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"name"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"User-defined profile name."}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"N/A"}),(0,r.jsx)(n.td,{children:"A valid name"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"replacementMode"}),(0,r.jsx)(n.td,{children:"CLOCK"}),(0,r.jsx)(n.td,{children:"Sets the page replacement algorithm."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"CLOCK, RANDOM_LRU, SEGMENTED_LRU"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"size"}),(0,r.jsx)(n.td,{children:"256Mb"}),(0,r.jsx)(n.td,{children:"Memory (RAM) region size."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Min 256Mb, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.sizeBytes"}),(0,r.jsx)(n.td,{children:"268435456"}),(0,r.jsx)(n.td,{children:"Memory (offheap) region size."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Min 268435456, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aipersist.replacementMode"}),(0,r.jsx)(n.td,{children:"CLOCK"}),(0,r.jsx)(n.td,{children:"Sets the page replacement algorithm."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"CLOCK, RANDOM_LRU, SEGMENTED_LRU"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aimem.initSizeBytes"}),(0,r.jsx)(n.td,{children:"268435456"}),(0,r.jsx)(n.td,{children:"Initial memory region size in bytes, when the used memory size exceeds this value, new chunks of memory will be allocated."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Min 256Mb, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"aimem.maxSizeBytes"}),(0,r.jsx)(n.td,{children:"268435456"}),(0,r.jsx)(n.td,{children:"Maximum memory region size in bytes."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Min 256Mb, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"rocksdb.sizeBytes"}),(0,r.jsx)(n.td,{children:"268435456"}),(0,r.jsx)(n.td,{children:"Size of the rocksdb offheap cache."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Min 0, max defined by the addressable memory limit of the OS"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"rocksdb.writeBufferSizeBytes"}),(0,r.jsx)(n.td,{children:"67108864"}),(0,r.jsx)(n.td,{children:"Size of rocksdb write buffer."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Min 1, max defined by the addressable memory limit of the OS"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"system-configuration",children:"System Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["This section describes internal properties used by Ignite components. Although you can edit these properties using the ",(0,r.jsx)(n.code,{children:"node config update"})," CLI command, we suggest discussing proposed changes with the Ignite support team. These properties apply to a specific node. For cluster-wide properties, see ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/reference/cluster-configuration#system-configuration-internal",children:"Cluster Configuration"}),"."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Note that the property names are in ",(0,r.jsx)(n.code,{children:"camelCase"}),"."]})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "system" : {\r\n "cmgPath" : "",\r\n "metastoragePath" : "",\r\n "partitionsBasePath" : "",\r\n "partitionsLogPath" : "",\r\n "properties":[],\r\n "criticalWorkers" : {\r\n "livenessCheckIntervalMillis" : 2000,\r\n "maxAllowedLagMillis" : 5000,\r\n "nettyThreadsHeartbeatIntervalMillis" : 1000\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Property"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Changeable"}),(0,r.jsx)(n.th,{children:"Requires Restart"}),(0,r.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.cmgPath"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The path the cluster management group information is stored to. Only applicable if the node is part of CMG. By default, data is stored in ",(0,r.jsx)(n.code,{children:"{IGNITE_HOME}/work/cmg"}),". It is recommended to only change this path on an empty node."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.metastoragePath"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The path the cluster meta information is stored to. Only applicable if the node is part of the metastorage group. By default, data is stored in ",(0,r.jsx)(n.code,{children:"{IGNITE_HOME}/work/metastorage"}),". It is recommended to only change this path on an empty node."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.partitionsBasePath"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The path data partitions are saved to on the node. By default, partitions are stored in ",(0,r.jsx)(n.code,{children:"{IGNITE_HOME}/work/partitions"}),". It is recommended to only change this path on an empty node."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.partitionsLogPath"}),(0,r.jsx)(n.td,{}),(0,r.jsxs)(n.td,{children:["The path RAFT log the partitions are stored at. By default, this log is stored in ",(0,r.jsx)(n.code,{children:"{system.partitionsBasePath}/log"}),". It is recommended to only change this path on an empty node."]}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Valid absolute path."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.properties"}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"System properties used by the Ignite components."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"A map of properties."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.criticalWorkers.livenessCheckIntervalMillis"}),(0,r.jsx)(n.td,{children:"2000"}),(0,r.jsx)(n.td,{children:"Interval between liveness checks (ms) performed by the critical worker infrastructure."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf (not greater than half of maxAllowedLagMillis)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.criticalWorkers.maxAllowedLagMillis"}),(0,r.jsx)(n.td,{children:"5000"}),(0,r.jsx)(n.td,{children:"Maximum allowed delay from the last heartbeat to the current time (ms). If exceeded, the critical worker is considered to be blocked."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"1 - inf (should be at least twice livenessCheckInterval)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"system.criticalWorkers.nettyThreadsHeartbeatIntervalMillis"}),(0,r.jsx)(n.td,{children:"1000"}),(0,r.jsx)(n.td,{children:"Interval between heartbeats used to update the Netty threads' heartbeat timestamps (ms)."}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"1 - inf"})]})]})]})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/cbbcdc53.fe33193e.js b/docs/ignite3/assets/js/cbbcdc53.fe33193e.js deleted file mode 100644 index 476318b2e2..0000000000 --- a/docs/ignite3/assets/js/cbbcdc53.fe33193e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9242],{28453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>o});var i=r(96540);const t={},s=i.createContext(t);function a(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(s.Provider,{value:n},e.children)}},88816:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"understand/architecture/storage-engines/aimem","title":"AIMemory Storage Engine","description":"The AIMemory engine (aimem) stores all data in off-heap memory using B+ tree structures. Data is volatile and lost on node shutdown. Use this engine for caching, temporary tables, or workloads where persistence is unnecessary.","source":"@site/docs/understand/architecture/storage-engines/aimem.md","sourceDirName":"understand/architecture/storage-engines","slug":"/understand/architecture/storage-engines/aimem","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"id":"aimem","title":"AIMemory Storage Engine","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Storage Engines","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/"},"next":{"title":"AIPersist Storage Engine","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist"}}');var t=r(74848),s=r(28453);const a={id:"aimem",title:"AIMemory Storage Engine",sidebar_position:3},o="AIMemory Storage Engine",d={},c=[{value:"Memory Architecture",id:"memory-architecture",level:2},{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Engine Configuration",id:"engine-configuration",level:2},{value:"Configuration Example",id:"configuration-example",level:2},{value:"Usage",id:"usage",level:2}];function l(e){const n={code:"code",h1:"h1",h2:"h2",header:"header",li:"li",mermaid:"mermaid",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"aimemory-storage-engine",children:"AIMemory Storage Engine"})}),"\n",(0,t.jsxs)(n.p,{children:["The AIMemory engine (",(0,t.jsx)(n.code,{children:"aimem"}),") stores all data in off-heap memory using B+ tree structures. Data is volatile and lost on node shutdown. Use this engine for caching, temporary tables, or workloads where persistence is unnecessary."]}),"\n",(0,t.jsx)(n.h2,{id:"memory-architecture",children:"Memory Architecture"}),"\n",(0,t.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "AIMemory Data Region"\r\n subgraph "Memory Segments (up to 16)"\r\n S1[Segment 1
                                                              Initial Allocation]\r\n S2[Segment 2
                                                              On-demand]\r\n S3[Segment 3
                                                              On-demand]\r\n SN[Segment N...]\r\n end\r\n\r\n subgraph "Page Structure"\r\n direction LR\r\n PH[Page Header
                                                              32 bytes]\r\n PD[Page Data
                                                              16 KB default]\r\n end\r\n\r\n subgraph "Data Structures"\r\n BT[B+ Tree
                                                              Version Chains]\r\n IDX[B+ Tree
                                                              Indexes]\r\n FL[Free List]\r\n end\r\n end\r\n\r\n S1 --\x3e PH\r\n PH --\x3e PD\r\n PD --\x3e BT & IDX\r\n FL --\x3e S1 & S2 & S3'}),"\n",(0,t.jsx)(n.p,{children:"Key characteristics:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Memory allocated in segments, starting with ",(0,t.jsx)(n.code,{children:"initSizeBytes"})," and expanding on demand"]}),"\n",(0,t.jsx)(n.li,{children:"Up to 16 segments per data region, minimum 256 MB per segment expansion"}),"\n",(0,t.jsx)(n.li,{children:"Default page size: 16 KB (configurable from 1 KB to 16 KB, must be power of 2)"}),"\n",(0,t.jsx)(n.li,{children:"32-byte overhead per page for header and locking structures"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"engine"})}),(0,t.jsx)(n.td,{children:"-"}),(0,t.jsxs)(n.td,{children:["Must be ",(0,t.jsx)(n.code,{children:'"aimem"'})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"initSizeBytes"})}),(0,t.jsx)(n.td,{children:"Dynamic"}),(0,t.jsxs)(n.td,{children:["Initial memory allocation. Defaults to ",(0,t.jsx)(n.code,{children:"maxSizeBytes"})," value"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"maxSizeBytes"})}),(0,t.jsx)(n.td,{children:"Dynamic"}),(0,t.jsxs)(n.td,{children:["Maximum memory. Defaults to ",(0,t.jsx)(n.code,{children:"max(256 MB, 20% of physical RAM)"})]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"engine-configuration",children:"Engine Configuration"}),"\n",(0,t.jsx)(n.p,{children:"Page size is configured at the engine level and applies to all aimem profiles:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Property"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsx)(n.tbody,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"pageSizeBytes"})}),(0,t.jsx)(n.td,{children:"16384"}),(0,t.jsx)(n.td,{children:"Page size in bytes (1024 to 16384, power of 2)"})]})})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# Configure engine-level page size\r\nnode config update ignite.storage.engines.aimem.pageSizeBytes=8192\n"})}),"\n",(0,t.jsx)(n.h2,{id:"configuration-example",children:"Configuration Example"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite": {\r\n "storage": {\r\n "profiles": [\r\n {\r\n "engine": "aimem",\r\n "name": "cache_profile",\r\n "initSizeBytes": 536870912,\r\n "maxSizeBytes": 1073741824\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'# CLI equivalent\r\nnode config update "ignite.storage.profiles:{cache_profile{engine:aimem,maxSizeBytes:1073741824}}"\n'})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- Create a zone using the volatile profile\r\nCREATE ZONE cache_zone\r\n WITH PARTITIONS=10, REPLICAS=2,\r\n STORAGE PROFILES ['cache_profile'];\r\n\r\n-- Create a table for session data (acceptable to lose on restart)\r\nCREATE TABLE sessions (\r\n session_id UUID PRIMARY KEY,\r\n user_id INT,\r\n data VARCHAR,\r\n expires_at TIMESTAMP\r\n) ZONE cache_zone STORAGE PROFILE 'cache_profile';\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/cd6ed4c4.4b3e55a5.js b/docs/ignite3/assets/js/cd6ed4c4.4b3e55a5.js deleted file mode 100644 index e0978f5a22..0000000000 --- a/docs/ignite3/assets/js/cd6ed4c4.4b3e55a5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1516],{5116:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"api-reference/native-clients/cpp/client-api","title":"Client API","description":"The C++ client provides a thin client connection to Apache Ignite clusters. It manages network connections, handles authentication, and provides access to all Ignite APIs through a single entry point.","source":"@site/docs/api-reference/native-clients/cpp/client-api.md","sourceDirName":"api-reference/native-clients/cpp","slug":"/api-reference/native-clients/cpp/client-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Client API","id":"client-api","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"C++ API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/"},"next":{"title":"Tables API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api"}}');var c=i(74848),s=i(28453);const l={title:"Client API",id:"client-api",sidebar_position:1},r="Client API",o={},a=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Client Lifecycle",id:"client-lifecycle",level:3},{value:"Configuration",id:"configuration",level:3},{value:"API Access",id:"api-access",level:3},{value:"Basic Usage",id:"basic-usage",level:2},{value:"Starting a Client",id:"starting-a-client",level:3},{value:"Asynchronous Startup",id:"asynchronous-startup",level:3},{value:"Authentication",id:"authentication",level:3},{value:"SSL/TLS Configuration",id:"ssltls-configuration",level:3},{value:"Accessing APIs",id:"accessing-apis",level:3},{value:"Configuration Retrieval",id:"configuration-retrieval",level:3},{value:"Configuration Options",id:"configuration-options",level:2},{value:"Connection Settings",id:"connection-settings",level:3},{value:"Security Settings",id:"security-settings",level:3},{value:"Logging",id:"logging",level:3},{value:"Error Handling",id:"error-handling",level:2},{value:"Connection Management",id:"connection-management",level:2},{value:"Heartbeat",id:"heartbeat",level:3},{value:"Connection Pooling",id:"connection-pooling",level:3},{value:"Reference",id:"reference",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"client-api",children:"Client API"})}),"\n",(0,c.jsx)(n.p,{children:"The C++ client provides a thin client connection to Apache Ignite clusters. It manages network connections, handles authentication, and provides access to all Ignite APIs through a single entry point."}),"\n",(0,c.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,c.jsx)(n.h3,{id:"client-lifecycle",children:"Client Lifecycle"}),"\n",(0,c.jsx)(n.p,{children:"The client uses static factory methods to establish connections. Start methods block until the connection succeeds or times out. The client maintains active connections through configurable heartbeat intervals."}),"\n",(0,c.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,c.jsxs)(n.p,{children:["Client configuration specifies connection endpoints, authentication, SSL/TLS settings, and connection parameters. Endpoints use ",(0,c.jsx)(n.code,{children:"host:port"})," format with a default port of 10800. The client maintains a connection pool with configurable limits."]}),"\n",(0,c.jsx)(n.h3,{id:"api-access",children:"API Access"}),"\n",(0,c.jsx)(n.p,{children:"The client provides access to all Ignite APIs through dedicated getters:"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"get_tables()"})," - Table operations"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"get_sql()"})," - SQL execution"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"get_transactions()"})," - Transaction management"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"get_compute()"})," - Distributed computing"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"get_cluster_nodes()"})," - Cluster topology"]}),"\n"]}),"\n",(0,c.jsx)(n.h2,{id:"basic-usage",children:"Basic Usage"}),"\n",(0,c.jsx)(n.h3,{id:"starting-a-client",children:"Starting a Client"}),"\n",(0,c.jsx)(n.p,{children:"Start a client with default configuration:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:'using namespace ignite;\r\n\r\nignite_client_configuration cfg{{"localhost:10800"}};\r\nignite_client client = ignite_client::start(cfg, std::chrono::seconds(30));\n'})}),"\n",(0,c.jsx)(n.p,{children:"Configure connection parameters:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:'ignite_client_configuration cfg{{"host1:10800", "host2:10800"}};\r\ncfg.set_connection_limit(10);\r\ncfg.set_heartbeat_interval(std::chrono::seconds(30));\r\n\r\nignite_client client = ignite_client::start(cfg, std::chrono::seconds(30));\n'})}),"\n",(0,c.jsx)(n.h3,{id:"asynchronous-startup",children:"Asynchronous Startup"}),"\n",(0,c.jsx)(n.p,{children:"Start the client without blocking:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:'ignite_client_configuration cfg{{"localhost:10800"}};\r\n\r\nignite_client::start_async(cfg, std::chrono::seconds(30),\r\n [](ignite_result result) {\r\n if (!result.has_error()) {\r\n ignite_client client = std::move(result).value();\r\n // Use client\r\n }\r\n });\n'})}),"\n",(0,c.jsx)(n.h3,{id:"authentication",children:"Authentication"}),"\n",(0,c.jsx)(n.p,{children:"Configure basic authentication:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:'ignite_client_configuration cfg{{"localhost:10800"}};\r\ncfg.set_authenticator(std::make_shared("username", "password"));\r\n\r\nignite_client client = ignite_client::start(cfg, std::chrono::seconds(30));\n'})}),"\n",(0,c.jsx)(n.h3,{id:"ssltls-configuration",children:"SSL/TLS Configuration"}),"\n",(0,c.jsx)(n.p,{children:"Enable SSL with certificates:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:'ignite_client_configuration cfg{{"localhost:10800"}};\r\ncfg.set_ssl_mode(ssl_mode::REQUIRE);\r\ncfg.set_ssl_cert_file("/path/to/client.pem");\r\ncfg.set_ssl_key_file("/path/to/client.key");\r\ncfg.set_ssl_ca_file("/path/to/ca.pem");\r\n\r\nignite_client client = ignite_client::start(cfg, std::chrono::seconds(30));\n'})}),"\n",(0,c.jsx)(n.h3,{id:"accessing-apis",children:"Accessing APIs"}),"\n",(0,c.jsx)(n.p,{children:"Access table operations:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:'auto tables = client.get_tables();\r\nauto table = tables.get_table("my_table");\n'})}),"\n",(0,c.jsx)(n.p,{children:"Access SQL:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:'auto sql = client.get_sql();\r\nauto result = sql.execute(nullptr, nullptr, sql_statement("SELECT * FROM t"), {});\n'})}),"\n",(0,c.jsx)(n.p,{children:"Access transactions:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:"auto transactions = client.get_transactions();\r\nauto tx = transactions.begin();\r\n// Perform operations\r\ntx.commit();\n"})}),"\n",(0,c.jsx)(n.p,{children:"Access compute:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:"auto compute = client.get_compute();\r\nauto nodes = client.get_cluster_nodes();\n"})}),"\n",(0,c.jsx)(n.h3,{id:"configuration-retrieval",children:"Configuration Retrieval"}),"\n",(0,c.jsx)(n.p,{children:"Retrieve the active configuration:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:"const ignite_client_configuration& config = client.configuration();\r\nauto endpoints = config.get_endpoints();\r\nauto connection_limit = config.get_connection_limit();\n"})}),"\n",(0,c.jsx)(n.h2,{id:"configuration-options",children:"Configuration Options"}),"\n",(0,c.jsx)(n.h3,{id:"connection-settings",children:"Connection Settings"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"set_endpoints(std::vector)"})," - Server endpoints (required, non-empty)"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"set_connection_limit(uint32_t)"})," - Maximum active connections"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"set_heartbeat_interval(std::chrono::microseconds)"})," - Heartbeat interval (0 disables heartbeat)"]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"security-settings",children:"Security Settings"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"set_authenticator(std::shared_ptr)"})," - Authentication provider"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"set_ssl_mode(ssl_mode)"})," - SSL/TLS mode (DISABLE, REQUIRE)"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"set_ssl_cert_file(std::string)"})," - Client certificate path"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"set_ssl_key_file(std::string)"})," - Private key path"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"set_ssl_ca_file(std::string)"})," - CA certificate path"]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"logging",children:"Logging"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"set_logger(std::shared_ptr)"})," - Custom logger implementation"]}),"\n"]}),"\n",(0,c.jsx)(n.h2,{id:"error-handling",children:"Error Handling"}),"\n",(0,c.jsxs)(n.p,{children:["Client operations throw ",(0,c.jsx)(n.code,{children:"ignite_error"})," on failure. Async operations deliver errors through the callback result:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:'ignite_client::start_async(cfg, timeout, [](ignite_result result) {\r\n if (result.has_error()) {\r\n // Handle error\r\n std::cerr << "Connection failed: " << result.error().what_str() << std::endl;\r\n } else {\r\n auto client = std::move(result).value();\r\n // Use client\r\n }\r\n});\n'})}),"\n",(0,c.jsx)(n.h2,{id:"connection-management",children:"Connection Management"}),"\n",(0,c.jsx)(n.h3,{id:"heartbeat",children:"Heartbeat"}),"\n",(0,c.jsx)(n.p,{children:"Heartbeat keeps connections alive during idle periods. The default interval is 30 seconds. Set to zero to disable:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:"cfg.set_heartbeat_interval(std::chrono::seconds(0)); // Disable heartbeat\n"})}),"\n",(0,c.jsx)(n.p,{children:"Disabling heartbeat may cause the server to close idle connections."}),"\n",(0,c.jsx)(n.h3,{id:"connection-pooling",children:"Connection Pooling"}),"\n",(0,c.jsx)(n.p,{children:"The client maintains a pool of connections to cluster nodes. Configure the maximum pool size:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-cpp",children:"cfg.set_connection_limit(20); // Allow up to 20 active connections\n"})}),"\n",(0,c.jsx)(n.p,{children:"Connection management happens automatically based on operation distribution."}),"\n",(0,c.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/cppdoc/",children:"C++ API Documentation"})}),"\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.a,{href:"./tables-api",children:"Tables API"})}),"\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.a,{href:"./sql-api",children:"SQL API"})}),"\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.a,{href:"./transactions-api",children:"Transactions API"})}),"\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.a,{href:"./compute-api",children:"Compute API"})}),"\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.a,{href:"./network-api",children:"Network API"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(d,{...e})}):d(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>r});var t=i(96540);const c={},s=t.createContext(c);function l(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:l(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/cf4f3c50.692892a0.js b/docs/ignite3/assets/js/cf4f3c50.692892a0.js deleted file mode 100644 index 5f41798f8e..0000000000 --- a/docs/ignite3/assets/js/cf4f3c50.692892a0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[607],{28453:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>c});var t=i(96540);const r={},s=t.createContext(r);function a(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(s.Provider,{value:n},e.children)}},61398:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>g,frontMatter:()=>a,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"api-reference/native-clients/dotnet/client-api","title":"Client API","description":"The Client API provides connection management and access to all Ignite 3 functionality. IIgniteClient serves as the entry point for interacting with an Ignite cluster from .NET applications.","source":"@site/docs/api-reference/native-clients/dotnet/client-api.md","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/client-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Client API","id":"client-api","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":".NET API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/"},"next":{"title":"Tables API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api"}}');var r=i(74848),s=i(28453);const a={title:"Client API",id:"client-api",sidebar_position:1},c="Client API",o={},l=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Connection Management",id:"connection-management",level:3},{value:"Thread Safety",id:"thread-safety",level:3},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Basic Connection",id:"basic-connection",level:3},{value:"Multiple Endpoints",id:"multiple-endpoints",level:3},{value:"Connection Lifecycle",id:"connection-lifecycle",level:3},{value:"Logging Configuration",id:"logging-configuration",level:3},{value:"Operation Timeout",id:"operation-timeout",level:3},{value:"Retry Policy",id:"retry-policy",level:3},{value:"Accessing Core APIs",id:"accessing-core-apis",level:3},{value:"Reference",id:"reference",level:2},{value:"IIgniteClient Interface",id:"iigniteclient-interface",level:3},{value:"IgniteClientConfiguration",id:"igniteclientconfiguration",level:3},{value:"Constants",id:"constants",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"client-api",children:"Client API"})}),"\n",(0,r.jsx)(n.p,{children:"The Client API provides connection management and access to all Ignite 3 functionality. IIgniteClient serves as the entry point for interacting with an Ignite cluster from .NET applications."}),"\n",(0,r.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,r.jsx)(n.p,{children:"IIgniteClient manages connections to cluster nodes and provides access to tables, SQL, transactions, compute, and other Ignite APIs. The client automatically maintains connections to multiple nodes for high availability and load balancing."}),"\n",(0,r.jsx)(n.h3,{id:"connection-management",children:"Connection Management"}),"\n",(0,r.jsx)(n.p,{children:"The client maintains a pool of connections to cluster nodes. When you specify multiple endpoints in the configuration, the client connects to all available nodes and distributes requests across them. If a node fails, the client automatically reconnects using the configured reconnect interval."}),"\n",(0,r.jsx)(n.h3,{id:"thread-safety",children:"Thread Safety"}),"\n",(0,r.jsx)(n.p,{children:"All IIgniteClient operations are thread-safe. You can share a single client instance across your application and call methods from multiple threads without additional synchronization."}),"\n",(0,r.jsx)(n.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,r.jsx)(n.h3,{id:"basic-connection",children:"Basic Connection"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'using Apache.Ignite;\r\n\r\nvar cfg = new IgniteClientConfiguration("localhost:10800");\r\nusing var client = await IgniteClient.StartAsync(cfg);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"multiple-endpoints",children:"Multiple Endpoints"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var cfg = new IgniteClientConfiguration\r\n{\r\n Endpoints = { "node1:10800", "node2:10800", "node3:10800" }\r\n};\r\nusing var client = await IgniteClient.StartAsync(cfg);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"connection-lifecycle",children:"Connection Lifecycle"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var cfg = new IgniteClientConfiguration("localhost:10800")\r\n{\r\n SocketTimeout = TimeSpan.FromSeconds(60),\r\n HeartbeatInterval = TimeSpan.FromSeconds(30),\r\n ReconnectInterval = TimeSpan.FromSeconds(10)\r\n};\r\n\r\nusing var client = await IgniteClient.StartAsync(cfg);\r\n\r\n// Check active connections\r\nvar connections = client.GetConnections();\r\nforeach (var conn in connections)\r\n{\r\n Console.WriteLine($"Connected to {conn.Node.Name}");\r\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"logging-configuration",children:"Logging Configuration"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'using Microsoft.Extensions.Logging;\r\n\r\nvar loggerFactory = LoggerFactory.Create(builder =>\r\n builder.AddConsole().SetMinimumLevel(LogLevel.Debug));\r\n\r\nvar cfg = new IgniteClientConfiguration("localhost:10800")\r\n{\r\n LoggerFactory = loggerFactory\r\n};\r\n\r\nusing var client = await IgniteClient.StartAsync(cfg);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"operation-timeout",children:"Operation Timeout"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var cfg = new IgniteClientConfiguration("localhost:10800")\r\n{\r\n OperationTimeout = TimeSpan.FromSeconds(30)\r\n};\r\n\r\nusing var client = await IgniteClient.StartAsync(cfg);\n'})}),"\n",(0,r.jsx)(n.p,{children:"This timeout applies to individual operations. Long-running queries or transactions are not affected unless they involve multiple round-trips to the cluster."}),"\n",(0,r.jsx)(n.h3,{id:"retry-policy",children:"Retry Policy"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'using Apache.Ignite;\r\n\r\nvar cfg = new IgniteClientConfiguration("localhost:10800")\r\n{\r\n RetryPolicy = new RetryReadPolicy()\r\n};\r\n\r\nusing var client = await IgniteClient.StartAsync(cfg);\n'})}),"\n",(0,r.jsx)(n.p,{children:"The retry policy controls automatic retry behavior for failed requests. RetryReadPolicy retries only read operations, while RetryNonePolicy disables retries."}),"\n",(0,r.jsx)(n.h3,{id:"accessing-core-apis",children:"Accessing Core APIs"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'using var client = await IgniteClient.StartAsync(cfg);\r\n\r\n// Tables API\r\nvar tables = client.Tables;\r\nvar table = await tables.GetTableAsync("my_table");\r\n\r\n// SQL API\r\nvar sql = client.Sql;\r\nvar resultSet = await sql.ExecuteAsync(null, "SELECT * FROM my_table");\r\n\r\n// Transactions API\r\nvar transactions = client.Transactions;\r\nvar tx = await transactions.BeginAsync();\r\n\r\n// Compute API\r\nvar compute = client.Compute;\n'})}),"\n",(0,r.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,r.jsx)(n.h3,{id:"iigniteclient-interface",children:"IIgniteClient Interface"}),"\n",(0,r.jsx)(n.p,{children:"The main client interface provides:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Configuration"})," - Access to the client configuration used at startup"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"GetConnections()"})," - Returns active connections to cluster nodes"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Tables"})," - Access to table management and data operations"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Sql"})," - SQL query execution"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Transactions"})," - Transaction management"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Compute"})," - Distributed computing"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"igniteclientconfiguration",children:"IgniteClientConfiguration"}),"\n",(0,r.jsx)(n.p,{children:"Configuration properties:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Endpoints"})," - List of cluster node addresses to connect to"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"LoggerFactory"})," - Microsoft.Extensions.Logging.ILoggerFactory for diagnostics"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"SocketTimeout"})," - Timeout for socket operations including handshake and heartbeats (default: 30 seconds)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"OperationTimeout"})," - Timeout for individual operations (default: infinite)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"HeartbeatInterval"})," - Interval between heartbeat messages (default: 30 seconds)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"ReconnectInterval"})," - Interval for background reconnection attempts (default: 30 seconds)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"RetryPolicy"})," - Policy for retrying failed requests (default: RetryReadPolicy)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"SslStreamFactory"})," - Factory for creating SSL streams when SSL is required"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Authenticator"})," - Authentication handler for cluster access"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"constants",children:"Constants"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"DefaultPort"})," - 10800"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"DefaultSocketTimeout"})," - 30 seconds"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"DefaultHeartbeatInterval"})," - 30 seconds"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"DefaultReconnectInterval"})," - 30 seconds"]}),"\n"]})]})}function g(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/cfa06b25.bac15879.js b/docs/ignite3/assets/js/cfa06b25.bac15879.js deleted file mode 100644 index f7e3e55342..0000000000 --- a/docs/ignite3/assets/js/cfa06b25.bac15879.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7164],{16173:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"api-reference/native-clients/java/client-api","title":"Client API","description":"The IgniteClient provides a lightweight connection to an Ignite cluster. Applications use the client to access data and execute operations without running a full cluster node. The client maintains connection pools, handles automatic reconnection, and supports authentication and TLS encryption.","source":"@site/docs/api-reference/native-clients/java/client-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/client-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Client API","id":"client-api","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Java API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/"},"next":{"title":"Server API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api"}}');var c=i(74848),r=i(28453);const o={title:"Client API",id:"client-api",sidebar_position:1},l="Client API",s={},a=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Connection Configuration",id:"connection-configuration",level:2},{value:"Connection Resilience",id:"connection-resilience",level:2},{value:"Retry Policies",id:"retry-policies",level:2},{value:"Authentication",id:"authentication",level:2},{value:"TLS Configuration",id:"tls-configuration",level:2},{value:"Asynchronous Connection",id:"asynchronous-connection",level:2},{value:"Active Connections",id:"active-connections",level:2},{value:"Resource Management",id:"resource-management",level:2},{value:"Configuration Access",id:"configuration-access",level:2},{value:"Reference",id:"reference",level:2},{value:"Builder Configuration Methods",id:"builder-configuration-methods",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"client-api",children:"Client API"})}),"\n",(0,c.jsx)(n.p,{children:"The IgniteClient provides a lightweight connection to an Ignite cluster. Applications use the client to access data and execute operations without running a full cluster node. The client maintains connection pools, handles automatic reconnection, and supports authentication and TLS encryption."}),"\n",(0,c.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,c.jsx)(n.p,{children:"The client implements the Ignite interface and adds connection management capabilities. Unlike embedded nodes, clients do not store data or participate in cluster consensus. Clients connect to server nodes via a binary protocol over TCP."}),"\n",(0,c.jsx)(n.p,{children:"The client builder pattern configures connection parameters before establishing cluster connectivity. Once created, the client provides access to tables, SQL, transactions, compute, and catalog APIs."}),"\n",(0,c.jsx)(n.h2,{id:"connection-configuration",children:"Connection Configuration"}),"\n",(0,c.jsx)(n.p,{children:"Configure the client using the builder:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800", "server2:10800")\r\n .connectTimeout(5000)\r\n .operationTimeout(30000)\r\n .heartbeatInterval(3000)\r\n .heartbeatTimeout(5000)\r\n .retryPolicy(new RetryReadPolicy())\r\n .build()) {\r\n\r\n String nodeName = client.name();\r\n System.out.println("Connected to: " + nodeName);\r\n}\n'})}),"\n",(0,c.jsxs)(n.p,{children:["The ",(0,c.jsx)(n.code,{children:"addresses()"})," method accepts multiple server endpoints. The client attempts connections in order and maintains active connections to all reachable servers for load distribution."]}),"\n",(0,c.jsx)(n.h2,{id:"connection-resilience",children:"Connection Resilience"}),"\n",(0,c.jsx)(n.p,{children:"The client automatically reconnects when connections fail. Configure reconnection behavior with timeout and interval settings:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("server1:10800", "server2:10800")\r\n .backgroundReconnectInterval(1000)\r\n .build();\n'})}),"\n",(0,c.jsxs)(n.p,{children:["The ",(0,c.jsx)(n.code,{children:"backgroundReconnectInterval()"})," parameter controls how frequently the client attempts to restore lost connections."]}),"\n",(0,c.jsx)(n.h2,{id:"retry-policies",children:"Retry Policies"}),"\n",(0,c.jsx)(n.p,{children:"Retry policies determine which failed operations should be retried. Use RetryReadPolicy to retry read-only operations while preventing duplicate writes:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .retryPolicy(new RetryReadPolicy())\r\n .build();\n'})}),"\n",(0,c.jsx)(n.p,{children:"Create custom retry policies by implementing the RetryPolicy interface. The policy receives context about the failed operation and returns whether to retry."}),"\n",(0,c.jsx)(n.h2,{id:"authentication",children:"Authentication"}),"\n",(0,c.jsx)(n.p,{children:"Configure authentication using the authenticator builder parameter:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .authenticator(BasicAuthenticator.builder()\r\n .username("username")\r\n .password("password")\r\n .build())\r\n .build();\n'})}),"\n",(0,c.jsx)(n.p,{children:"BasicAuthenticator provides username and password authentication. The client sends credentials during connection establishment."}),"\n",(0,c.jsx)(n.h2,{id:"tls-configuration",children:"TLS Configuration"}),"\n",(0,c.jsx)(n.p,{children:"Enable TLS for encrypted client-server communication:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-java",children:'SslConfiguration ssl = SslConfiguration.builder()\r\n .enabled(true)\r\n .trustStorePath("/path/to/truststore.jks")\r\n .trustStorePassword("password")\r\n .build();\r\n\r\nIgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .ssl(ssl)\r\n .build();\n'})}),"\n",(0,c.jsx)(n.p,{children:"Configure keystore settings when using client certificate authentication."}),"\n",(0,c.jsx)(n.h2,{id:"asynchronous-connection",children:"Asynchronous Connection"}),"\n",(0,c.jsx)(n.p,{children:"Build the client asynchronously to avoid blocking during connection establishment:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-java",children:'CompletableFuture clientFuture = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .buildAsync();\r\n\r\nclientFuture.thenAccept(client -> {\r\n // Use client\r\n}).exceptionally(ex -> {\r\n // Handle connection failure\r\n return null;\r\n});\n'})}),"\n",(0,c.jsx)(n.p,{children:"Asynchronous building returns immediately while the client establishes connections in the background."}),"\n",(0,c.jsx)(n.h2,{id:"active-connections",children:"Active Connections"}),"\n",(0,c.jsx)(n.p,{children:"Retrieve information about active server connections:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-java",children:'List connections = client.connections();\r\nfor (ClusterNode node : connections) {\r\n System.out.println("Connected to: " + node.name());\r\n}\n'})}),"\n",(0,c.jsx)(n.p,{children:"The connections list reflects currently active client-server connections."}),"\n",(0,c.jsx)(n.h2,{id:"resource-management",children:"Resource Management"}),"\n",(0,c.jsx)(n.p,{children:"Close the client to release network connections and resources:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("localhost:10800")\r\n .build()) {\r\n\r\n // Use client\r\n} // Automatically closed\n'})}),"\n",(0,c.jsx)(n.p,{children:"Use try-with-resources to ensure proper cleanup. Closing the client terminates all active operations and connections."}),"\n",(0,c.jsx)(n.h2,{id:"configuration-access",children:"Configuration Access"}),"\n",(0,c.jsx)(n.p,{children:"Access the current client configuration:"}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-java",children:"IgniteClientConfiguration config = client.configuration();\r\nlong timeout = config.operationTimeout();\n"})}),"\n",(0,c.jsx)(n.p,{children:"The configuration object provides read-only access to connection settings."}),"\n",(0,c.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:["Key interface: ",(0,c.jsx)(n.code,{children:"org.apache.ignite.client.IgniteClient"})]}),"\n",(0,c.jsxs)(n.li,{children:["Builder: ",(0,c.jsx)(n.code,{children:"IgniteClient.Builder"})]}),"\n",(0,c.jsxs)(n.li,{children:["Configuration: ",(0,c.jsx)(n.code,{children:"org.apache.ignite.client.IgniteClientConfiguration"})]}),"\n",(0,c.jsxs)(n.li,{children:["Authentication: ",(0,c.jsx)(n.code,{children:"org.apache.ignite.client.IgniteClientAuthenticator"}),", ",(0,c.jsx)(n.code,{children:"org.apache.ignite.client.BasicAuthenticator"})]}),"\n",(0,c.jsxs)(n.li,{children:["TLS: ",(0,c.jsx)(n.code,{children:"org.apache.ignite.client.SslConfiguration"})]}),"\n",(0,c.jsxs)(n.li,{children:["Retry: ",(0,c.jsx)(n.code,{children:"org.apache.ignite.client.RetryPolicy"}),", ",(0,c.jsx)(n.code,{children:"org.apache.ignite.client.RetryReadPolicy"})]}),"\n"]}),"\n",(0,c.jsx)(n.h3,{id:"builder-configuration-methods",children:"Builder Configuration Methods"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"addresses(String...)"})," - Server endpoints (host",":port"," format)"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"connectTimeout(long)"})," - Socket connection timeout in milliseconds"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"operationTimeout(long)"})," - Default operation timeout in milliseconds"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"heartbeatInterval(long)"})," - Heartbeat message interval in milliseconds"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"heartbeatTimeout(long)"})," - Heartbeat timeout in milliseconds"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"backgroundReconnectInterval(long)"})," - Reconnection attempt interval in milliseconds"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"retryPolicy(RetryPolicy)"})," - Retry policy for failed operations"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"authenticator(IgniteClientAuthenticator)"})," - Authentication configuration"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"ssl(SslConfiguration)"})," - TLS configuration"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"metricsEnabled(boolean)"})," - Enable JMX metrics collection"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"loggerFactory(LoggerFactory)"})," - Custom logger factory"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"build()"})," - Create client synchronously"]}),"\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.code,{children:"buildAsync()"})," - Create client asynchronously"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(d,{...e})}):d(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var t=i(96540);const c={},r=t.createContext(c);function o(e){const n=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/cfc81aaa.f71159d5.js b/docs/ignite3/assets/js/cfc81aaa.f71159d5.js deleted file mode 100644 index 29a8903a5c..0000000000 --- a/docs/ignite3/assets/js/cfc81aaa.f71159d5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8345],{22462:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"getting-started/embedded-mode","title":"Embedded Mode","description":"In most scenarios, you would use Ignite CLI tool to start and manage your Ignite cluster. However, in some scenarios it is preferable to manage the cluster from a Java project. Starting and working with the cluster from code is called \\"embedded mode\\".","source":"@site/docs/getting-started/embedded-mode.md","sourceDirName":"getting-started","slug":"/getting-started/embedded-mode","permalink":"/docs/ignite3/3.1.0/getting-started/embedded-mode","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Embedded Mode"},"sidebar":"tutorialSidebar","previous":{"title":"Using Java API","permalink":"/docs/ignite3/3.1.0/getting-started/key-value-api"},"next":{"title":"Configuration Tips","permalink":"/docs/ignite3/3.1.0/getting-started/best-practices"}}');var r=t(74848),a=t(28453);const s={title:"Embedded Mode"},o=void 0,d={},l=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Add Ignite to Your Project",id:"add-ignite-to-your-project",level:2},{value:"Prepare Ignite Configuration",id:"prepare-ignite-configuration",level:2},{value:"Pass JVM Parameters",id:"pass-jvm-parameters",level:2},{value:"Start Ignite Server Nodes",id:"start-ignite-server-nodes",level:2},{value:"Initiate a Cluster",id:"initiate-a-cluster",level:2},{value:"Get an Ignite Instance",id:"get-an-ignite-instance",level:2},{value:"Next Steps",id:"next-steps",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:'In most scenarios, you would use Ignite CLI tool to start and manage your Ignite cluster. However, in some scenarios it is preferable to manage the cluster from a Java project. Starting and working with the cluster from code is called "embedded mode".'}),"\n",(0,r.jsx)(n.p,{children:"This tutorial covers how you can start Ignite 3 from your Java project."}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"Unlike in Ignite 2, nodes in Ignite 3 are not separated into client and server nodes. Nodes started from embedded mode will be used to store data by default."})}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"This section describes the platform requirements for machines running Ignite. Ignite system requirements scale depending on the size of the cluster."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Requirement"}),(0,r.jsx)(n.th,{children:"Version"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"JDK"}),(0,r.jsx)(n.td,{children:"11 and later"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"OS"}),(0,r.jsx)(n.td,{children:"Linux (Debian and Red Hat flavours), Windows 10 or 11"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ISA"}),(0,r.jsx)(n.td,{children:"x86 or x64"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"add-ignite-to-your-project",children:"Add Ignite to Your Project"}),"\n",(0,r.jsx)(n.p,{children:"First, you need to add Ignite to your project. The easiest way to do this is by using Maven:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:"\r\n \r\n \r\n org.apache.maven.plugins\r\n maven-compiler-plugin\r\n \r\n 11\r\n 11\r\n \r\n \r\n \r\n\r\n\r\n\r\n \r\n org.apache.ignite\r\n ignite-api\r\n 3.0.0\r\n \r\n\r\n \r\n org.apache.ignite\r\n ignite-runner\r\n 3.0.0\r\n \r\n\n"})}),"\n",(0,r.jsx)(n.h2,{id:"prepare-ignite-configuration",children:"Prepare Ignite Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["To start an Ignite node, you will need an Ignite configuration file that specifies all configuration properties of the node. For this tutorial, we recommend ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/installation/install-zip",children:"installing"})," Ignite 3 and using a default configuration file from it. This file is stored in the ",(0,r.jsx)(n.code,{children:"ignite3-db-3.0.0/etc/ignite-config.conf"})," file."]}),"\n",(0,r.jsx)(n.h2,{id:"pass-jvm-parameters",children:"Pass JVM Parameters"}),"\n",(0,r.jsx)(n.p,{children:"The following JVM parameters need to be passed to your application to make proprietary SDK APIs available:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"--add-opens java.base/java.lang=ALL-UNNAMED\r\n--add-opens java.base/java.lang.invoke=ALL-UNNAMED\r\n--add-opens java.base/java.lang.reflect=ALL-UNNAMED\r\n--add-opens java.base/java.io=ALL-UNNAMED\r\n--add-opens java.base/java.nio=ALL-UNNAMED\r\n--add-opens java.base/java.math=ALL-UNNAMED\r\n--add-opens java.base/java.util=ALL-UNNAMED\r\n--add-opens java.base/java.time=ALL-UNNAMED\r\n--add-opens java.base/jdk.internal.misc=ALL-UNNAMED\r\n--add-opens java.base/jdk.internal.access=ALL-UNNAMED\r\n--add-opens java.base/sun.nio.ch=ALL-UNNAMED\r\n-Dio.netty.tryReflectionSetAccessible=true\n"})}),"\n",(0,r.jsx)(n.h2,{id:"start-ignite-server-nodes",children:"Start Ignite Server Nodes"}),"\n",(0,r.jsx)(n.p,{children:"To start an Ignite node, use the following code snippet:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteServer node = IgniteServer.start("node", configFilePath, workDir);\n'})}),"\n",(0,r.jsxs)(n.p,{children:["This code snippet starts an Ignite node with the name ",(0,r.jsx)(n.code,{children:"node1"}),", that uses the configuration from the file specified in the ",(0,r.jsx)(n.code,{children:"configFilePath"})," path parameter and uses the folder specified in the ",(0,r.jsx)(n.code,{children:"workDir"})," path parameter to store data. When the node is started, this method returns an instance of ",(0,r.jsx)(n.code,{children:"IgniteServer"})," class that can be used to work with the node."]}),"\n",(0,r.jsx)(n.h2,{id:"initiate-a-cluster",children:"Initiate a Cluster"}),"\n",(0,r.jsx)(n.p,{children:"Started nodes find each other by default, but they do not form an operational cluster unless the cluster is initiated. You need to initiate the cluster to activate the node. If there are multiple nodes, once the cluster is activated, they will form a topology and automatically distribute workload between each other."}),"\n",(0,r.jsx)(n.p,{children:"Use the code snippet below to initiate a cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'InitParameters initParameters = InitParameters.builder()\r\n .metaStorageNodeNames("node")\r\n .clusterName("cluster")\r\n .clusterConfiguration({config-with-license})\r\n .build();\r\n\r\nnode.initCluster(initParameters);\n'})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["To start an Ignite 3 cluster, you need to provide a license together with the cluster configuration in the ",(0,r.jsx)(n.code,{children:"clusterConfiguration"})," parameter."]})}),"\n",(0,r.jsx)(n.h2,{id:"get-an-ignite-instance",children:"Get an Ignite Instance"}),"\n",(0,r.jsxs)(n.p,{children:["Now that the cluster is started, you can get an instance of the ",(0,r.jsx)(n.code,{children:"Ignite"})," class:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"Ignite ignite = node.api();\n"})}),"\n",(0,r.jsx)(n.p,{children:"This instance can be used to start working with the cluster. The future will be returned once the cluster is active."}),"\n",(0,r.jsx)(n.p,{children:"In the following example, you interact with the cluster using the SQL API:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'ignite.sql().execute(null, "CREATE TABLE IF NOT EXISTS Person (id int primary key, name varchar, age int);");\r\nignite.sql().execute(null, "insert into Person (id, name, age) values (\'1\', \'Person Man\', \'501\'");\r\ntry (ResultSet rs = ignite.sql().execute(null, "SELECT id, name, age from Person")) {\r\n while (rs.hasNext()) {\r\n SqlRow row = rs.next();\r\n System.out.println(" "\r\n + row.value(1) + ", "\r\n + row.value(2));\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Session is closable, but it is safe to skip ",(0,r.jsx)(n.code,{children:"close()"})," method for DDL and DML queries, as they do not keep cursor open."]})}),"\n",(0,r.jsxs)(n.p,{children:["More examples of working with Ignite can be found in the ",(0,r.jsx)(n.a,{href:"https://github.com/apache/ignite-3/tree/main/examples",children:"examples"})," repository."]}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsx)(n.p,{children:"From here, you may want to:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Check out the ",(0,r.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/table-api",children:"Developers guide"})," page for more information on available APIs"]}),"\n",(0,r.jsxs)(n.li,{children:["Try out our ",(0,r.jsx)(n.a,{href:"https://github.com/apache/ignite-3/tree/main/examples",children:"examples"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>o});var i=t(96540);const r={},a=i.createContext(r);function s(e){const n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/d02d3d43.7d8b8588.js b/docs/ignite3/assets/js/d02d3d43.7d8b8588.js deleted file mode 100644 index 7579d030a3..0000000000 --- a/docs/ignite3/assets/js/d02d3d43.7d8b8588.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7639],{16655:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"understand/architecture/storage-engines/index","title":"Storage Engines","description":"Storage engine implementations in Apache Ignite 3.","source":"@site/docs/understand/architecture/storage-engines/index.mdx","sourceDirName":"understand/architecture/storage-engines","slug":"/understand/architecture/storage-engines/","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Storage Engines"},"sidebar":"tutorialSidebar","previous":{"title":"Storage Architecture","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-architecture"},"next":{"title":"AIMemory Storage Engine","permalink":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem"}}');var i=r(74848),t=r(28453);const a={title:"Storage Engines"},c="Storage Engines",o={},d=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components},{IIcon:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"storage-engines",children:"Storage Engines"})}),"\n",(0,i.jsx)(n.p,{children:"Storage engine implementations in Apache Ignite 3."}),"\n",(0,i.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,i.jsxs)("div",{className:"card-container",children:[(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(r,{icon:"mdi:memory",height:"24"})," AIMemory"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"In-memory volatile storage engine for high-speed data access."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./storage-engines/aimem",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(r,{icon:"mdi:database-outline",height:"24"})," AIPersist"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Persistent B+ tree storage engine with page-based organization."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./storage-engines/aipersist",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(r,{icon:"mdi:layers-outline",height:"24"})," RocksDB"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"LSM-tree based storage engine optimized for write-heavy workloads."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./storage-engines/rocksdb",children:"Learn more \u2192"})})]})]}),"\n",(0,i.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"../",children:"Storage Architecture"})," - Storage overview"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"../../configure-and-operate/configuration/config-storage-overview",children:"Configuration"})," - Configure storage"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"../core-concepts",children:"Core Concepts"})," - Fundamental concepts"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>c});var s=r(96540);const i={},t=s.createContext(i);function a(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/d2778e29.9a667de9.js b/docs/ignite3/assets/js/d2778e29.9a667de9.js deleted file mode 100644 index ea93ddd7f9..0000000000 --- a/docs/ignite3/assets/js/d2778e29.9a667de9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6537],{28453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>c});var t=r(96540);const s={},i=t.createContext(s);function a(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(i.Provider,{value:n},e.children)}},40379:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"sql/advanced/index","title":"Advanced SQL","description":"Advanced SQL features including query optimization and performance tuning.","source":"@site/docs/sql/advanced/index.mdx","sourceDirName":"sql/advanced","slug":"/sql/advanced/","permalink":"/docs/ignite3/3.1.0/sql/advanced/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Advanced SQL"},"sidebar":"tutorialSidebar","previous":{"title":"Keywords","permalink":"/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords"},"next":{"title":"EXPLAIN Statement","permalink":"/docs/ignite3/3.1.0/sql/advanced/explain-statement"}}');var s=r(74848),i=r(28453);const a={title:"Advanced SQL"},c="Advanced SQL",d={},o=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components},{IIcon:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"advanced-sql",children:"Advanced SQL"})}),"\n",(0,s.jsx)(n.p,{children:"Advanced SQL features including query optimization and performance tuning."}),"\n",(0,s.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:chart-timeline-variant",height:"24"})," EXPLAIN Statement"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Analyze query execution plans to understand performance characteristics."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./advanced/explain-statement",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(r,{icon:"mdi:speedometer",height:"24"})," Performance Tuning"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Best practices for SQL query optimization and performance improvement."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./advanced/performance-tuning",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"reference",children:"SQL Reference"})," - Complete language reference"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"working-with-sql",children:"SQL Operations"})," - Execute queries"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"../understand/performance",children:"Understand Performance"})," - Performance concepts"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/d5d3293e.cc836f76.js b/docs/ignite3/assets/js/d5d3293e.cc836f76.js deleted file mode 100644 index f6582a7cf7..0000000000 --- a/docs/ignite3/assets/js/d5d3293e.cc836f76.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9298],{16711:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"understand/core-concepts/distribution-and-colocation","title":"Distribution and Colocation","description":"Data distribution determines how Ignite spreads data across cluster nodes. Colocation ensures related data resides on the same nodes, enabling efficient joins and transactions without cross-node data movement.","source":"@site/docs/understand/core-concepts/distribution-and-colocation.md","sourceDirName":"understand/core-concepts","slug":"/understand/core-concepts/distribution-and-colocation","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"id":"distribution-and-colocation","title":"Distribution and Colocation","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Transactions and MVCC","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc"},"next":{"title":"Data Partitioning","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning"}}');var s=i(74848),t=i(28453);const o={id:"distribution-and-colocation",title:"Distribution and Colocation",sidebar_position:4},a=void 0,d={},l=[{value:"Distribution Zones",id:"distribution-zones",level:2},{value:"Partitioning",id:"partitioning",level:2},{value:"Rendezvous Hashing",id:"rendezvous-hashing",level:3},{value:"Partition Count Guidelines",id:"partition-count-guidelines",level:3},{value:"Replication",id:"replication",level:2},{value:"Consensus Groups",id:"consensus-groups",level:3},{value:"Quorum Requirements",id:"quorum-requirements",level:3},{value:"Primary Replicas and Leases",id:"primary-replicas-and-leases",level:2},{value:"Data Colocation",id:"data-colocation",level:2},{value:"Colocation Keys",id:"colocation-keys",level:3},{value:"Colocation Requirements",id:"colocation-requirements",level:3},{value:"Query Optimization",id:"query-optimization",level:3},{value:"Partition Rebalancing",id:"partition-rebalancing",level:2},{value:"Node Filtering",id:"node-filtering",level:2},{value:"Design Constraints",id:"design-constraints",level:2},{value:"Related Topics",id:"related-topics",level:2}];function c(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"Data distribution determines how Ignite spreads data across cluster nodes. Colocation ensures related data resides on the same nodes, enabling efficient joins and transactions without cross-node data movement."}),"\n",(0,s.jsx)(n.h2,{id:"distribution-zones",children:"Distribution Zones"}),"\n",(0,s.jsx)(n.p,{children:"A distribution zone defines the rules for data placement across the cluster. Each table belongs to exactly one distribution zone that controls:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Number of partitions"}),"\n",(0,s.jsx)(n.li,{children:"Replication factor"}),"\n",(0,s.jsx)(n.li,{children:"Which nodes can store data"}),"\n",(0,s.jsx)(n.li,{children:"Scale-up and scale-down behavior"}),"\n"]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Distribution Zone: zone1"\r\n direction TB\r\n Config["Configuration
                                                              PARTITIONS: 25
                                                              REPLICAS: 3"]\r\n\r\n subgraph "Node Selection"\r\n Filter["DATA_NODES_FILTER"]\r\n Nodes["Eligible Nodes"]\r\n end\r\n\r\n subgraph "Tables"\r\n T1[accounts]\r\n T2[transactions]\r\n T3[balances]\r\n end\r\n end\r\n\r\n Config --\x3e Filter\r\n Filter --\x3e Nodes\r\n Nodes --\x3e T1 & T2 & T3'}),"\n",(0,s.jsx)(n.p,{children:"Create a distribution zone:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE my_zone WITH\r\n PARTITIONS = 25,\r\n REPLICAS = 3,\r\n DATA_NODES_FILTER = '$[?(@.region == \"us-east\")]',\r\n DATA_NODES_AUTO_ADJUST_SCALE_UP = 300,\r\n DATA_NODES_AUTO_ADJUST_SCALE_DOWN = 600\r\n STORAGE_PROFILES = 'default';\n"})}),"\n",(0,s.jsx)(n.h2,{id:"partitioning",children:"Partitioning"}),"\n",(0,s.jsxs)(n.p,{children:["When a table is created, its data is divided into partitions based on the zone configuration. Each partition is identified by a number from 0 to ",(0,s.jsx)(n.code,{children:"PARTITIONS - 1"}),"."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Table: accounts"\r\n D[Data]\r\n end\r\n\r\n subgraph "Partitions"\r\n P0[Partition 0]\r\n P1[Partition 1]\r\n P2[Partition 2]\r\n PN[Partition N]\r\n end\r\n\r\n D --\x3e|"hash(key) mod N"| P0 & P1 & P2 & PN'}),"\n",(0,s.jsx)(n.h3,{id:"rendezvous-hashing",children:"Rendezvous Hashing"}),"\n",(0,s.jsx)(n.p,{children:"Ignite uses rendezvous hashing (Highest Random Weight) to assign partitions to nodes. For each partition, the algorithm:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Computes a hash combining each node's ID with the partition number"}),"\n",(0,s.jsx)(n.li,{children:"Sorts nodes by their hash value in descending order"}),"\n",(0,s.jsx)(n.li,{children:"Assigns the partition to nodes with the highest scores"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"This approach provides:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Deterministic placement"}),": The same partition always maps to the same nodes given the same cluster topology"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Minimal rebalancing"}),": Adding or removing nodes affects only partitions that must move"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Stable ordering"}),": Consistent replica orderings across all nodes"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"partition-count-guidelines",children:"Partition Count Guidelines"}),"\n",(0,s.jsx)(n.p,{children:"Set partition count based on cluster size and available cores:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"recommended_partitions = (node_count * cores_per_node * 2) / replica_count\n"})}),"\n",(0,s.jsx)(n.p,{children:"Examples:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"3 nodes, 8 cores each, 3 replicas: 16 to 32 partitions"}),"\n",(0,s.jsx)(n.li,{children:"7 nodes, 16 cores each, 3 replicas: 75 to 150 partitions"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The maximum partition count is 65,000 per table. Using significantly more partitions than recommended creates overhead from partition management and distribution tracking."}),"\n",(0,s.jsx)(n.h2,{id:"replication",children:"Replication"}),"\n",(0,s.jsxs)(n.p,{children:["Each partition is replicated across multiple nodes for fault tolerance. The ",(0,s.jsx)(n.code,{children:"REPLICAS"})," parameter controls how many copies exist."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Partition 0 Replication"\r\n subgraph "Node A"\r\n R1["Replica 1
                                                              (Primary)"]\r\n end\r\n subgraph "Node B"\r\n R2["Replica 2
                                                              (Peer)"]\r\n end\r\n subgraph "Node C"\r\n R3["Replica 3
                                                              (Peer)"]\r\n end\r\n end\r\n\r\n R1 <--\x3e|"Raft
                                                              Consensus"| R2\r\n R1 <--\x3e|"Raft
                                                              Consensus"| R3\r\n R2 <--\x3e|"Raft
                                                              Consensus"| R3'}),"\n",(0,s.jsx)(n.h3,{id:"consensus-groups",children:"Consensus Groups"}),"\n",(0,s.jsx)(n.p,{children:"Replicas form a Raft consensus group. The group has two member types:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Role"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Peers"})}),(0,s.jsx)(n.td,{children:"Vote on writes, contribute to quorum, can become primary"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Learners"})}),(0,s.jsx)(n.td,{children:"Receive data asynchronously, cannot vote, used for read scaling"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"The consensus group size determines how many peers participate in voting:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"consensus_group_size = (quorum_size * 2) - 1\n"})}),"\n",(0,s.jsx)(n.p,{children:"For 5 replicas with quorum size 2: 3 peers and 2 learners."}),"\n",(0,s.jsx)(n.h3,{id:"quorum-requirements",children:"Quorum Requirements"}),"\n",(0,s.jsx)(n.p,{children:"Writes require acknowledgment from a quorum of peers before completion. Losing the majority of the consensus group puts the partition in read-only state."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Replicas"}),(0,s.jsx)(n.th,{children:"Default Quorum"}),(0,s.jsx)(n.th,{children:"Consensus Peers"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"1"}),(0,s.jsx)(n.td,{children:"1"}),(0,s.jsx)(n.td,{children:"1"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"2-4"}),(0,s.jsx)(n.td,{children:"2"}),(0,s.jsx)(n.td,{children:"3"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"5+"}),(0,s.jsx)(n.td,{children:"3"}),(0,s.jsx)(n.td,{children:"5"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"For high availability, use an odd number of replicas (3 or 5) to handle node failures without losing quorum."}),"\n",(0,s.jsx)(n.h2,{id:"primary-replicas-and-leases",children:"Primary Replicas and Leases"}),"\n",(0,s.jsx)(n.p,{children:"Each partition has one primary replica that handles all read-write transactions. The primary is determined through a lease mechanism managed by the placement driver."}),"\n",(0,s.jsx)(n.mermaid,{value:"sequenceDiagram\r\n participant PD as Placement Driver\r\n participant N1 as Node A\r\n participant N2 as Node B\r\n\r\n PD->>N1: Grant lease (Partition 0)\r\n N1--\x3e>PD: Accept lease\r\n Note over N1: Primary for Partition 0\r\n\r\n loop Every ~500ms\r\n PD->>N1: Extend lease\r\n N1--\x3e>PD: Acknowledge\r\n end\r\n\r\n Note over N1: Node A fails\r\n PD->>N2: Grant lease (Partition 0)\r\n N2--\x3e>PD: Accept lease\r\n Note over N2: New Primary"}),"\n",(0,s.jsx)(n.p,{children:"Lease properties:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Short-lived"}),": Leases expire after a few seconds if not renewed"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Non-revocable"}),": A lease cannot be revoked before expiration"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Single holder"}),": Only one node holds the lease for a partition at any time"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Negotiated"}),": The candidate must accept the lease before becoming primary"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"data-colocation",children:"Data Colocation"}),"\n",(0,s.jsx)(n.p,{children:"Colocation ensures that related data from different tables is stored on the same partition. This enables:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Joins without cross-node data transfer"}),"\n",(0,s.jsx)(n.li,{children:"Transactions touching related data without distributed coordination"}),"\n",(0,s.jsx)(n.li,{children:"Colocated compute jobs that access all needed data locally"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"colocation-keys",children:"Colocation Keys"}),"\n",(0,s.jsx)(n.p,{children:"Tables colocate when they share the same:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Distribution zone"}),"\n",(0,s.jsx)(n.li,{children:"Colocation key column(s) with matching values"}),"\n"]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Node A - Partition 0"\r\n O1["orders
                                                              customer_id=100"]\r\n OI1["order_items
                                                              customer_id=100"]\r\n end\r\n\r\n subgraph "Node B - Partition 1"\r\n O2["orders
                                                              customer_id=200"]\r\n OI2["order_items
                                                              customer_id=200"]\r\n end\r\n\r\n O1 <-.->|"Colocated"| OI1\r\n O2 <-.->|"Colocated"| OI2'}),"\n",(0,s.jsx)(n.p,{children:"Define colocation when creating tables:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sql",children:"-- Parent table\r\nCREATE TABLE customers (\r\n customer_id INT PRIMARY KEY,\r\n name VARCHAR(100)\r\n) WITH PRIMARY_ZONE = 'my_zone';\r\n\r\n-- Child table colocated by customer_id\r\nCREATE TABLE orders (\r\n order_id INT,\r\n customer_id INT,\r\n total DECIMAL(10,2),\r\n PRIMARY KEY (order_id, customer_id)\r\n) COLOCATE BY (customer_id)\r\n WITH PRIMARY_ZONE = 'my_zone';\r\n\r\n-- Another colocated table\r\nCREATE TABLE order_items (\r\n item_id INT,\r\n order_id INT,\r\n customer_id INT,\r\n product_id INT,\r\n quantity INT,\r\n PRIMARY KEY (item_id, customer_id)\r\n) COLOCATE BY (customer_id)\r\n WITH PRIMARY_ZONE = 'my_zone';\n"})}),"\n",(0,s.jsx)(n.h3,{id:"colocation-requirements",children:"Colocation Requirements"}),"\n",(0,s.jsx)(n.p,{children:"For colocation to work:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Same zone"}),": Tables must use the same distribution zone"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Matching columns"}),": Colocation key columns must have compatible types"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Primary key inclusion"}),": Colocation columns must be part of the primary key"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Consistent hashing"}),": All colocated tables use the same hash function on colocation keys"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"query-optimization",children:"Query Optimization"}),"\n",(0,s.jsx)(n.p,{children:"The SQL engine detects colocated tables and optimizes join execution:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sql",children:"-- This join executes locally on each node without data shuffling\r\nSELECT o.order_id, c.name, o.total\r\nFROM orders o\r\nJOIN customers c ON o.customer_id = c.customer_id\r\nWHERE o.customer_id = 100;\n"})}),"\n",(0,s.jsx)(n.p,{children:"Without colocation, the same query would require transferring data between nodes."}),"\n",(0,s.jsx)(n.h2,{id:"partition-rebalancing",children:"Partition Rebalancing"}),"\n",(0,s.jsx)(n.p,{children:"When cluster topology changes, Ignite redistributes partitions to maintain balanced data distribution."}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Before: 3 Nodes"\r\n A1[Node A
                                                              P0, P1, P2]\r\n B1[Node B
                                                              P3, P4, P5]\r\n C1[Node C
                                                              P6, P7, P8]\r\n end\r\n\r\n subgraph "After: 4 Nodes"\r\n A2[Node A
                                                              P0, P1]\r\n B2[Node B
                                                              P3, P4]\r\n C2[Node C
                                                              P6, P7]\r\n D2[Node D
                                                              P2, P5, P8]\r\n end\r\n\r\n A1 --\x3e|"Rebalance"| A2\r\n B1 --\x3e|"Rebalance"| B2\r\n C1 --\x3e|"Rebalance"| C2'}),"\n",(0,s.jsx)(n.p,{children:"Rebalancing is controlled by scale timers:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"DATA_NODES_AUTO_ADJUST_SCALE_UP"}),": Delay before adding new node to data distribution (default: immediate)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"DATA_NODES_AUTO_ADJUST_SCALE_DOWN"}),": Delay before removing departed node from distribution (default: immediate)"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Setting delays prevents unnecessary rebalancing during rolling restarts or brief network issues."}),"\n",(0,s.jsx)(n.h2,{id:"node-filtering",children:"Node Filtering"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"DATA_NODES_FILTER"})," parameter selects which nodes participate in the zone using JSONPath expressions against node attributes:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sql",children:"-- Only nodes in us-east region\r\nCREATE ZONE us_east_zone WITH\r\n DATA_NODES_FILTER = '$[?(@.region == \"us-east\")]',\r\n STORAGE_PROFILES = 'default';\r\n\r\n-- Nodes with SSD storage and at least 32GB RAM\r\nCREATE ZONE high_performance WITH\r\n DATA_NODES_FILTER = '$[?(@.storage == \"ssd\" && @.memory >= 32)]',\r\n STORAGE_PROFILES = 'default';\n"})}),"\n",(0,s.jsx)(n.p,{children:"Node attributes are configured in each node's configuration file."}),"\n",(0,s.jsx)(n.h2,{id:"design-constraints",children:"Design Constraints"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Zone immutability"}),": Once a table is assigned to a zone, it cannot be moved to a different zone"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Partition count fixed"}),": The number of partitions cannot be changed after zone creation"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Colocation at creation"}),": Colocation must be specified when creating the table"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Single leaseholder"}),": Only one node can be the primary for a partition at any time"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Consensus majority"}),": Losing the majority of consensus peers makes the partition read-only"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"related-topics",children:"Related Topics"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"Distribution Zones SQL Reference"})," for zone DDL syntax"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/3.1.0/understand/core-concepts/data-partitioning",children:"Data Partitioning"})," for partition internals"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/3.1.0/configure-and-operate/operations/disaster-recovery-partitions",children:"Disaster Recovery"})," for handling partition failures"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>a});var r=i(96540);const s={},t=r.createContext(s);function o(e){const n=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/d7a33538.a22c084a.js b/docs/ignite3/assets/js/d7a33538.a22c084a.js deleted file mode 100644 index cea7be6791..0000000000 --- a/docs/ignite3/assets/js/d7a33538.a22c084a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9665],{11470:(e,n,r)=>{r.d(n,{A:()=>w});var s=r(96540),i=r(34164),t=r(17559),l=r(23104),o=r(56347),a=r(205),c=r(57485),d=r(31682),u=r(70679);function h(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function x(e){const{values:n,children:r}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:r,default:s}})=>({value:e,label:n,attributes:r,default:s}))}(r);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,o.W6)(),i=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(i),(0,s.useCallback)(e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})},[i,r])]}function j(e){const{defaultValue:n,queryString:r=!1,groupId:i}=e,t=x(e),[l,o]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t})),[c,d]=g({queryString:r,groupId:i}),[h,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,i]=(0,u.Dv)(n);return[r,(0,s.useCallback)(e=>{n&&i.set(e)},[n,i])]}({groupId:i}),y=(()=>{const e=c??h;return p({value:e,tabValues:t})?e:null})();(0,a.A)(()=>{y&&o(y)},[y]);return{selectedValue:l,selectValue:(0,s.useCallback)(e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),j(e)},[d,j,t]),tabValues:t}}var y=r(92303);const m={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=r(74848);function A({className:e,block:n,selectedValue:r,selectValue:s,tabValues:t}){const o=[],{blockElementScrollPositionUntilNextRender:a}=(0,l.a_)(),c=e=>{const n=e.currentTarget,i=o.indexOf(n),l=t[i].value;l!==r&&(a(n),s(l))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},e),children:t.map(({value:e,label:n,attributes:s})=>(0,b.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:d,onClick:c,...s,className:(0,i.A)("tabs__item",m.tabItem,s?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function v({lazy:e,children:n,selectedValue:r}){const t=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=t.find(e=>e.props.value===r);return e?(0,s.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:t.map((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function f(e){const n=j(e);return(0,b.jsxs)("div",{className:(0,i.A)(t.G.tabs.container,"tabs-container",m.tabList),children:[(0,b.jsx)(A,{...n,...e}),(0,b.jsx)(v,{...n,...e})]})}function w(e){const n=(0,y.A)();return(0,b.jsx)(f,{...e,children:h(e.children)},String(n))}},19365:(e,n,r)=>{r.d(n,{A:()=>l});r(96540);var s=r(34164);const i={tabItem:"tabItem_Ymn6"};var t=r(74848);function l({children:e,hidden:n,className:r}){return(0,t.jsx)("div",{role:"tabpanel",className:(0,s.A)(i.tabItem,r),hidden:n,children:e})}},28453:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>o});var s=r(96540);const i={},t=s.createContext(i);function l(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(t.Provider,{value:n},e.children)}},97983:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>x,frontMatter:()=>a,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"api-reference/native-clients/dotnet/linq-api","title":"LINQ API","description":"Ignite .NET client provides LINQ support that is integrated with Ignite SQL APIs. You can avoid working with SQL syntax directly and write queries in C# with LINQ. C# LINQ expressions are then translated into Ignite-specific SQL. For example, the following two snippets achieve the same result:","source":"@site/docs/api-reference/native-clients/dotnet/linq-api.md","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/linq-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"LINQ API","id":"linq-api","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Tables API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api"},"next":{"title":"Data Streamer API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api"}}');var i=r(74848),t=r(28453),l=r(11470),o=r(19365);const a={title:"LINQ API",id:"linq-api",sidebar_position:3},c=void 0,d={},u=[{value:"Getting Started With LINQ",id:"getting-started-with-linq",level:2},{value:"Using LINQ",id:"using-linq",level:2},{value:"Inspecting Generated SQL",id:"inspecting-generated-sql",level:3},{value:"Transactions",id:"transactions",level:3},{value:"Custom Query Options",id:"custom-query-options",level:3},{value:"Result Materialization",id:"result-materialization",level:3},{value:"Iteration",id:"iteration",level:4},{value:"Converting to Collections",id:"converting-to-collections",level:4},{value:"Ignite-specific IResultSet",id:"ignite-specific-iresultset",level:4},{value:"Supported LINQ Features",id:"supported-linq-features",level:2},{value:"Projection",id:"projection",level:3},{value:"Inner Joins",id:"inner-joins",level:3},{value:"Outer Joins",id:"outer-joins",level:3},{value:"Grouping",id:"grouping",level:3},{value:"Ordering",id:"ordering",level:3},{value:"Union, Intersect, Except",id:"union-intersect-except",level:3},{value:"Aggregate Functions",id:"aggregate-functions",level:3},{value:"Math Functions",id:"math-functions",level:3},{value:"String Functions",id:"string-functions",level:3},{value:"Regular Expressions",id:"regular-expressions",level:3},{value:"DML (Bulk Update and Delete)",id:"dml-bulk-update-and-delete",level:3},{value:"Composing Queries",id:"composing-queries",level:3},{value:"Column Name Mapping",id:"column-name-mapping",level:3},{value:"KeyValueView",id:"keyvalueview",level:3}];function h(e){const n={admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Ignite .NET client provides LINQ support that is integrated with Ignite SQL APIs. You can avoid working with SQL syntax directly and write queries in C# with LINQ. C# LINQ expressions are then translated into Ignite-specific SQL. For example, the following two snippets achieve the same result:"}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"linq",label:"LINQ",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var table = await Client.Tables.GetTableAsync("TBL1");\r\nIQueryable query = table!.GetRecordView().AsQueryable()\r\n .Where(x => x.Key > 3)\r\n .OrderBy(x => x.Key);\r\nList queryResults = await query.ToListAsync();\n'})})}),(0,i.jsx)(o.A,{value:"sql",label:"SQL",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var query = "select KEY, VAL from PUBLIC.TBL1 where (KEY > ?) order by KEY asc";\r\nawait using IResultSet resultSet = await Client.Sql.\r\n ExecuteAsync(transaction: null, query, 3);\r\nvar queryResults = new List();\r\nawait foreach (IIgniteTuple row in resultSet)\r\n{\r\n queryResults.Add(new Poco { Key = (long)row[0]!, Val = (string?)row[1] });\r\n}\n'})})})]}),"\n",(0,i.jsx)(n.p,{children:"LINQ has the following advantages over SQL:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Queries are strongly typed and checked at compilation;"}),"\n",(0,i.jsx)(n.li,{children:"It is easier to write and maintain with IDE support (auto-completion, navigation, find usages);"}),"\n",(0,i.jsx)(n.li,{children:"LINQ is refactoring-friendly: rename a column and all queries are updated at once;"}),"\n",(0,i.jsx)(n.li,{children:"Ignite-specific SQL knowledge is not required, and most C# developers are already familiar with LINQ;"}),"\n",(0,i.jsx)(n.li,{children:"LINQ is safe against SQL injections;"}),"\n",(0,i.jsx)(n.li,{children:"Results are mapped to types naturally."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"In real-world scenarios the performance of Ignite LINQ queries is on par with equivalent SQL queries.\r\nHowever, a small overhead still exists (due to query translation), and your mileage may vary depending on the query complexity, so it is recommended to measure the performance of your queries."}),"\n",(0,i.jsx)(n.h2,{id:"getting-started-with-linq",children:"Getting Started With LINQ"}),"\n",(0,i.jsx)(n.p,{children:"Here is how you can create a simple table in Ignite:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Create a table:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'await Client.Sql.ExecuteAsync(\r\n null, @"CREATE TABLE PUBLIC.PERSON (NAME VARCHAR PRIMARY KEY, AGE INT)");\n'})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Define the classes (or records) that represent tables:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Member names should match column names (case-insensitive)."}),"\n",(0,i.jsxs)(n.li,{children:["If a column name is not a valid C# identifier, use ",(0,i.jsx)(n.code,{children:'[Column("name")]'})," attribute to specify the name."]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"public record Person(string Name, int Age, string Address, string Status);\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Obtain a table reference:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'ITable table = await Client.Tables.GetTableAsync("PERSON");\n'})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Use the ",(0,i.jsx)(n.code,{children:"GetRecordView()"})," method to get a typed view of the table:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IRecordView view = table.GetRecordView();\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"AsQueryable()"})," to perform LINQ queries on ",(0,i.jsx)(n.code,{children:"IRecordView"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"List names = await view.AsQueryable()\r\n .Where(x => x.Age > 30)\r\n .Select(x => x.Name)\r\n .ToListAsync();\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"using-linq",children:"Using LINQ"}),"\n",(0,i.jsx)(n.h3,{id:"inspecting-generated-sql",children:"Inspecting Generated SQL"}),"\n",(0,i.jsx)(n.p,{children:"Viewing generated SQL is useful for debugging and performance tuning. There are two ways to do it:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"IgniteQueryableExtensions.ToQueryString()"})," extension method:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IQueryable query = table.GetRecordView()\r\n .AsQueryable()\r\n .Where(x => x.Age > 30);\r\nstring sql = query.ToQueryString();\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Debug logging:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var cfg = new IgniteClientConfiguration\r\n{\r\n Logger = new ConsoleLogger { MinLevel = LogLevel.Debug },\r\n ...\r\n};\r\nusing var client = IgniteClient.StartAsync(cfg);\r\n...\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["All generated SQL will be logged with ",(0,i.jsx)(n.code,{children:"Debug"})," level to the specified logger."]}),"\n",(0,i.jsx)(n.h3,{id:"transactions",children:"Transactions"}),"\n",(0,i.jsxs)(n.p,{children:["Transaction can be passed to the LINQ provider by using the ",(0,i.jsx)(n.code,{children:"AsQueryable"})," parameter:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'await using var tx = await client.Transactions.BeginAsync();\r\nvar view = (await client.Tables.GetTableAsync("person"))!.GetRecordView();\r\npocoView.AsQueryable(tx)...;\n'})}),"\n",(0,i.jsx)(n.h3,{id:"custom-query-options",children:"Custom Query Options"}),"\n",(0,i.jsxs)(n.p,{children:["Custom query options (timeout, page size) can be specified by using the second ",(0,i.jsx)(n.code,{children:"AsQueryable"})," parameter with ",(0,i.jsx)(n.code,{children:"QueryableOptions"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var options = new QueryableOptions\r\n{\r\n PageSize = 512,\r\n Timeout = TimeSpan.FromSeconds(30)\r\n};\r\ntable.GetRecordView().AsQueryable(options: options)...;\n"})}),"\n",(0,i.jsx)(n.h3,{id:"result-materialization",children:"Result Materialization"}),"\n",(0,i.jsxs)(n.p,{children:["Materialization is the process of converting query results (",(0,i.jsx)(n.code,{children:"IQueryable"}),") into an object or a collection of objects."]}),"\n",(0,i.jsx)(n.p,{children:"LINQ is lazy. Nothing happens (no network calls, no SQL translation) until the query is materialized.\r\nFor example, the following code only constructs an expression, but does not execute anything:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IQueryable query = table!.GetRecordView().AsQueryable()\r\n .Where(x => x.Key > 3)\r\n .OrderBy(x => x.Key);\n"})}),"\n",(0,i.jsx)(n.p,{children:"Query execution and materialization can be triggered in multiple ways:"}),"\n",(0,i.jsx)(n.h4,{id:"iteration",children:"Iteration"}),"\n",(0,i.jsxs)(n.p,{children:["You can iterate through query results by using ",(0,i.jsx)(n.code,{children:"foreach"})," statement, or asynchronously by using the ",(0,i.jsx)(n.code,{children:"AsAsyncEnumerable"})," method:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"foreach (var person in query) { ... }\r\nawait foreach (var person in query.AsAsyncEnumerable()) { ... }\n"})}),"\n",(0,i.jsx)(n.h4,{id:"converting-to-collections",children:"Converting to Collections"}),"\n",(0,i.jsxs)(n.p,{children:["You can convert queries to collections by using the ",(0,i.jsx)(n.code,{children:"ToList"})," and ",(0,i.jsx)(n.code,{children:"ToDictionary"})," methods, or ",(0,i.jsx)(n.code,{children:"ToListAsync"})," and ",(0,i.jsx)(n.code,{children:"ToDictionaryAsync"})," methods to do it asynchronously:"]}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"sync",label:"Synchronous",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"List list = query.ToList();\r\nDictionary dict = query.ToDictionary(x => x.Name, x => x.Age);\n"})})}),(0,i.jsx)(o.A,{value:"async",label:"Asynchronous",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"List list = await query.ToListAsync();\r\nDictionary dict = await query.\r\n ToDictionaryAsync(x => x.Name, x => x.Age);\n"})})})]}),"\n",(0,i.jsx)(n.h4,{id:"ignite-specific-iresultset",children:"Ignite-specific IResultSet"}),"\n",(0,i.jsxs)(n.p,{children:["Underlying ",(0,i.jsx)(n.code,{children:"IResultSet"})," can be obtained by using the ",(0,i.jsx)(n.code,{children:"IgniteQueryableExtensions.ToResultSetAsync()"})," extension method:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"await using IResultSet resultSet = await query.ToResultSetAsync();\r\nConsole.WriteLine(resultSet.Metadata);\r\nvar rows = resultSet.CollectAsync(...);\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Obtaining ",(0,i.jsx)(n.code,{children:"IResultSet"})," can be useful for access to metadata and ",(0,i.jsx)(n.code,{children:"CollectAsync"})," method, which provides more control over result materialization."]}),"\n",(0,i.jsx)(n.h2,{id:"supported-linq-features",children:"Supported LINQ Features"}),"\n",(0,i.jsx)(n.h3,{id:"projection",children:"Projection"}),"\n",(0,i.jsx)(n.p,{children:"Projection is the process of converting query results into a different type.\r\nAmong other things, projections are used to select a subset of columns."}),"\n",(0,i.jsxs)(n.p,{children:["For example, ",(0,i.jsx)(n.code,{children:"Person"})," table may have many columns, but we only need ",(0,i.jsx)(n.code,{children:"Name"})," and ",(0,i.jsx)(n.code,{children:"Age"}),"."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"First, create a projection class:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"public record PersonInfo(string Name, int Age);\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Then, use ",(0,i.jsx)(n.code,{children:"Select"})," to project query results:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"List result = query\r\n .Select(x => new PersonInfo(x.Name, x.Age))\r\n .ToList();\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Resulting SQL will select only those two columns, avoiding overfetching\r\n(a common issue that happens when ORM-generated query includes all table columns, but only a few of them are needed by the business logic)."}),"\n",(0,i.jsx)(n.p,{children:"Ignite also supports anonymous type projections:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var result = query.Select(x => new { x.Name, x.Age }).ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"inner-joins",children:"Inner Joins"}),"\n",(0,i.jsxs)(n.p,{children:["Use the standard ",(0,i.jsx)(n.code,{children:"Join"})," method to perform joins on other tables:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var customerQuery = customerTable.GetRecordView().AsQueryable();\r\nvar orderQuery = orderTable.GetRecordView().AsQueryable();\r\nvar ordersByCustomer = customerQuery\r\n .Join(orderQuery,\r\n cust => cust.Id,\r\n order => order.CustId,\r\n (cust, order) => new { cust.Name, order.Amount })\r\n .ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"outer-joins",children:"Outer Joins"}),"\n",(0,i.jsxs)(n.p,{children:["Outer joins are supported through the ",(0,i.jsx)(n.code,{children:"DefaultIfEmpty"})," method.\r\nFor example, not every book in a library is borrowed by a student, so a left outer join is used to retrieve all books and their current borrowers (if any):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var bookQuery = bookTable.GetRecordView().AsQueryable();\r\nvar studentQuery = studentTable.GetRecordView().AsQueryable();\r\nvar booksWithStudents = bookQuery\r\n .Join(studentQuery.DefaultIfEmpty(),\r\n book => book.StudentId,\r\n student => student.Id,\r\n (book, student) => new { book.Title, student.Name })\r\n .ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"grouping",children:"Grouping"}),"\n",(0,i.jsxs)(n.p,{children:["Grouping is supported through ",(0,i.jsx)(n.code,{children:"GroupBy"})," method. This is equivalent to SQL GROUP BY operator. You can get both single and multiple columns in your queries. When working with multiple columns, use anonymous type:"]}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"single",label:"Single Column",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var bookCountByAuthor = bookTable.GetRecordView().AsQueryable()\r\n .GroupBy(book => book.Author)\r\n .Select(grp => new { Author = grp.Key, Count = grp.Count() })\r\n .ToList();\n"})})}),(0,i.jsx)(o.A,{value:"multiple",label:"Multiple Columns",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var bookCountByAuthorAndYear = bookTable.GetRecordView().AsQueryable()\r\n .GroupBy(book => new { book.Author, book.Year })\r\n .Select(grp => new { Author = grp.Key.Author,\r\n Year = grp.Key.Year,\r\n Count = grp.Count() })\r\n .ToList();\n"})})})]}),"\n",(0,i.jsxs)(n.p,{children:["Aggregate functions ",(0,i.jsx)(n.code,{children:"Count"}),", ",(0,i.jsx)(n.code,{children:"Sum"}),", ",(0,i.jsx)(n.code,{children:"Min"}),", ",(0,i.jsx)(n.code,{children:"Max"}),", ",(0,i.jsx)(n.code,{children:"Average"})," can be used with groupings."]}),"\n",(0,i.jsx)(n.h3,{id:"ordering",children:"Ordering"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"OrderBy"}),", ",(0,i.jsx)(n.code,{children:"OrderByDescending"}),", ",(0,i.jsx)(n.code,{children:"ThenBy"}),", ",(0,i.jsx)(n.code,{children:"ThenByDescending"})," are supported. You can combine them to order by multiple columns:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var booksOrderedByAuthorAndYear = bookTable.GetRecordView().AsQueryable()\r\n .OrderBy(book => book.Author)\r\n .ThenByDescending(book => book.Year)\r\n .ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"union-intersect-except",children:"Union, Intersect, Except"}),"\n",(0,i.jsxs)(n.p,{children:["Multiple result sets can be combined by using the ",(0,i.jsx)(n.code,{children:"Union"}),", ",(0,i.jsx)(n.code,{children:"Intersect"}),", ",(0,i.jsx)(n.code,{children:"Except"})," methods. For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IQueryable employeeEmails = employeeTable\r\n .GetRecordView().AsQueryable()\r\n .Select(x => x.Email);\r\n\r\nIQueryable customerEmails = customerTable\r\n .GetRecordView().AsQueryable()\r\n .Select(x => x.Email);\r\n\r\nList allEmails = employeeEmails.Union(customerEmails)\r\n .OrderBy(x => x)\r\n .ToList();\r\n\r\nList employeesThatAreCustomers = employeeEmails\r\n .Intersect(customerEmails).ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"aggregate-functions",children:"Aggregate Functions"}),"\n",(0,i.jsx)(n.p,{children:"Below is a list of .NET aggregate functions and their SQL equivalents that are supported in Ignite:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"LINQ synchronous method"}),(0,i.jsx)(n.th,{children:"LINQ asynchronous method"}),(0,i.jsx)(n.th,{children:"SQL Operator"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"First"}),(0,i.jsx)(n.td,{children:"FirstAsync"}),(0,i.jsx)(n.td,{children:"FIRST"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"FirstOrDefault"}),(0,i.jsx)(n.td,{children:"FirstOrDefaultAsync"}),(0,i.jsx)(n.td,{children:"FIRST ... LIMIT 1"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Single"}),(0,i.jsx)(n.td,{children:"SingleAsync"}),(0,i.jsx)(n.td,{children:"FIRST"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"SingleOrDefault"}),(0,i.jsx)(n.td,{children:"SingleOrDefaultAsync"}),(0,i.jsx)(n.td,{children:"FIRST ... LIMIT 2"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Max"}),(0,i.jsx)(n.td,{children:"MaxAsync"}),(0,i.jsx)(n.td,{children:"MAX"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Min"}),(0,i.jsx)(n.td,{children:"MinAsync"}),(0,i.jsx)(n.td,{children:"MIN"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Average"}),(0,i.jsx)(n.td,{children:"AverageAsync"}),(0,i.jsx)(n.td,{children:"AVG"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Sum"}),(0,i.jsx)(n.td,{children:"SumAsync"}),(0,i.jsx)(n.td,{children:"SUM"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Count"}),(0,i.jsx)(n.td,{children:"CountAsync"}),(0,i.jsx)(n.td,{children:"COUNT"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"LongCount"}),(0,i.jsx)(n.td,{children:"LongCountAsync"}),(0,i.jsx)(n.td,{children:"COUNT"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Any"}),(0,i.jsx)(n.td,{children:"AnyAsync"}),(0,i.jsx)(n.td,{children:"ANY"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"All"}),(0,i.jsx)(n.td,{children:"AllAsync"}),(0,i.jsx)(n.td,{children:"ALL"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"Here are examples of how you can use these methods:"}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"sync",label:"Synchronous",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"Person first = query.First();\r\nPerson? firstOrDefault = query.FirstOrDefault();\r\nPerson single = query.Single();\r\nPerson? singleOrDefault = query.SingleOrDefault();\r\nint maxAge = query.Max(x => x.Age);\r\nint minAge = query.Min(x => x.Age);\r\nint avgAge = query.Average(x => x.Age);\r\nint sumAge = query.Sum(x => x.Age);\r\nint count = query.Count();\r\nlong longCount = query.LongCount();\r\nbool any = query.Any(x => x.Age > 30);\r\nbool all = query.All(x => x.Age > 30);\n"})})}),(0,i.jsx)(o.A,{value:"async",label:"Asynchronous",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"Person first = await query.FirstAsync();\r\nPerson? firstOrDefault = await query.FirstOrDefaultAsync();\r\nPerson single = await query.SingleAsync();\r\nPerson? singleOrDefault = await query.SingleOrDefaultAsync();\r\nint maxAge = await query.MaxAsync(x => x.Age);\r\nint minAge = await query.MinAsync(x => x.Age);\r\nint avgAge = await query.AverageAsync(x => x.Age);\r\nint sumAge = await query.SumAsync(x => x.Age);\r\nint count = await query.CountAsync();\r\nlong longCount = await query.LongCountAsync();\r\nbool any = await query.AnyAsync(x => x.Age > 30);\r\nbool all = await query.AllAsync(x => x.Age > 30);\n"})})})]}),"\n",(0,i.jsx)(n.h3,{id:"math-functions",children:"Math Functions"}),"\n",(0,i.jsxs)(n.p,{children:["The following ",(0,i.jsx)(n.code,{children:"Math"})," functions are supported (will be translated to SQL equivalents):\r\n",(0,i.jsx)(n.code,{children:"Abs"}),", ",(0,i.jsx)(n.code,{children:"Cos"}),", ",(0,i.jsx)(n.code,{children:"Cosh"}),", ",(0,i.jsx)(n.code,{children:"Acos"}),", ",(0,i.jsx)(n.code,{children:"Sin"}),", ",(0,i.jsx)(n.code,{children:"Sinh"}),", ",(0,i.jsx)(n.code,{children:"Asin"}),", ",(0,i.jsx)(n.code,{children:"Tan"}),", ",(0,i.jsx)(n.code,{children:"Tanh"}),", ",(0,i.jsx)(n.code,{children:"Atan"}),", ",(0,i.jsx)(n.code,{children:"Ceiling"}),", ",(0,i.jsx)(n.code,{children:"Floor"}),",\r\n",(0,i.jsx)(n.code,{children:"Exp"}),", ",(0,i.jsx)(n.code,{children:"Log"}),", ",(0,i.jsx)(n.code,{children:"Log10"}),", ",(0,i.jsx)(n.code,{children:"Pow"}),", ",(0,i.jsx)(n.code,{children:"Round"}),", ",(0,i.jsx)(n.code,{children:"Sign"}),", ",(0,i.jsx)(n.code,{children:"Sqrt"}),", ",(0,i.jsx)(n.code,{children:"Truncate"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The following ",(0,i.jsx)(n.code,{children:"Math"})," functions are NOT supported (no equivalent in Ignite SQL engine):\r\n",(0,i.jsx)(n.code,{children:"Acosh"}),", ",(0,i.jsx)(n.code,{children:"Asinh"}),", ",(0,i.jsx)(n.code,{children:"Atanh"}),", ",(0,i.jsx)(n.code,{children:"Atan2"}),", ",(0,i.jsx)(n.code,{children:"Log2"}),", ",(0,i.jsx)(n.code,{children:"Log(x, y)"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Here is the example of how you can use math functions:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var triangles = table.GetRecordView().AsQueryable()\r\n .Select(t => new {\r\n Hypotenuse,\r\n Opposite = t.Hypotenuse * Math.Sin(t.Angle),\r\n Adjacent = t.Hypotenuse * Math.Cos(t.Angle)\r\n })\r\n .ToList();\n"})}),"\n",(0,i.jsx)(n.h3,{id:"string-functions",children:"String Functions"}),"\n",(0,i.jsxs)(n.p,{children:["The following string functions are supported: ",(0,i.jsx)(n.code,{children:"string.Compare(string)"}),", ",(0,i.jsx)(n.code,{children:"string.Compare(string, bool ignoreCase)"}),", concatenation ",(0,i.jsx)(n.code,{children:"s1 + s2 + s3"}),", ",(0,i.jsx)(n.code,{children:"ToUpper"}),", ",(0,i.jsx)(n.code,{children:"ToLower"}),",\r\n",(0,i.jsx)(n.code,{children:"Substring(start)"}),", ",(0,i.jsx)(n.code,{children:"Substring(start, len)"}),",\r\n",(0,i.jsx)(n.code,{children:"Trim"}),", ",(0,i.jsx)(n.code,{children:"Trim(char)"}),", ",(0,i.jsx)(n.code,{children:"TrimStart"}),", ",(0,i.jsx)(n.code,{children:"TrimStart(char)"}),", ",(0,i.jsx)(n.code,{children:"TrimEnd"}),", ",(0,i.jsx)(n.code,{children:"TrimEnd(char)"}),",\r\n",(0,i.jsx)(n.code,{children:"Contains"}),", ",(0,i.jsx)(n.code,{children:"StartsWith"}),", ",(0,i.jsx)(n.code,{children:"EndsWith"}),", ",(0,i.jsx)(n.code,{children:"IndexOf"}),", ",(0,i.jsx)(n.code,{children:"Length"}),", ",(0,i.jsx)(n.code,{children:"Replace"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Here is the example of how you can use string functions:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'List fullNames = table.GetRecordView().AsQueryable()\r\n .Where(p => p.FirstName.StartsWith("Jo"))\r\n .Select(p => new {\r\n FullName = p.FirstName.ToUpper() +\r\n " " +\r\n p.LastName.ToLower() })\r\n .ToList();\n'})}),"\n",(0,i.jsx)(n.h3,{id:"regular-expressions",children:"Regular Expressions"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Regex.Replace"})," is translated to ",(0,i.jsx)(n.code,{children:"regexp_replace"})," function. Here is how you can use regular expressions in your code:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'List addresses = table.GetRecordView().AsQueryable()\r\n .Select(p => new { Address = Regex.Replace(p.Address, @"(\\d+)", "[$1]")\r\n .ToList();\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Regular expression engine within SQL may behave differently from .NET engine."})}),"\n",(0,i.jsx)(n.h3,{id:"dml-bulk-update-and-delete",children:"DML (Bulk Update and Delete)"}),"\n",(0,i.jsxs)(n.p,{children:["Bulk update and delete with optional conditions are supported through ",(0,i.jsx)(n.code,{children:"ExecuteUpdateAsync"})," and ",(0,i.jsx)(n.code,{children:"ExecuteDeleteAsync"})," extensions methods on ",(0,i.jsx)(n.code,{children:"IQueryable"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"var orders = orderTable.GetRecordView().AsQueryable();\r\nawait orders.Where(x => x.Amount == 0).ExecuteDeleteAsync();\n"})}),"\n",(0,i.jsx)(n.p,{children:"Update statement can set properties to constant values or to an expression based on other properties of the same row:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var orders = orderTable.GetRecordView().AsQueryable();\r\nawait orders\r\n .Where(x => x.CustomerId == customerId)\r\n .ExecuteUpdateAsync(\r\n order => order.SetProperty(x => x.Discount, 0.1m)\r\n .SetProperty(x => x.Note, x => x.Note +\r\n " Happy birthday, " +\r\n x.CustomerName));\n'})}),"\n",(0,i.jsx)(n.p,{children:"Resulting SQL:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"update PUBLIC.tbl1 as _T0\r\nset NOTE = concat(concat(_T0.NOTE, ?), _T0.CUSTOMERNAME), DISCOUNT = ?\r\nwhere (_T0.CUSTOMERID IS NOT DISTINCT FROM ?)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"composing-queries",children:"Composing Queries"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"IQueryable"})," expressions can be composed dynamically. A common use case is to compose a query based on user input.\r\nFor example, optional filters on different columns can be applied to a query:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"public List GetBooks(string? author, int? year)\r\n{\r\n IQueryable query = bookTable.GetRecordView().AsQueryable();\r\n if (!string.IsNullOrEmpty(author))\r\n query = query.Where(x => x.Author == author);\r\n\r\n if (year != null)\r\n query = query.Where(x => x.Year == year);\r\n return query.ToList();\r\n}\n"})}),"\n",(0,i.jsx)(n.h3,{id:"column-name-mapping",children:"Column Name Mapping"}),"\n",(0,i.jsxs)(n.p,{children:["Unless custom mapping is provided with ",(0,i.jsx)(n.code,{children:"[Column]"}),", LINQ provider will use property or field names as column names,\r\nusing unquoted identifiers, which are case-insensitive."]}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"csharp",label:"C#",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"bookTable.GetRecordView().AsQueryable().Select(x => x.Author).ToList();\n"})})}),(0,i.jsx)(o.A,{value:"sql",label:"Resulting SQL",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"select _T0.AUTHOR from PUBLIC.books as _T0\n"})})})]}),"\n",(0,i.jsxs)(n.p,{children:["To use quoted identifiers, or to map column names to different property names, use ",(0,i.jsx)(n.code,{children:"[Column]"})," attribute:"]}),"\n",(0,i.jsxs)(l.A,{children:[(0,i.jsx)(o.A,{value:"csharp",label:"C#",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'public class Book\r\n{\r\n [Column("book_author")]\r\n public string Author { get; set; }\r\n}\r\n// Or a record:\r\npublic record Book([property: Column("book_author")] string Author);\n'})})}),(0,i.jsx)(o.A,{value:"sql",label:"Resulting SQL",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:'SELECT _T0."book_author" FROM PUBLIC.books AS _T0\n'})})})]}),"\n",(0,i.jsx)(n.h3,{id:"keyvalueview",children:"KeyValueView"}),"\n",(0,i.jsxs)(n.p,{children:["All examples above use ",(0,i.jsx)(n.code,{children:"IRecordView"})," to perform queries; LINQ provider supports ",(0,i.jsx)(n.code,{children:"IKeyValueView"})," equally well:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:"IQueryable> query =\r\n bookTable.GetKeyValueView().AsQueryable();\r\nList books = query\r\n .Where(x => x.Key > 10)\r\n .Select(x => x.Value)\r\n .ToList();\n"})})]})}function x(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/d902eba8.26425124.js b/docs/ignite3/assets/js/d902eba8.26425124.js deleted file mode 100644 index e33a0f531b..0000000000 --- a/docs/ignite3/assets/js/d902eba8.26425124.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1986],{11470:(e,n,t)=>{t.d(n,{A:()=>k});var a=t(96540),r=t(34164),s=t(17559),i=t(23104),l=t(56347),o=t(205),c=t(57485),d=t(31682),u=t(70679);function h(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:a}})=>({value:e,label:n,attributes:t,default:a}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const t=(0,l.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(r),(0,a.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function b(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=p(e),[i,l]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s})),[c,d]=m({queryString:t,groupId:r}),[h,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,u.Dv)(n);return[t,(0,a.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),f=(()=>{const e=c??h;return g({value:e,tabValues:s})?e:null})();(0,o.A)(()=>{f&&l(f)},[f]);return{selectedValue:i,selectValue:(0,a.useCallback)(e=>{if(!g({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,s]),tabValues:s}}var f=t(92303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var x=t(74848);function j({className:e,block:n,selectedValue:t,selectValue:a,tabValues:s}){const l=[],{blockElementScrollPositionUntilNextRender:o}=(0,i.a_)(),c=e=>{const n=e.currentTarget,r=l.indexOf(n),i=s[r].value;i!==t&&(o(n),a(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:a})=>(0,x.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...a,className:(0,r.A)("tabs__item",v.tabItem,a?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function I({lazy:e,children:n,selectedValue:t}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===t);return e?(0,a.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function y(e){const n=b(e);return(0,x.jsxs)("div",{className:(0,r.A)(s.G.tabs.container,"tabs-container",v.tabList),children:[(0,x.jsx)(j,{...n,...e}),(0,x.jsx)(I,{...n,...e})]})}function k(e){const n=(0,f.A)();return(0,x.jsx)(y,{...e,children:h(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>i});t(96540);var a=t(34164);const r={tabItem:"tabItem_Ymn6"};var s=t(74848);function i({children:e,hidden:n,className:t}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,a.A)(r.tabItem,t),hidden:n,children:e})}},20558:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>o,metadata:()=>a,toc:()=>u});const a=JSON.parse('{"id":"installation/deb-rpm","title":"Installing Using DEB and RPM Package","description":"{/*","source":"@site/versioned_docs/version-3.0.0/installation/deb-rpm.md","sourceDirName":"installation","slug":"/installation/deb-rpm","permalink":"/docs/ignite3/3.0.0/installation/deb-rpm","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Installing Using DEB and RPM Package","sidebar_label":"Installing Using DEB and RPM Package"},"sidebar":"tutorialSidebar","previous":{"title":"Installing Using ZIP Archive","permalink":"/docs/ignite3/3.0.0/installation/installing-using-zip"},"next":{"title":"Installing Using Docker","permalink":"/docs/ignite3/3.0.0/installation/installing-using-docker"}}');var r=t(74848),s=t(28453),i=t(11470),l=t(19365);const o={title:"Installing Using DEB and RPM Package",sidebar_label:"Installing Using DEB and RPM Package"},c=void 0,d={},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Recommended Operating System",id:"recommended-operating-system",level:3},{value:"Recommended Java Version",id:"recommended-java-version",level:3},{value:"Installing Deb or RPM Package",id:"installing-deb-or-rpm-package",level:2},{value:"Running Apache Ignite as a Service",id:"running-apache-ignite-as-a-service",level:2},{value:"Running Apache Ignite as a Stand-Alone Process",id:"running-apache-ignite-as-a-stand-alone-process",level:2},{value:"Next Steps",id:"next-steps",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.p,{children:"Apache Ignite can be installed by using the standard package managers for the platform."}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.h3,{id:"recommended-operating-system",children:"Recommended Operating System"}),"\n",(0,r.jsx)(n.p,{children:"Linux (Debian and Red Hat flavors), Windows 10 or 11."}),"\n",(0,r.jsx)(n.h3,{id:"recommended-java-version",children:"Recommended Java Version"}),"\n",(0,r.jsx)(n.p,{children:"JDK 11 and later."}),"\n",(0,r.jsx)(n.h2,{id:"installing-deb-or-rpm-package",children:"Installing Deb or RPM Package"}),"\n",(0,r.jsx)(n.p,{children:"Install the Apache Ignite 3 packages:"}),"\n",(0,r.jsxs)(i.A,{groupId:"package-managers",children:[(0,r.jsx)(l.A,{value:"deb",label:"deb",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"sudo apt-get install ./ignite3-db-3.0.0.deb --no-install-recommends\r\nsudo apt-get install ./ignite3-cli-3.0.0.deb --no-install-recommends\n"})})}),(0,r.jsx)(l.A,{value:"rpm",label:"RPM",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"sudo rpm -i ignite3-db-3.0.0.noarch.rpm\r\nsudo rpm -i ignite3-cli-3.0.0.noarch.rpm\n"})})})]}),"\n",(0,r.jsx)(n.p,{children:"The packages will be installed in the following way:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Folder"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"/usr/share/ignite3db"}),(0,r.jsx)(n.td,{children:"The root installation of Apache Ignite."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"/etc/ignite3db"}),(0,r.jsx)(n.td,{children:"The location of configuration files."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"/var/log/ignite3db"}),(0,r.jsx)(n.td,{children:"The location of node logs."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"/usr/lib/ignite3db"}),(0,r.jsx)(n.td,{children:"The location of the CLI tool."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"running-apache-ignite-as-a-service",children:"Running Apache Ignite as a Service"}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["When running on Windows 10 WSL or Docker, you should start Apache Ignite as a stand-alone process (not as a service). We recommend to ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/installation/installing-using-zip",children:"install Apache Ignite 3 using ZIP archive"})," in these environments."]})}),"\n",(0,r.jsx)(n.p,{children:"To start an Apache Ignite node with a custom configuration, run the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo systemctl start ignite3db\n"})}),"\n",(0,r.jsx)(n.p,{children:"To launch the node at system startup, run the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo systemctl enable ignite3db\n"})}),"\n",(0,r.jsx)(n.h2,{id:"running-apache-ignite-as-a-stand-alone-process",children:"Running Apache Ignite as a Stand-Alone Process"}),"\n",(0,r.jsx)(n.p,{children:"Generally, you would want to run Apache Ignite as a service. However, Apache Ignite also provides a startup script that can be used to start it as a stand-alone application. To run it, use the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sudo bash /usr/share/ignite3db/start.sh 1>/tmp/ignite3-start.log 2>&1 &\n"})}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(n.p,{children:["With Apache Ignite installed, you can proceed with the ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/quick-start/getting-started-guide",children:"Getting Started"})," or ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/table-api",children:"use the available APIs"})," immediately."]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var a=t(96540);const r={},s=a.createContext(r);function i(e){const n=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/d95c5914.f2adaf2f.js b/docs/ignite3/assets/js/d95c5914.f2adaf2f.js deleted file mode 100644 index 6e2327cfb0..0000000000 --- a/docs/ignite3/assets/js/d95c5914.f2adaf2f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3039],{28453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>o});var i=r(96540);const t={},s=i.createContext(t);function a(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(s.Provider,{value:n},e.children)}},68393:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"sql-tuning/sql-tuning","title":"SQL Performance Tuning","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-tuning/sql-tuning.md","sourceDirName":"sql-tuning","slug":"/sql-tuning/","permalink":"/docs/ignite3/3.0.0/sql-tuning/","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"SQL Performance Tuning","sidebar_label":"SQL Performance Tuning"},"sidebar":"tutorialSidebar","previous":{"title":"Explain Operators","permalink":"/docs/ignite3/3.0.0/sql-reference/explain-operators-list"},"next":{"title":"SQL Performance Tuning","permalink":"/docs/ignite3/3.0.0/sql-tuning/"}}');var t=r(74848),s=r(28453);const a={title:"SQL Performance Tuning",sidebar_label:"SQL Performance Tuning"},o=void 0,l={},d=[{value:"Optimizer Hints",id:"optimizer-hints",level:2},{value:"Hints format",id:"hints-format",level:3},{value:"Hint parameters",id:"hint-parameters",level:4},{value:"Hints errors",id:"hints-errors",level:3},{value:"Supported hints",id:"supported-hints",level:3},{value:"FORCE_INDEX / NO_INDEX",id:"force_index--no_index",level:4},{value:"Parameters:",id:"parameters",level:5},{value:"Examples:",id:"examples",level:5},{value:"Using EXPLAIN Statement",id:"using-explain-statement",level:2},{value:"EXPLAIN PLAN FOR Statement",id:"explain-plan-for-statement",level:2},{value:"EXPLAIN MAPPING FOR Statement",id:"explain-mapping-for-statement",level:2},{value:"Query Batching",id:"query-batching",level:2},{value:"Performance Consideration For Correlated Subqueries",id:"performance-consideration-for-correlated-subqueries",level:2},{value:"What Are Correlated Subqueries",id:"what-are-correlated-subqueries",level:3},{value:"Performance Impact",id:"performance-impact",level:3},{value:"Improving Performance",id:"improving-performance",level:3},{value:"Examples of Improved Queries",id:"examples-of-improved-queries",level:3},{value:"Dropping Cached Plans",id:"dropping-cached-plans",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:["\n",(0,t.jsx)(n.h2,{id:"optimizer-hints",children:"Optimizer Hints"}),"\n",(0,t.jsx)(n.p,{children:"The query optimizer tries to execute the fastest execution plan. However, you can know about the data design, application design or data distribution in your cluster better. SQL hints can help the optimizer to make optimizations more rationally or build execution plan faster."}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"SQL hints are optional to apply and might be skipped in some cases."})}),"\n",(0,t.jsx)(n.h3,{id:"hints-format",children:"Hints format"}),"\n",(0,t.jsxs)(n.p,{children:["SQL hints are defined by a special comment ",(0,t.jsx)(n.code,{children:"/*+ HINT */"}),", referred to as a ",(0,t.jsx)(n.em,{children:"hint block"}),". Spaces before and after the\r\nhint name are required. The hint block must be placed right after the operator. Several hints for one relation operator are not supported."]}),"\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ NO_INDEX */ T1.* FROM TBL1 where T1.V1=? and T1.V2=?\n"})}),"\n",(0,t.jsx)(n.h4,{id:"hint-parameters",children:"Hint parameters"}),"\n",(0,t.jsx)(n.p,{children:"Hint parameters, if required, are placed in brackets after the hint name and separated by commas."}),"\n",(0,t.jsx)(n.p,{children:"The hint parameter can be quoted. Quoted parameter is case-sensitive. The quoted and unquoted parameters cannot be\r\ndefined for the same hint."}),"\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ FORCE_INDEX(TBL1_IDX2,TBL2_IDX1) */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 T2 WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;\r\n\r\nSELECT /*+ FORCE_INDEX('TBL2_idx1') */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 T2 WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;\n"})}),"\n",(0,t.jsx)(n.h3,{id:"hints-errors",children:"Hints errors"}),"\n",(0,t.jsx)(n.p,{children:"The optimizer tries to apply every hint and its parameters, if possible. But it skips the hint or hint parameter if:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The hint is not supported."}),"\n",(0,t.jsx)(n.li,{children:"Required hint parameters are not passed."}),"\n",(0,t.jsx)(n.li,{children:"The hint parameters have been passed, but the hint does not support any parameter."}),"\n",(0,t.jsx)(n.li,{children:"The hint parameter is incorrect or refers to a nonexistent object, such as a nonexistent index or table."}),"\n",(0,t.jsx)(n.li,{children:"The current hints or current parameters are incompatible with the previous ones, such as forcing the use and disabling of the same index."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a ",(0,t.jsx)(n.code,{children:"FORCE_INDEX"})," hint references an index that does not exist, the following error will be thrown:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'Hints mentioned indexes "IDX_NOT_FOUND1", "IDX_NOT_FOUND2" were not found.\n'})}),"\n",(0,t.jsx)(n.h3,{id:"supported-hints",children:"Supported hints"}),"\n",(0,t.jsx)(n.h4,{id:"force_index--no_index",children:"FORCE_INDEX / NO_INDEX"}),"\n",(0,t.jsx)(n.p,{children:"Forces or disables index scan."}),"\n",(0,t.jsx)(n.h5,{id:"parameters",children:"Parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Empty. To force an index scan for every underlying table. Optimizer will choose any available index. Or to disable all indexes."}),"\n",(0,t.jsx)(n.li,{children:"Single index name to use or skip exactly this index."}),"\n",(0,t.jsx)(n.li,{children:"Several index names. They can relate to different tables. The optimizer will choose indexes for scanning or skip them all."}),"\n"]}),"\n",(0,t.jsx)(n.h5,{id:"examples",children:"Examples:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ FORCE_INDEX */ T1.* FROM TBL1 T1 WHERE T1.V1 = T2.V1 AND T1.V2 > ?;\r\n\r\nSELECT /*+ FORCE_INDEX(TBL1_IDX2, TBL2_IDX1) */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 T2 WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;\r\n\r\nSELECT /*+ NO_INDEX */ T1.* FROM TBL1 T1 WHERE T1.V1 = T2.V1 AND T1.V2 > ?;\r\n\r\nSELECT /*+ NO_INDEX(TBL1_IDX2, TBL2_IDX1) */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 T2 WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The query cannot have both ",(0,t.jsx)(n.code,{children:"FORCE_INDEX"})," and ",(0,t.jsx)(n.code,{children:"NO_INDEX"})," hints at the same time."]})}),"\n",(0,t.jsx)(n.h2,{id:"using-explain-statement",children:"Using EXPLAIN Statement"}),"\n",(0,t.jsx)(n.h2,{id:"explain-plan-for-statement",children:"EXPLAIN PLAN FOR Statement"}),"\n",(0,t.jsxs)(n.p,{children:["Apache Ignite supports the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/explain-statement",children:(0,t.jsx)(n.code,{children:"EXPLAIN PLAN FOR"})})," statement that can be used to read the execution plan of a query."]}),"\n",(0,t.jsx)(n.p,{children:"Use this command to analyse your queries for possible optimization, for example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"EXPLAIN PLAN FOR SELECT name FROM Person WHERE age = 26;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Here is how the results of the explanation may look like:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 PLAN \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 Exchange \u2551\r\n\u2551 distribution: single \u2551\r\n\u2551 est. row count: 333000 \u2551\r\n\u2551 TableScan \u2551\r\n\u2551 table: [PUBLIC, PERSON] \u2551\r\n\u2551 filters: =(AGE, 26) \u2551\r\n\u2551 fields: [$f0] \u2551\r\n\u2551 projects: [NAME] \u2551\r\n\u2551 est. row count: 333000 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,t.jsx)(n.h2,{id:"explain-mapping-for-statement",children:"EXPLAIN MAPPING FOR Statement"}),"\n",(0,t.jsxs)(n.p,{children:["Apache Ignite supports the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/explain-statement",children:(0,t.jsx)(n.code,{children:"EXPLAIN MAPPING FOR"})})," statement that can be used to track how the query is split and what nodes the subqueries are executed on."]}),"\n",(0,t.jsx)(n.p,{children:"Use this command if you need an insight into how the query is broken down and executed across multiple nodes in the distributed cluster."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"EXPLAIN MAPPING FOR SELECT name FROM Person WHERE age = 26;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Here is how the results of the query may look like:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 PLAN \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 Fragment#0 root \u2551\r\n\u2551 executionNodes: [defaultNode] \u2551\r\n\u2551 remoteFragments: [1] \u2551\r\n\u2551 exchangeSourceNodes: {1=[defaultNode]} \u2551\r\n\u2551 tree: \u2551\r\n\u2551 Receiver(sourceFragment=1, exchange=1, distribution=single) \u2551\r\n\u2551 \u2551\r\n\u2551 Fragment#1 \u2551\r\n\u2551 targetNodes: [defaultNode] \u2551\r\n\u2551 executionNodes: [defaultNode] \u2551\r\n\u2551 tables: [PERSON] \u2551\r\n\u2551 partitions: {defaultNode=[0:12, 1:12, 2:12, 3:12, 4:12, 5:12, 6:12, 7:12, 8:12, 9:12, 10:12, 11:12, 12:12, 13:12, 14:12, 15:12, 16:12, 17:12, 18:12, 19:12, 20:12, 21:12, 22:12, 23:12, 24:12]} \u2551\r\n\u2551 tree: \u2551\r\n\u2551 Sender(targetFragment=0, exchange=1, distribution=single) \u2551\r\n\u2551 TableScan(name=PUBLIC.PERSON, source=2, partitions=25, distribution=random) \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,t.jsx)(n.h2,{id:"query-batching",children:"Query Batching"}),"\n",(0,t.jsx)(n.p,{children:"Apache Ignite handles batched requests faster than individual requests, so we recommend using multi-statement execution when possible."}),"\n",(0,t.jsx)(n.p,{children:"When executing multiple queries in a single call, similar requests are automatically batched together. When writing large scripts that perform multiple different kinds of operations, we recommend the following order:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["All required ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/ddl",children:"DDL operations"}),";"]}),"\n",(0,t.jsxs)(n.li,{children:["Assigning ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/security/authentication",children:"access permissions"}),";"]}),"\n",(0,t.jsx)(n.li,{children:"Loading data into the tables."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["As execution of each statement is considered complete when the first page is ready to be returned, when working with large data sets, ",(0,t.jsx)(n.code,{children:"SELECT"})," statements may be affected by later statements in the same script."]}),"\n",(0,t.jsx)(n.h2,{id:"performance-consideration-for-correlated-subqueries",children:"Performance Consideration For Correlated Subqueries"}),"\n",(0,t.jsx)(n.p,{children:"Apache Ignite supports correlated subqueries, but the performance of certain complex correlated subqueries may be insufficient, especially when used in high-volume transactional or analytical workloads."}),"\n",(0,t.jsx)(n.h3,{id:"what-are-correlated-subqueries",children:"What Are Correlated Subqueries"}),"\n",(0,t.jsx)(n.p,{children:"A correlated subquery is a subquery that depends on values from the outer query for execution. It is evaluated once for every row of the outer query."}),"\n",(0,t.jsx)(n.p,{children:"For example, for a schema that is defined in the following way:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE projects (id INT PRIMARY KEY, name VARCHAR);\r\nCREATE TABLE employees (id INT PRIMARY KEY, department_id INT, name VARCHAR, salary DECIMAl);\r\nCREATE TABLE departments (id INT PRIMARY KEY, name VARCHAR);\r\nCREATE TABLE assignments (project_id INT, employee_id INT, PRIMARY KEY (project_id, employee_id));\n"})}),"\n",(0,t.jsx)(n.p,{children:"The correlated subquery may look like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"SELECT e.name,\r\n (SELECT COUNT(*)\r\n FROM assignments a\r\n WHERE a.employee_id = e.id\r\n ) AS project_count\r\nFROM employees e;\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Here, the subquery references ",(0,t.jsx)(n.code,{children:"e.id"})," from the outer query, meaning it's re-evaluated for every employee row, leading to N separate subquery executions for N employees."]}),"\n",(0,t.jsx)(n.h3,{id:"performance-impact",children:"Performance Impact"}),"\n",(0,t.jsx)(n.p,{children:"In Apache Ignite 3, repeated subquery executions are not automatically optimized. As a result:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Scalar subqueries may become bottlenecks."}),"\n",(0,t.jsx)(n.li,{children:"Even small tables can cause high CPU and memory consumption when repeatedly queried."}),"\n",(0,t.jsx)(n.li,{children:"Certain queries may perform slower than expected."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"improving-performance",children:"Improving Performance"}),"\n",(0,t.jsx)(n.p,{children:"In general, highly-selective outer queries with cheap scalar subqueries (like single-row index lookup) will perform just fine. Here is an example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- This query returns an employee along with the name of the department they belong to.\r\n-- It uses a correlated scalar subquery to resolve the department name.\r\n--\r\n-- Note the predicate `e.id = ?`, which filters by the employee's primary key.\r\n-- This makes the outer query highly selective, typically returning only a single row.\r\n--\r\n-- Because the subquery is evaluated only once (or a very small number of times),\r\n-- using a correlated scalar subquery is safe and has negligible performance impact\r\n-- in this case. There's no need to rewrite it using a join.\r\nSELECT e.*,\r\n (SELECT name\r\n FROM departments\r\n WHERE id = e.department_id\r\n ) AS employees_department\r\n FROM employees e\r\n WHERE e.id = ?;\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Similar query but without predicate may result in lower performance. If the query with predicate finishes in ",(0,t.jsx)(n.code,{children:"0.007s"}),", similar query without predicate could take up to ",(0,t.jsx)(n.code,{children:"2.4s"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Here is another example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- This query returns all employees along with the name of the department they\r\n-- belong to.\r\nSELECT e.*,\r\n (SELECT name\r\n FROM departments\r\n WHERE id = e.department_id\r\n ) AS employees_department\r\n FROM employees e;\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Query like the one above may easily be rewritten with regular ",(0,t.jsx)(n.code,{children:"JOIN"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- Equivalent query to the previous example, but uses a `LEFT JOIN` instead of a\r\n-- correlated subquery. This rewrite is valid as long as the subquery in the original\r\n-- version would return at most one row.\r\n--\r\n-- If multiple rows exist in the `departments` table for the same `id`, the original\r\n-- scalar subquery would result in a runtime error (due to a non-scalar result), while\r\n-- the join version would produce duplicated rows in the output.\r\n--\r\n-- In our case, `departments.id` is a primary key, so the join is safe and will return\r\n-- at most one matching department per employee.\r\n--\r\n-- A `LEFT JOIN` is used to ensure that employees with no matching department are still\r\n-- returned. If it's guaranteed that every employee has a valid department reference,\r\n-- an `INNER JOIN` may be used instead, which is slightly more efficient.\r\nSELECT e.*,\r\n d.name AS employees_department\r\n FROM employees e\r\n LEFT JOIN departments d ON d.id = e.department_id;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Rewritten query on the same environment finishes significantly faster."}),"\n",(0,t.jsx)(n.h3,{id:"examples-of-improved-queries",children:"Examples of Improved Queries"}),"\n",(0,t.jsx)(n.p,{children:"The first example shows how you can correctly query the database without evaluating each row:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- This query returns all employees without assigned projects.\r\n--\r\n-- Finishes in 3.2s (assuming there is an index on `assignments(employee_id)`;\r\n-- without the index, execution time increases significantly, up to 12s).\r\nSELECT e.id, e.name\r\nFROM employees e\r\nWHERE NOT EXISTS (\r\n SELECT 1\r\n FROM assignments a\r\n WHERE a.employee_id = e.id\r\n);\r\n\r\n-- Equivalent query without correlated subqueries.\r\n-- Instead of evaluating a subquery for each row, we join the tables and compute\r\n-- the number of assignments using aggregation. It is important to include all\r\n-- columns that form a unique key from the outer table in the `GROUP BY` clause.\r\n-- Otherwise, multiple rows may be grouped together incorrectly, potentially\r\n-- affecting the result. If you're unsure about the uniqueness of specific columns,\r\n-- include all columns from the table's `PRIMARY KEY`.\r\n--\r\n-- A `LEFT JOIN` is used because we want to retain employees even when there is\r\n-- no matching assignment. An `INNER JOIN` would exclude those employees.\r\n--\r\n-- The `HAVING COUNT(a.employee_id) = 0` clause checks for the absence of matches.\r\n-- You must count a column from the right-hand side of the join that is guaranteed\r\n-- to be non-null. In this case, `a.employee_id` is suitable because the `JOIN`\r\n-- condition (`a.employee_id = e.id`) ensures that only non-null `employee_id`s\r\n-- are matched; nulls are excluded during the join phase.\r\n--\r\n-- Finishes in 0.04s.\r\nSELECT e.id, e.name\r\n FROM employees e\r\n LEFT JOIN assignments a ON a.employee_id = e.id\r\n GROUP BY e.id, e.name\r\nHAVING COUNT(a.employee_id) = 0;\r\n\r\n-- Similar query, but returns only employees who have at least one project assigned.\r\n-- Note the use of `INNER JOIN`: since we are only interested in employees with a\r\n-- matching assignment, an inner join is both sufficient and more efficient in this case.\r\n--\r\n-- The `HAVING COUNT(a.employee_id) > 0` condition ensures that only employees\r\n-- with one or more matching rows in the `assignments` table are returned.\r\n-- As with the previous example, `a.employee_id` is safe to count because it cannot be null\r\n-- due to the join condition (`a.employee_id = e.id`) filtering out nulls.\r\n--\r\n-- Finishes in 0.03s.\r\nSELECT e.id, e.name\r\n FROM employees e\r\n JOIN assignments a ON a.employee_id = e.id\r\n GROUP BY e.id, e.name\r\nHAVING COUNT(a.employee_id) > 0;\n"})}),"\n",(0,t.jsx)(n.p,{children:"This example demonstrates drastic performance improvement you can gain by improving your queries:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- This query returns all employees whose salary is the minimum within their department.\r\n--\r\n-- Finishes in 18s.\r\nSELECT e.*\r\n FROM employees e\r\n WHERE e.salary = (SELECT MIN(salary) FROM employees WHERE department_id = e.department_id);\r\n\r\n-- Equivalent query without a correlated subquery.\r\n-- Instead of comparing each employee's salary with a scalar subquery result,\r\n-- we precompute the minimum salary per department using a grouped subquery,\r\n-- and then join it back to the employees table.\r\n--\r\n-- This rewrite is safe because:\r\n-- - For each department, we compute the minimum salary exactly once.\r\n-- - The join condition ensures we only return employees whose salary matches\r\n-- the minimum salary for their department.\r\n-- - No grouping is needed on the outer query because we're performing an equality match\r\n-- on both `department_id` and the computed minimum salary.\r\n--\r\n-- This approach avoids per-row subquery evaluation and leverages set-based operations,\r\n-- which are significantly faster.\r\n--\r\n-- Finishes in 0.02s.\r\nSELECT e.*\r\n FROM employees e\r\n JOIN (\r\n SELECT department_id, MIN(salary) AS min_salary\r\n FROM employees\r\n GROUP BY department_id\r\n ) AS min_salaries_by_department\r\n ON e.department_id = min_salaries_by_department.department_id\r\n AND e.salary = min_salaries_by_department.min_salary;\n"})}),"\n",(0,t.jsx)(n.h2,{id:"dropping-cached-plans",children:"Dropping Cached Plans"}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"This is an experimental API."})}),"\n",(0,t.jsxs)(n.p,{children:["As optimizing the query plan is a resource-intensive operation, Apache Ignite caches the plan and reuses it for subsequent related queries. As data is updated, the plan may be outdated and require recalculation. By default, the plans expire after the period specified in the ",(0,t.jsx)(n.code,{children:"ignite.planner.planCacheExpiresAfterSeconds"})," parameter (1800 seconds by default)."]}),"\n",(0,t.jsxs)(n.p,{children:["To force the update earlier, you can use the ",(0,t.jsx)(n.code,{children:"sql planner invalidate-cache"})," CLI tool command."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"sql planner invalidate-cache --tables=PUBLIC.Person\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/da66ee89.f2ee4653.js b/docs/ignite3/assets/js/da66ee89.f2ee4653.js deleted file mode 100644 index f0b598a2e7..0000000000 --- a/docs/ignite3/assets/js/da66ee89.f2ee4653.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7577],{5369:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"api-reference/native-clients/java/server-api","title":"Server API","description":"The Ignite interface provides access to an embedded cluster node. Applications using the embedded approach run as full cluster participants that store data, process queries, and participate in cluster operations. This contrasts with thin clients that connect remotely without storing data.","source":"@site/docs/api-reference/native-clients/java/server-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/server-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Server API","id":"server-api","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Client API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api"},"next":{"title":"Tables API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api"}}');var i=t(74848),s=t(28453);const a={title:"Server API",id:"server-api",sidebar_position:2},o="Server API",c={},l=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Node Initialization",id:"node-initialization",level:2},{value:"Resource Access",id:"resource-access",level:2},{value:"Table Operations",id:"table-operations",level:2},{value:"SQL Execution",id:"sql-execution",level:2},{value:"Transaction Management",id:"transaction-management",level:2},{value:"Compute Operations",id:"compute-operations",level:2},{value:"Catalog Management",id:"catalog-management",level:2},{value:"Cluster Information",id:"cluster-information",level:2},{value:"Lifecycle Management",id:"lifecycle-management",level:2},{value:"Reference",id:"reference",level:2},{value:"IgniteServer Methods",id:"igniteserver-methods",level:3},{value:"Ignite API Methods",id:"ignite-api-methods",level:3},{value:"Subsystem Facades",id:"subsystem-facades",level:3},{value:"Network Types",id:"network-types",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"server-api",children:"Server API"})}),"\n",(0,i.jsx)(n.p,{children:"The Ignite interface provides access to an embedded cluster node. Applications using the embedded approach run as full cluster participants that store data, process queries, and participate in cluster operations. This contrasts with thin clients that connect remotely without storing data."}),"\n",(0,i.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,i.jsx)(n.p,{children:"An embedded node initializes as part of the application process. The node joins the cluster during startup and provides direct access to all cluster subsystems. Since the node stores data locally, operations execute without network hops when accessing colocated data."}),"\n",(0,i.jsx)(n.p,{children:"The Ignite interface serves as the primary entry point for all operations. Applications obtain references to tables, SQL engines, transaction managers, compute capabilities, and catalog management through this interface."}),"\n",(0,i.jsx)(n.h2,{id:"node-initialization",children:"Node Initialization"}),"\n",(0,i.jsx)(n.p,{children:"Start an embedded node using the IgniteServer start method:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'IgniteServer server = IgniteServer.start(\r\n "myNode",\r\n Path.of("/config/ignite-config.conf"),\r\n Path.of("/work/dir")\r\n);\r\n\r\nserver.initCluster(\r\n InitParameters.builder()\r\n .metaStorageNodes(server)\r\n .cmgNodes(server)\r\n .build()\r\n);\r\n\r\nIgnite ignite = server.api();\r\nString nodeName = ignite.name();\r\nSystem.out.println("Node started: " + nodeName);\r\n\r\n// Use node for operations\n'})}),"\n",(0,i.jsx)(n.p,{children:"The start method requires a node name, configuration file path, and work directory. The node name must be unique within the cluster. After starting, initialize the cluster and obtain the Ignite API through the api() method."}),"\n",(0,i.jsx)(n.h2,{id:"resource-access",children:"Resource Access"}),"\n",(0,i.jsx)(n.p,{children:"Access cluster resources through the Ignite interface:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:"IgniteTables tables = ignite.tables();\r\nIgniteSql sql = ignite.sql();\r\nIgniteTransactions transactions = ignite.transactions();\r\nIgniteCompute compute = ignite.compute();\r\nIgniteCatalog catalog = ignite.catalog();\r\nIgniteCluster cluster = ignite.cluster();\n"})}),"\n",(0,i.jsx)(n.p,{children:"Each accessor returns a facade for the corresponding subsystem. These facades remain valid for the node lifetime."}),"\n",(0,i.jsx)(n.h2,{id:"table-operations",children:"Table Operations"}),"\n",(0,i.jsx)(n.p,{children:"Obtain table references for data operations:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'Table users = ignite.tables().table("users");\r\nif (users != null) {\r\n RecordView view = users.recordView();\r\n // Perform operations\r\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"The table method returns null if the table does not exist."}),"\n",(0,i.jsx)(n.h2,{id:"sql-execution",children:"SQL Execution"}),"\n",(0,i.jsx)(n.p,{children:"Execute SQL queries using the SQL facade:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'try (ResultSet rs = ignite.sql().execute(\r\n null,\r\n "SELECT * FROM users WHERE age > ?",\r\n 25\r\n)) {\r\n while (rs.hasNext()) {\r\n SqlRow row = rs.next();\r\n System.out.println(row.stringValue("name"));\r\n }\r\n}\n'})}),"\n",(0,i.jsx)(n.p,{children:"Pass null as the transaction parameter for auto-commit execution."}),"\n",(0,i.jsx)(n.h2,{id:"transaction-management",children:"Transaction Management"}),"\n",(0,i.jsx)(n.p,{children:"Manage transactions through the transaction facade:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'ignite.transactions().runInTransaction(tx -> {\r\n Table table = ignite.tables().table("accounts");\r\n RecordView view = table.recordView();\r\n\r\n Tuple key = Tuple.create().set("id", 1);\r\n Tuple record = view.get(tx, key);\r\n\r\n record.set("balance", record.intValue("balance") + 100);\r\n view.put(tx, record);\r\n});\n'})}),"\n",(0,i.jsx)(n.p,{children:"The runInTransaction method automatically commits on normal completion and rolls back on exceptions."}),"\n",(0,i.jsx)(n.h2,{id:"compute-operations",children:"Compute Operations"}),"\n",(0,i.jsx)(n.p,{children:"Submit compute jobs for distributed execution:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'JobDescriptor descriptor =\r\n JobDescriptor.of("com.example.WordCountJob");\r\n\r\nCompletableFuture> execution =\r\n ignite.compute().submitAsync(\r\n JobTarget.anyNode(ignite.cluster().nodes()),\r\n descriptor,\r\n "input text"\r\n );\r\n\r\nInteger result = execution\r\n .thenCompose(JobExecution::resultAsync)\r\n .join();\n'})}),"\n",(0,i.jsx)(n.p,{children:"The compute facade submits jobs to cluster nodes based on the specified targeting strategy."}),"\n",(0,i.jsx)(n.h2,{id:"catalog-management",children:"Catalog Management"}),"\n",(0,i.jsx)(n.p,{children:"Manage schema definitions through the catalog facade:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'TableDefinition definition = TableDefinition.builder("products")\r\n .columns(\r\n ColumnDefinition.column("id", ColumnType.INT32),\r\n ColumnDefinition.column("name", ColumnType.STRING)\r\n )\r\n .primaryKey("id")\r\n .build();\r\n\r\nignite.catalog().createTableAsync(definition).join();\n'})}),"\n",(0,i.jsx)(n.p,{children:"The catalog facade provides programmatic schema management without executing DDL statements."}),"\n",(0,i.jsx)(n.h2,{id:"cluster-information",children:"Cluster Information"}),"\n",(0,i.jsx)(n.p,{children:"Access cluster topology information:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'Collection nodes = ignite.cluster().nodes();\r\nfor (ClusterNode node : nodes) {\r\n NetworkAddress address = node.address();\r\n System.out.println("Node: " + node.name() + " at " + address.host() + ":" + address.port());\r\n}\r\n\r\nClusterNode local = ignite.cluster().localNode();\r\nSystem.out.println("Local node: " + local.name());\n'})}),"\n",(0,i.jsx)(n.p,{children:"The cluster().nodes() method returns all active cluster members. The cluster facade provides access to local node information and cluster-wide operations."}),"\n",(0,i.jsx)(n.h2,{id:"lifecycle-management",children:"Lifecycle Management"}),"\n",(0,i.jsx)(n.p,{children:"Properly shut down the node to release resources:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'IgniteServer server = IgniteServer.start("node1", configPath, workDir);\r\nserver.initCluster(InitParameters.builder()\r\n .metaStorageNodes(server)\r\n .cmgNodes(server)\r\n .build());\r\n\r\nIgnite ignite = server.api();\r\n// Use node\r\n\r\nserver.shutdown();\n'})}),"\n",(0,i.jsx)(n.p,{children:"Shutting down the node stops local subsystems and removes the node from the cluster. Note that IgniteServer provides shutdown() methods, while the Ignite interface does not implement AutoCloseable."}),"\n",(0,i.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Server interface: ",(0,i.jsx)(n.code,{children:"org.apache.ignite.IgniteServer"})]}),"\n",(0,i.jsxs)(n.li,{children:["API interface: ",(0,i.jsx)(n.code,{children:"org.apache.ignite.Ignite"})]}),"\n",(0,i.jsxs)(n.li,{children:["Network types: ",(0,i.jsx)(n.code,{children:"org.apache.ignite.network.NetworkAddress"}),", ",(0,i.jsx)(n.code,{children:"org.apache.ignite.network.ClusterNode"})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"igniteserver-methods",children:"IgniteServer Methods"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"static IgniteServer start(String nodeName, Path configPath, Path workDir)"})," - Start an embedded node"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void initCluster(InitParameters parameters)"})," - Initialize the cluster"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Ignite api()"})," - Get the Ignite API facade"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void shutdown()"})," - Stop the node"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"String name()"})," - Returns the node name"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"ignite-api-methods",children:"Ignite API Methods"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"String name()"})," - Returns the node name"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteTables tables()"})," - Access table management"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteTransactions transactions()"})," - Access transaction management"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteSql sql()"})," - Access SQL query engine"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteCompute compute()"})," - Access compute job execution"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteCatalog catalog()"})," - Access catalog management"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteCluster cluster()"})," - Access cluster information"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"subsystem-facades",children:"Subsystem Facades"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteTables"})," - Table discovery and access"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteTransactions"})," - Transaction lifecycle management"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteSql"})," - SQL query execution"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteCompute"})," - Distributed job execution"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteCatalog"})," - Schema definition management"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"IgniteCluster"})," - Cluster topology and node information"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"network-types",children:"Network Types"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"NetworkAddress"})," - Represents a network address with host and port","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"String host()"})," - Returns the host name"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"int port()"})," - Returns the port number"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ClusterNode"})," - Represents a node in the cluster","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"String name()"})," - Returns the node name"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"NetworkAddress address()"})," - Returns the network address"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"UUID id()"})," - Returns the node ID"]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var r=t(96540);const i={},s=r.createContext(i);function a(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/dad9a2fd.e4119e3e.js b/docs/ignite3/assets/js/dad9a2fd.e4119e3e.js deleted file mode 100644 index b3737b20b3..0000000000 --- a/docs/ignite3/assets/js/dad9a2fd.e4119e3e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3928],{22626:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"api-reference/native-clients/index","title":"Native Client APIs","description":"Full-featured native clients for multiple programming languages.","source":"@site/docs/api-reference/native-clients/index.mdx","sourceDirName":"api-reference/native-clients","slug":"/api-reference/native-clients/","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Native Client APIs"},"sidebar":"tutorialSidebar","previous":{"title":"API Reference","permalink":"/docs/ignite3/3.1.0/api-reference/"},"next":{"title":"Java API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/"}}');var s=i(74848),a=i(28453);const r={title:"Native Client APIs"},c="Native Client APIs",l={},d=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function o(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components},{IIcon:i}=n;return i||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"native-client-apis",children:"Native Client APIs"})}),"\n",(0,s.jsx)(n.p,{children:"Full-featured native clients for multiple programming languages."}),"\n",(0,s.jsx)(n.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,s.jsxs)("div",{className:"card-container",children:[(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:openjdk",height:"24"})," Java API (PRIMARY)"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Primary Ignite API with complete feature set including thin client, embedded node, and all platform capabilities."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./native-clients/java/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:dotnet",height:"24"})," .NET API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"Native .NET client for C# and F# applications with async/await patterns and LINQ support."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./native-clients/dotnet/",children:"Learn more \u2192"})})]}),(0,s.jsxs)("div",{className:"card",children:[(0,s.jsx)("div",{className:"card__header",children:(0,s.jsxs)("h3",{children:[(0,s.jsx)(i,{icon:"simple-icons:cplusplus",height:"24"})," C++ API"]})}),(0,s.jsx)("div",{className:"card__body",children:(0,s.jsx)("p",{children:"High-performance C++ client with modern C++17 features and zero-copy operations."})}),(0,s.jsx)("div",{className:"card__footer",children:(0,s.jsx)("a",{href:"./native-clients/cpp/",children:"Learn more \u2192"})})]})]}),"\n",(0,s.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"sql-only-apis",children:"SQL-Only APIs"})," - JDBC, ODBC, and Python"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"api",children:"API Documentation"})," - External API docs"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"../develop",children:"Develop"})," - Build applications"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>c});var t=i(96540);const s={},a=t.createContext(s);function r(e){const n=t.useContext(a);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/dcbc23ab.468aa6c2.js b/docs/ignite3/assets/js/dcbc23ab.468aa6c2.js deleted file mode 100644 index af5b164022..0000000000 --- a/docs/ignite3/assets/js/dcbc23ab.468aa6c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[797],{28453:(n,e,t)=>{t.d(e,{R:()=>s,x:()=>c});var i=t(96540);const r={},o=i.createContext(r);function s(n){const e=i.useContext(o);return i.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function c(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:s(n.components),i.createElement(o.Provider,{value:e},n.children)}},58922:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"api-reference/native-clients/dotnet/network-api","title":"Network API","description":"The Network API provides information about cluster topology and active client connections. Use this API to discover cluster nodes, inspect connection status, and understand cluster composition.","source":"@site/docs/api-reference/native-clients/dotnet/network-api.md","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/network-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"Network API","id":"network-api","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"Compute API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api"},"next":{"title":"C++ API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/"}}');var r=t(74848),o=t(28453);const s={title:"Network API",id:"network-api",sidebar_position:7},c="Network API",l={},a=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Node Identity",id:"node-identity",level:3},{value:"Connection Management",id:"connection-management",level:3},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Getting Cluster Nodes",id:"getting-cluster-nodes",level:3},{value:"Inspecting Active Connections",id:"inspecting-active-connections",level:3},{value:"Finding Specific Nodes",id:"finding-specific-nodes",level:3},{value:"Monitoring Connection Health",id:"monitoring-connection-health",level:3},{value:"Using Node Information for Job Targeting",id:"using-node-information-for-job-targeting",level:3},{value:"Connection Status Check",id:"connection-status-check",level:3},{value:"SSL Connection Information",id:"ssl-connection-information",level:3},{value:"Cluster Size Monitoring",id:"cluster-size-monitoring",level:3},{value:"Node Address Parsing",id:"node-address-parsing",level:3},{value:"Reference",id:"reference",level:2},{value:"IClusterNode Interface",id:"iclusternode-interface",level:3},{value:"IConnectionInfo Interface",id:"iconnectioninfo-interface",level:3},{value:"ISslInfo Interface",id:"isslinfo-interface",level:3},{value:"IIgniteClient Methods",id:"iigniteclient-methods",level:3},{value:"Best Practices",id:"best-practices",level:3}];function d(n){const e={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"network-api",children:"Network API"})}),"\n",(0,r.jsx)(e.p,{children:"The Network API provides information about cluster topology and active client connections. Use this API to discover cluster nodes, inspect connection status, and understand cluster composition."}),"\n",(0,r.jsx)(e.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,r.jsx)(e.p,{children:"Cluster nodes represent individual server instances in the Ignite cluster. Each node has a unique identifier and network address. The client maintains connections to cluster nodes and distributes operations across them."}),"\n",(0,r.jsx)(e.h3,{id:"node-identity",children:"Node Identity"}),"\n",(0,r.jsx)(e.p,{children:"Nodes have two identifiers. The node ID changes after restart and uniquely identifies the current node instance. The node name (consistent ID) persists across restarts and identifies the node permanently."}),"\n",(0,r.jsx)(e.h3,{id:"connection-management",children:"Connection Management"}),"\n",(0,r.jsx)(e.p,{children:"The client automatically manages connections to cluster nodes. Query active connections to understand which nodes the client is currently connected to and inspect connection properties like SSL configuration."}),"\n",(0,r.jsx)(e.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,r.jsx)(e.h3,{id:"getting-cluster-nodes",children:"Getting Cluster Nodes"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var client = await IgniteClient.StartAsync(configuration);\r\n\r\n// Get all cluster nodes\r\nvar nodes = await client.GetClusterNodesAsync();\r\n\r\nforeach (var node in nodes)\r\n{\r\n Console.WriteLine($"Node: {node.Name}");\r\n Console.WriteLine($" ID: {node.Id}");\r\n Console.WriteLine($" Address: {node.Address}");\r\n}\n'})}),"\n",(0,r.jsx)(e.h3,{id:"inspecting-active-connections",children:"Inspecting Active Connections"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var connections = client.GetConnections();\r\n\r\nConsole.WriteLine($"Active connections: {connections.Count}");\r\n\r\nforeach (var conn in connections)\r\n{\r\n Console.WriteLine($"Connected to: {conn.Node.Name}");\r\n Console.WriteLine($" Node ID: {conn.Node.Id}");\r\n Console.WriteLine($" Address: {conn.Node.Address}");\r\n\r\n if (conn.SslInfo != null)\r\n {\r\n Console.WriteLine($" SSL: Enabled");\r\n Console.WriteLine($" Protocol: {conn.SslInfo.SslProtocol}");\r\n Console.WriteLine($" Cipher: {conn.SslInfo.NegotiatedCipherSuiteName}");\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(e.h3,{id:"finding-specific-nodes",children:"Finding Specific Nodes"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var nodes = await client.GetClusterNodesAsync();\r\n\r\n// Find by name\r\nvar targetNode = nodes.FirstOrDefault(n => n.Name == "node-01");\r\nif (targetNode != null)\r\n{\r\n Console.WriteLine($"Found node: {targetNode.Name} at {targetNode.Address}");\r\n}\r\n\r\n// Find by ID\r\nvar nodeId = Guid.Parse("550e8400-e29b-41d4-a716-446655440000");\r\nvar nodeById = nodes.FirstOrDefault(n => n.Id == nodeId);\n'})}),"\n",(0,r.jsx)(e.h3,{id:"monitoring-connection-health",children:"Monitoring Connection Health"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var checkInterval = TimeSpan.FromSeconds(30);\r\n\r\nwhile (true)\r\n{\r\n var connections = client.GetConnections();\r\n\r\n if (connections.Count == 0)\r\n {\r\n Console.WriteLine("WARNING: No active connections!");\r\n }\r\n else\r\n {\r\n Console.WriteLine($"Connected to {connections.Count} nodes:");\r\n foreach (var conn in connections)\r\n {\r\n Console.WriteLine($" - {conn.Node.Name}");\r\n }\r\n }\r\n\r\n await Task.Delay(checkInterval);\r\n}\n'})}),"\n",(0,r.jsx)(e.h3,{id:"using-node-information-for-job-targeting",children:"Using Node Information for Job Targeting"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var nodes = await client.GetClusterNodesAsync();\r\nvar compute = client.Compute;\r\n\r\n// Target specific node by name\r\nvar targetNode = nodes.FirstOrDefault(n => n.Name.StartsWith("compute"));\r\nif (targetNode != null)\r\n{\r\n var jobTarget = JobTarget.Node(targetNode);\r\n var execution = await compute.SubmitAsync(\r\n jobTarget, jobDescriptor, "input");\r\n var result = await execution.GetResultAsync();\r\n}\r\n\r\n// Target node by index (round-robin)\r\nvar nodeIndex = DateTime.UtcNow.Ticks % nodes.Count;\r\nvar selectedNode = nodes[(int)nodeIndex];\n'})}),"\n",(0,r.jsx)(e.h3,{id:"connection-status-check",children:"Connection Status Check"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:"public async Task IsConnectedToCluster(IIgniteClient client)\r\n{\r\n try\r\n {\r\n var connections = client.GetConnections();\r\n var nodes = await client.GetClusterNodesAsync();\r\n\r\n return connections.Count > 0 && nodes.Count > 0;\r\n }\r\n catch (Exception)\r\n {\r\n return false;\r\n }\r\n}\n"})}),"\n",(0,r.jsx)(e.h3,{id:"ssl-connection-information",children:"SSL Connection Information"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var connections = client.GetConnections();\r\n\r\nforeach (var conn in connections)\r\n{\r\n if (conn.SslInfo != null)\r\n {\r\n Console.WriteLine($"Node: {conn.Node.Name}");\r\n Console.WriteLine($" SSL Protocol: {conn.SslInfo.SslProtocol}");\r\n Console.WriteLine($" Cipher Suite: {conn.SslInfo.NegotiatedCipherSuiteName}");\r\n Console.WriteLine($" Target Host: {conn.SslInfo.TargetHostName}");\r\n Console.WriteLine($" Mutually Authenticated: {conn.SslInfo.IsMutuallyAuthenticated}");\r\n\r\n var localCert = conn.SslInfo.LocalCertificate;\r\n var remoteCert = conn.SslInfo.RemoteCertificate;\r\n\r\n if (localCert != null)\r\n {\r\n Console.WriteLine($" Local Certificate: {localCert.Subject}");\r\n }\r\n\r\n if (remoteCert != null)\r\n {\r\n Console.WriteLine($" Remote Certificate: {remoteCert.Subject}");\r\n Console.WriteLine($" Valid Until: {remoteCert.GetExpirationDateString()}");\r\n }\r\n }\r\n else\r\n {\r\n Console.WriteLine($"Node: {conn.Node.Name} (unencrypted)");\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(e.h3,{id:"cluster-size-monitoring",children:"Cluster Size Monitoring"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'public class ClusterMonitor\r\n{\r\n private readonly IIgniteClient _client;\r\n private int _lastKnownSize;\r\n\r\n public ClusterMonitor(IIgniteClient client)\r\n {\r\n _client = client;\r\n }\r\n\r\n public async Task MonitorAsync(CancellationToken cancellationToken)\r\n {\r\n while (!cancellationToken.IsCancellationRequested)\r\n {\r\n var nodes = await _client.GetClusterNodesAsync();\r\n var currentSize = nodes.Count;\r\n\r\n if (currentSize != _lastKnownSize)\r\n {\r\n if (_lastKnownSize > 0)\r\n {\r\n if (currentSize > _lastKnownSize)\r\n {\r\n Console.WriteLine($"Cluster grew: {_lastKnownSize} -> {currentSize} nodes");\r\n }\r\n else\r\n {\r\n Console.WriteLine($"Cluster shrunk: {_lastKnownSize} -> {currentSize} nodes");\r\n }\r\n }\r\n\r\n _lastKnownSize = currentSize;\r\n }\r\n\r\n await Task.Delay(TimeSpan.FromSeconds(10), cancellationToken);\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(e.h3,{id:"node-address-parsing",children:"Node Address Parsing"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:'var nodes = await client.GetClusterNodesAsync();\r\n\r\nforeach (var node in nodes)\r\n{\r\n var address = node.Address;\r\n\r\n if (address is IPEndPoint ipEndPoint)\r\n {\r\n Console.WriteLine($"Node: {node.Name}");\r\n Console.WriteLine($" IP: {ipEndPoint.Address}");\r\n Console.WriteLine($" Port: {ipEndPoint.Port}");\r\n }\r\n else if (address is DnsEndPoint dnsEndPoint)\r\n {\r\n Console.WriteLine($"Node: {node.Name}");\r\n Console.WriteLine($" Host: {dnsEndPoint.Host}");\r\n Console.WriteLine($" Port: {dnsEndPoint.Port}");\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(e.h2,{id:"reference",children:"Reference"}),"\n",(0,r.jsx)(e.h3,{id:"iclusternode-interface",children:"IClusterNode Interface"}),"\n",(0,r.jsx)(e.p,{children:"Properties:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Id"})," - Unique node identifier (Guid) that changes after node restart"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Name"})," - Consistent node name that persists across restarts"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Address"})," - Network endpoint (IPEndPoint or DnsEndPoint)"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"The node ID is unique to the current node instance and changes when the node restarts. The node name remains consistent across restarts and serves as a stable identifier for the node."}),"\n",(0,r.jsx)(e.h3,{id:"iconnectioninfo-interface",children:"IConnectionInfo Interface"}),"\n",(0,r.jsx)(e.p,{children:"Properties:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"Node"})," - The cluster node this connection targets"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"SslInfo"})," - SSL connection details (null if SSL not enabled)"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Connection info describes an active client connection to a cluster node. The client may maintain multiple connections to different nodes simultaneously."}),"\n",(0,r.jsx)(e.h3,{id:"isslinfo-interface",children:"ISslInfo Interface"}),"\n",(0,r.jsx)(e.p,{children:"Properties:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"SslProtocol"})," - SSL/TLS protocol version (e.g., Tls12, Tls13)"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"NegotiatedCipherSuiteName"})," - Cipher suite negotiated for the connection"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"TargetHostName"})," - Server hostname used for certificate validation"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"IsMutuallyAuthenticated"})," - Whether both client and server are authenticated"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"LocalCertificate"})," - Client certificate (if provided)"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RemoteCertificate"})," - Server certificate"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"SSL information is only available when SSL is configured through IgniteClientConfiguration.SslStreamFactory. When SSL is not enabled, IConnectionInfo.SslInfo returns null."}),"\n",(0,r.jsx)(e.h3,{id:"iigniteclient-methods",children:"IIgniteClient Methods"}),"\n",(0,r.jsx)(e.p,{children:"Node discovery:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"GetClusterNodesAsync()"})," - Get all cluster nodes"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Connection inspection:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"GetConnections()"})," - Get active client connections to cluster nodes"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"best-practices",children:"Best Practices"}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Cache node lists"})," when possible. Cluster topology changes infrequently, so repeated calls to GetClusterNodesAsync may be unnecessary."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Use node names for stable targeting"}),". Node IDs change on restart, but node names persist. Use names when you need consistent targeting across node restarts."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Monitor connection count"})," to detect connectivity issues. A sudden drop in active connections may indicate network problems or node failures."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Check SSL configuration"})," in production. Verify SSL is properly configured by inspecting ISslInfo properties to ensure connections are encrypted."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Handle node changes gracefully"}),". Cluster topology can change as nodes join or leave. Design applications to adapt to topology changes without manual intervention."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Use connection info for diagnostics"}),". Connection details help troubleshoot network issues, SSL problems, and load distribution across nodes."]})]})}function h(n={}){const{wrapper:e}={...(0,o.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(d,{...n})}):d(n)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/dd4c3c7d.ab668eea.js b/docs/ignite3/assets/js/dd4c3c7d.ab668eea.js deleted file mode 100644 index d325351ccf..0000000000 --- a/docs/ignite3/assets/js/dd4c3c7d.ab668eea.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2919],{28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>s});var r=i(96540);const l={},t=r.createContext(l);function o(e){const n=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),r.createElement(t.Provider,{value:n},e.children)}},90330:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>g,frontMatter:()=>o,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"develop/work-with-data/java-client-logging","title":"Java Client Logging","description":"The Apache Ignite 3 Java thin client uses the System.Logger API introduced in Java 9, which allows integration with any logging framework while providing sensible defaults.","source":"@site/docs/develop/work-with-data/java-client-logging.md","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/java-client-logging","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"java-client-logging","title":"Java Client Logging"},"sidebar":"tutorialSidebar","previous":{"title":"Creating Tables from Java Classes","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables"},"next":{"title":"Integrate","permalink":"/docs/ignite3/3.1.0/develop/integrate/"}}');var l=i(74848),t=i(28453);const o={id:"java-client-logging",title:"Java Client Logging"},s=void 0,a={},c=[{value:"How Client Logging Works",id:"how-client-logging-works",level:2},{value:"Log Level Name Mapping",id:"log-level-name-mapping",level:2},{value:"Configuring java.util.logging (Default)",id:"configuring-javautillogging-default",level:2},{value:"Properties File Configuration",id:"properties-file-configuration",level:3},{value:"Programmatic Configuration",id:"programmatic-configuration",level:3},{value:"Configuring Logback",id:"configuring-logback",level:2},{value:"Integrating SLF4J with System.Logger",id:"integrating-slf4j-with-systemlogger",level:3},{value:"Configuring Log4j2",id:"configuring-log4j2",level:2},{value:"Log Categories",id:"log-categories",level:2},{value:"What Each Level Logs",id:"what-each-level-logs",level:2},{value:"TRACE (JUL: FINER)",id:"trace-jul-finer",level:3},{value:"DEBUG (JUL: FINE)",id:"debug-jul-fine",level:3},{value:"INFO",id:"info",level:3},{value:"WARN (JUL: WARNING)",id:"warn-jul-warning",level:3},{value:"ERROR (JUL: SEVERE)",id:"error-jul-severe",level:3},{value:"Production Recommendations",id:"production-recommendations",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"No log output appears",id:"no-log-output-appears",level:3},{value:""Bad level" exception at startup",id:"bad-level-exception-at-startup",level:3},{value:"Logs appear on console but not in file",id:"logs-appear-on-console-but-not-in-file",level:3},{value:"Duplicate log messages",id:"duplicate-log-messages",level:3}];function d(e){const n={code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(n.p,{children:["The Apache Ignite 3 Java thin client uses the ",(0,l.jsx)(n.code,{children:"System.Logger"})," API introduced in Java 9, which allows integration with any logging framework while providing sensible defaults."]}),"\n",(0,l.jsx)(n.h2,{id:"how-client-logging-works",children:"How Client Logging Works"}),"\n",(0,l.jsxs)(n.p,{children:["The Ignite 3 client accepts a ",(0,l.jsx)(n.code,{children:"LoggerFactory"})," through its builder API. This factory creates ",(0,l.jsx)(n.code,{children:"System.Logger"})," instances for each internal component. When no factory is provided, the client uses ",(0,l.jsx)(n.code,{children:"System::getLogger"}),", which delegates to the JDK Platform Logging system."]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .loggerFactory(System::getLogger) // Optional: this is the default\r\n .build();\n'})}),"\n",(0,l.jsxs)(n.p,{children:["The JDK Platform Logging system routes to ",(0,l.jsx)(n.code,{children:"java.util.logging"})," (JUL) by default. This means log output appears on the console (standard error) at INFO level unless you configure it otherwise."]}),"\n",(0,l.jsx)(n.h2,{id:"log-level-name-mapping",children:"Log Level Name Mapping"}),"\n",(0,l.jsx)(n.p,{children:"Different logging frameworks use different names for the same log levels. This distinction matters because using the wrong name in a configuration file causes parsing errors."}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Severity"}),(0,l.jsx)(n.th,{children:"System.Logger"}),(0,l.jsx)(n.th,{children:"java.util.logging"}),(0,l.jsx)(n.th,{children:"Logback / Log4j2"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Most verbose"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"TRACE"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"FINER"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"TRACE"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Diagnostic"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"DEBUG"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"FINE"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"DEBUG"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Informational"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"INFO"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"INFO"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"INFO"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Potential issues"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"WARNING"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"WARNING"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"WARN"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:"Failures"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"ERROR"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"SEVERE"})}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"ERROR"})})]})]})]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"JUL accepts only these level names:"})," ",(0,l.jsx)(n.code,{children:"SEVERE"}),", ",(0,l.jsx)(n.code,{children:"WARNING"}),", ",(0,l.jsx)(n.code,{children:"INFO"}),", ",(0,l.jsx)(n.code,{children:"CONFIG"}),", ",(0,l.jsx)(n.code,{children:"FINE"}),", ",(0,l.jsx)(n.code,{children:"FINER"}),", ",(0,l.jsx)(n.code,{children:"FINEST"}),", ",(0,l.jsx)(n.code,{children:"ALL"}),", ",(0,l.jsx)(n.code,{children:"OFF"})]}),"\n",(0,l.jsxs)(n.p,{children:["Using System.Logger names like ",(0,l.jsx)(n.code,{children:"DEBUG"})," or ",(0,l.jsx)(n.code,{children:"TRACE"})," in a ",(0,l.jsx)(n.code,{children:"logging.properties"})," file throws ",(0,l.jsx)(n.code,{children:'IllegalArgumentException: Bad level "DEBUG"'}),". This is a common source of configuration errors."]}),"\n",(0,l.jsx)(n.h2,{id:"configuring-javautillogging-default",children:"Configuring java.util.logging (Default)"}),"\n",(0,l.jsx)(n.p,{children:"When using the default logger factory, configure logging through JUL. You can use either a properties file or programmatic configuration."}),"\n",(0,l.jsx)(n.h3,{id:"properties-file-configuration",children:"Properties File Configuration"}),"\n",(0,l.jsxs)(n.p,{children:["Create a file named ",(0,l.jsx)(n.code,{children:"logging.properties"}),":"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-properties",children:"# Set the Ignite client package to FINE (equivalent to DEBUG)\r\n# Both the logger and handler levels must be set for messages to appear\r\norg.apache.ignite.internal.client.level = FINE\r\n\r\n# The handler acts as a secondary filter on log output\r\njava.util.logging.ConsoleHandler.level = FINE\r\njava.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter\r\n\r\n# File output (optional)\r\njava.util.logging.FileHandler.pattern = %h/ignite-client%u.log\r\njava.util.logging.FileHandler.level = FINE\r\njava.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter\r\nhandlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler\n"})}),"\n",(0,l.jsx)(n.p,{children:"Load the configuration at JVM startup:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"java -Djava.util.logging.config.file=/path/to/logging.properties -jar your-app.jar\n"})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"File output location:"})," The ",(0,l.jsx)(n.code,{children:"%h"})," token resolves to the user home directory. The ",(0,l.jsx)(n.code,{children:"%u"})," token adds a unique number to prevent file conflicts when multiple JVMs run simultaneously. Example path: ",(0,l.jsx)(n.code,{children:"/home/user/ignite-client0.log"})]}),"\n",(0,l.jsx)(n.h3,{id:"programmatic-configuration",children:"Programmatic Configuration"}),"\n",(0,l.jsx)(n.p,{children:"Configure JUL before creating the client. This approach works when you cannot modify JVM startup parameters."}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-java",children:'import java.util.logging.*;\r\nimport java.io.IOException;\r\n\r\npublic class IgniteClientApp {\r\n public static void main(String[] args) {\r\n configureLogging();\r\n\r\n try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()) {\r\n // Application code\r\n }\r\n }\r\n\r\n private static void configureLogging() {\r\n Logger igniteLogger = Logger.getLogger("org.apache.ignite.internal.client");\r\n igniteLogger.setLevel(Level.FINE);\r\n\r\n ConsoleHandler consoleHandler = new ConsoleHandler();\r\n consoleHandler.setLevel(Level.FINE);\r\n igniteLogger.addHandler(consoleHandler);\r\n\r\n try {\r\n FileHandler fileHandler = new FileHandler("ignite-client.log", true);\r\n fileHandler.setLevel(Level.FINE);\r\n fileHandler.setFormatter(new SimpleFormatter());\r\n igniteLogger.addHandler(fileHandler);\r\n } catch (IOException e) {\r\n System.err.println("Failed to create log file: " + e.getMessage());\r\n }\r\n }\r\n}\n'})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"File output location:"})," The ",(0,l.jsx)(n.code,{children:"FileHandler"})," writes to the current working directory when given a relative path. Use an absolute path like ",(0,l.jsx)(n.code,{children:"/var/log/myapp/ignite-client.log"})," for predictable file placement."]}),"\n",(0,l.jsx)(n.h2,{id:"configuring-logback",children:"Configuring Logback"}),"\n",(0,l.jsxs)(n.p,{children:["Logback and SLF4J use their own level names (DEBUG, TRACE, WARN, ERROR), not JUL names. Configure logging in ",(0,l.jsx)(n.code,{children:"logback.xml"}),":"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-xml",children:'\r\n \r\n \r\n %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\r\n \r\n \r\n\r\n \r\n logs/ignite-client.log\r\n \r\n logs/ignite-client.%d{yyyy-MM-dd}.log\r\n 30\r\n \r\n \r\n %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\n'})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"File output location:"})," Logs write to ",(0,l.jsx)(n.code,{children:"logs/ignite-client.log"})," relative to the working directory. The rolling policy archives files daily with names like ",(0,l.jsx)(n.code,{children:"logs/ignite-client.2024-01-15.log"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"integrating-slf4j-with-systemlogger",children:"Integrating SLF4J with System.Logger"}),"\n",(0,l.jsxs)(n.p,{children:["The Ignite client requires a ",(0,l.jsx)(n.code,{children:"System.Logger"}),", but Logback provides SLF4J loggers. Create an adapter to bridge the two:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-java",children:"import org.apache.ignite.lang.LoggerFactory;\r\n\r\npublic class Slf4jLoggerFactory implements LoggerFactory {\r\n @Override\r\n public System.Logger forName(String name) {\r\n return new Slf4jSystemLoggerAdapter(\r\n org.slf4j.LoggerFactory.getLogger(name)\r\n );\r\n }\r\n}\n"})}),"\n",(0,l.jsx)(n.p,{children:"Pass the adapter to the client builder:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .loggerFactory(new Slf4jLoggerFactory())\r\n .build();\n'})}),"\n",(0,l.jsx)(n.h2,{id:"configuring-log4j2",children:"Configuring Log4j2"}),"\n",(0,l.jsxs)(n.p,{children:["Log4j2 uses level names similar to Logback. Configure in ",(0,l.jsx)(n.code,{children:"log4j2.xml"}),":"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-xml",children:'\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n'})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"File output location:"})," Logs write to ",(0,l.jsx)(n.code,{children:"logs/ignite-client.log"}),". The rolling policy triggers on both date change and 100 MB file size, compressing archived files to gzip format."]}),"\n",(0,l.jsx)(n.h2,{id:"log-categories",children:"Log Categories"}),"\n",(0,l.jsx)(n.p,{children:"The client creates loggers using fully qualified class names. Target these categories to control verbosity for specific components:"}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Category"}),(0,l.jsx)(n.th,{children:"Content"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"org.apache.ignite.internal.client.TcpClientChannel"})}),(0,l.jsx)(n.td,{children:"Connection establishment, heartbeats, request/response cycles"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"org.apache.ignite.internal.client.ReliableChannel"})}),(0,l.jsx)(n.td,{children:"Failover decisions, retry attempts, channel selection"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"org.apache.ignite.internal.client.sql.ClientSql"})}),(0,l.jsx)(n.td,{children:"SQL query execution, partition awareness routing"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"org.apache.ignite.internal.client.table.ClientTable"})}),(0,l.jsx)(n.td,{children:"Table operations, schema version management"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"org.apache.ignite.internal.client.table.ClientDataStreamer"})}),(0,l.jsx)(n.td,{children:"Bulk data streaming, batch processing"})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"org.apache.ignite.internal.client.ClientTimeoutWorker"})}),(0,l.jsx)(n.td,{children:"Operation timeout detection and handling"})]})]})]}),"\n",(0,l.jsxs)(n.p,{children:["Use the parent category ",(0,l.jsx)(n.code,{children:"org.apache.ignite.internal.client"})," to control all client logging with a single configuration entry."]}),"\n",(0,l.jsx)(n.h2,{id:"what-each-level-logs",children:"What Each Level Logs"}),"\n",(0,l.jsx)(n.h3,{id:"trace-jul-finer",children:"TRACE (JUL: FINER)"}),"\n",(0,l.jsx)(n.p,{children:"Every outbound request with operation code and destination address. Enable only when diagnosing specific request-level issues, as this generates substantial output."}),"\n",(0,l.jsx)(n.h3,{id:"debug-jul-fine",children:"DEBUG (JUL: FINE)"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Connection established and closed events with remote addresses"}),"\n",(0,l.jsx)(n.li,{children:"Schema loading completion with table ID and version"}),"\n",(0,l.jsx)(n.li,{children:"Retry decisions showing attempt count and operation type"}),"\n",(0,l.jsx)(n.li,{children:"SQL partition awareness routing outcomes"}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"info",children:"INFO"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Partition assignment change notifications from the cluster"}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"warn-jul-warning",children:"WARN (JUL: WARNING)"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Connection close failures"}),"\n",(0,l.jsx)(n.li,{children:"Request transmission failures"}),"\n",(0,l.jsx)(n.li,{children:"Heartbeat timeouts triggering channel closure"}),"\n",(0,l.jsx)(n.li,{children:"Handshake protocol failures"}),"\n",(0,l.jsx)(n.li,{children:"Schema version not found during operations"}),"\n"]}),"\n",(0,l.jsx)(n.h3,{id:"error-jul-severe",children:"ERROR (JUL: SEVERE)"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:"Response deserialization failures"}),"\n",(0,l.jsx)(n.li,{children:"Unexpected response ID mismatches"}),"\n",(0,l.jsx)(n.li,{children:"Server notification processing failures"}),"\n",(0,l.jsx)(n.li,{children:"Transaction commit and rollback failures"}),"\n"]}),"\n",(0,l.jsx)(n.h2,{id:"production-recommendations",children:"Production Recommendations"}),"\n",(0,l.jsx)(n.p,{children:"Set the client logger to WARN in production to capture connection problems and failures without generating excessive log volume:"}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"Logback / Log4j2:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-xml",children:'\n'})}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.strong,{children:"java.util.logging:"})}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-properties",children:"org.apache.ignite.internal.client.level = WARNING\n"})}),"\n",(0,l.jsx)(n.p,{children:"Enable DEBUG temporarily when troubleshooting connection or failover issues. Enable TRACE only for short diagnostic sessions when investigating specific request failures."}),"\n",(0,l.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,l.jsx)(n.h3,{id:"no-log-output-appears",children:"No log output appears"}),"\n",(0,l.jsx)(n.p,{children:"Verify both the logger level and handler level are set. In JUL, the handler filters messages independently of the logger. A logger set to FINE with a handler set to INFO produces no FINE-level output."}),"\n",(0,l.jsx)(n.h3,{id:"bad-level-exception-at-startup",children:'"Bad level" exception at startup'}),"\n",(0,l.jsxs)(n.p,{children:["You used a System.Logger or Logback level name in a JUL configuration file. Replace ",(0,l.jsx)(n.code,{children:"DEBUG"})," with ",(0,l.jsx)(n.code,{children:"FINE"}),", ",(0,l.jsx)(n.code,{children:"TRACE"})," with ",(0,l.jsx)(n.code,{children:"FINER"}),", ",(0,l.jsx)(n.code,{children:"ERROR"})," with ",(0,l.jsx)(n.code,{children:"SEVERE"}),", and ",(0,l.jsx)(n.code,{children:"WARN"})," with ",(0,l.jsx)(n.code,{children:"WARNING"}),"."]}),"\n",(0,l.jsx)(n.h3,{id:"logs-appear-on-console-but-not-in-file",children:"Logs appear on console but not in file"}),"\n",(0,l.jsxs)(n.p,{children:["Check that the file handler is registered. In JUL, add it to the ",(0,l.jsx)(n.code,{children:"handlers"})," property. Verify the application has write permission to the target directory."]}),"\n",(0,l.jsx)(n.h3,{id:"duplicate-log-messages",children:"Duplicate log messages"}),"\n",(0,l.jsxs)(n.p,{children:["Set ",(0,l.jsx)(n.code,{children:'additivity="false"'})," on the Ignite logger in Logback/Log4j2 configuration. This prevents messages from propagating to the root logger and appearing twice."]})]})}function g(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/ddb6bda5.465f5089.js b/docs/ignite3/assets/js/ddb6bda5.465f5089.js deleted file mode 100644 index 77a464a0dc..0000000000 --- a/docs/ignite3/assets/js/ddb6bda5.465f5089.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[7511],{28453:(e,t,n)=>{n.d(t,{R:()=>h,x:()=>a});var i=n(96540);const s={},r=i.createContext(s);function h(e){const t=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:h(e.components),i.createElement(r.Provider,{value:t},e.children)}},30547:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"sql/reference/language-definition/grammar-reference","title":"Grammar Reference","description":"{/*","source":"@site/docs/sql/reference/language-definition/grammar-reference.mdx","sourceDirName":"sql/reference/language-definition","slug":"/sql/reference/language-definition/grammar-reference","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"grammar-reference","title":"Grammar Reference"},"sidebar":"tutorialSidebar","previous":{"title":"Transactions","permalink":"/docs/ignite3/3.1.0/sql/reference/language-definition/transactions"},"next":{"title":"Data Types and Functions","permalink":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/"}}');var s=n(74848),r=n(28453),h=n(63367);const a={id:"grammar-reference",title:"Grammar Reference"},l=void 0,d={},o=[{value:"assign",id:"assign",level:2},{value:"Parameters",id:"parameters",level:3},{value:"column_definition",id:"column_definition",level:2},{value:"column_definition_or_list",id:"column_definition_or_list",level:2},{value:"column_list",id:"column_list",level:2},{value:"column_name_or_list",id:"column_name_or_list",level:2},{value:"constraint",id:"constraint",level:2},{value:"group_item",id:"group_item",level:2},{value:"Parameters",id:"parameters-1",level:3},{value:"join_condition",id:"join_condition",level:2},{value:"Parameters",id:"parameters-2",level:3},{value:"order_item",id:"order_item",level:2},{value:"Parameters",id:"parameters-3",level:3},{value:"parameter",id:"parameter",level:2},{value:"project_item",id:"project_item",level:2},{value:"Parameters",id:"parameters-4",level:3},{value:"qualified_table_name",id:"qualified_table_name",level:2},{value:"query",id:"query",level:2},{value:"Parameters",id:"parameters-5",level:3},{value:"select_without_from",id:"select_without_from",level:2},{value:"sorted_column_list",id:"sorted_column_list",level:2},{value:"table_expression",id:"table_expression",level:2},{value:"Parameters",id:"parameters-6",level:3},{value:"table_primary",id:"table_primary",level:2},{value:"Parameters",id:"parameters-7",level:3},{value:"table_reference",id:"table_reference",level:2},{value:"Parameters",id:"parameters-8",level:3},{value:"with_item",id:"with_item",level:2}];function c(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n","\n",(0,s.jsxs)(t.p,{children:["This section describes grammar elements that are common to multiple SQL functions (",(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl",children:"DDL"}),", ",(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"Distribution Zones"}),", etc.)."]}),"\n",(0,s.jsx)(t.h2,{id:"assign",children:"assign"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nNonTerminal('identifier '),\nTerminal('='),\nNonTerminal('expression')\n)\n"}),"\n",(0,s.jsx)(t.h3,{id:"parameters",children:"Parameters"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"identifier"})," - the name of table, column or other element that will be updated by the operation."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"expression"})," - a valid SQL expression that returns the values that must be assigned to the ",(0,s.jsx)(t.code,{children:"identifier"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml#merge",children:"MERGE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml#update",children:"UPDATE"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"column_definition",children:"column_definition"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nSequence(\nNonTerminal('column_name'),\nNonTerminal('DATA TYPE', {href:'../data-types-and-functions/data-types'}),\nOptional(Sequence(Optional('NOT'),Terminal('NULL')))\n),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nSequence(\nOptional(Sequence(Terminal('DEFAULT'), Choice(1,NonTerminal('identifier'),\nNonTerminal('literal_value'),\nSequence(Terminal('CURRENT_TIMESTAMP'), Sequence(Terminal('+'),Terminal('INTERVAL'), NonTerminal('interval'))\n)\n),)),\nOptional(Terminal('PRIMARY KEY')),\n))\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"column_name"})," - a column name."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"DATA TYPE"})," - the ",(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/data-types-and-functions/data-types",children:"data type"})," allowed in the column."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"identifier"})," - the random identifier for the row. Can be generated by using the ",(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/data-types-and-functions/operators-and-functions#rand_uuid",children:"rand_uuid"})," function."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"literal_value"})," - a value to be assigned as default."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"CURRENT_TIMESTAMP"})," - the function that returns current time. Can only be used for ",(0,s.jsx)(t.code,{children:"TIMESTAMP WITH LOCAL TIME ZONE"})," columns."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"interval"})," - the time interval by which the timestamp will be offset. Required if ",(0,s.jsx)(t.code,{children:"CURRENT_TIMESTAMP"})," is used. The interval can be specified in:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"SECONDS"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"MINUTES"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"HOURS"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"DAYS"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"MONTHS"})}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["If the interval is ",(0,s.jsx)(t.code,{children:"0"}),", current time is used."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#create-table",children:"CREATE TABLE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl",children:"CREATE CACHE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#alter-table",children:"ALTER TABLE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#project_item",children:"project_item"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#join_condition",children:"join_condition"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"column_definition_or_list",children:"column_definition_or_list"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nChoice(0,\nSequence(\nChoice(0,\nSequence(\nChoice(0,Sequence(\nNonTerminal('column_name'),\nNonTerminal('data_type'))\n)),\nSequence(\nTerminal('('),\nOneOrMore(Sequence(\nNonTerminal('column_name'),\nNonTerminal('data_type')),\nTerminal(',')\n),Terminal(')')\n)))))\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"column_name"})," - a column name."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"data_type"})," - a valid ",(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/data-types-and-functions/data-types",children:"data type"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#alter-table",children:"ALTER TABLE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#with_item",children:"with_item"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"column_list",children:"column_list"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('('),\nOneOrMore(Sequence(\nNonTerminal('column_name')),\nTerminal(',')\n),Terminal(')')\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"column_name"})," - a column name."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml#insert",children:"INSERT"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#join_condition",children:"join_condition"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"column_name_or_list",children:"column_name_or_list"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nChoice(0,\nSequence(\nChoice(0,\nSequence(\nChoice(0,Sequence(\nNonTerminal('column_name'))\n)),\nSequence(\nTerminal('('),\nOneOrMore(Sequence(\nNonTerminal('column_name')),\nTerminal(',')\n),Terminal(')')\n)))))\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"column_name"})," - a column name."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#alter-table",children:"ALTER TABLE"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"constraint",children:"constraint"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(Sequence(\nOptional(Sequence(Terminal('CONSTRAINT'),NonTerminal('constraint_name')\n)),\nTerminal('PRIMARY KEY'),\nOptional(\nChoice(0,\nSequence(\nTerminal('USING'),\nChoice (0,\nSequence(Terminal('SORTED'), NonTerminal('sorted_column_list', {href:'#sorted_column_list'})\n),\nSequence('HASH', NonTerminal('column_list', {href:'#column_list'})))\n))\n)))\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"constraint_name"})," - a name of the constraint."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#create-table",children:"CREATE TABLE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl",children:"CREATE CACHE"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"group_item",children:"group_item"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nChoice(0,\nNonTerminal('expression'),\nSequence(\nTerminal('('), Terminal(')'),\n),\nSequence(\nTerminal('('), Sequence(OneOrMore(NonTerminal('expression'), Terminal(',')), ), Terminal(')'),\n),\n))\n"}),"\n",(0,s.jsx)(t.h3,{id:"parameters-1",children:"Parameters"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"expression"})," - a valid SQL expression that returns the values that must be assigned to the ",(0,s.jsx)(t.code,{children:"identifier"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml",children:"SELECT"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"join_condition",children:"join_condition"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nChoice(0,\nSequence(\nTerminal('ON'), NonTerminal('boolean_expression'),\n),\nSequence(Terminal('USING'), NonTerminal('column_list', {href:'#column_list'})),\n))\n"}),"\n",(0,s.jsx)(t.h3,{id:"parameters-2",children:"Parameters"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"boolean_expression"})," - an SQL expression that returns a boolean value. Only the records for which ",(0,s.jsx)(t.code,{children:"TRUE"})," was returned will be returned. If not specified, all matching records are returned."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#table_expression",children:"table_expression"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"order_item",children:"order_item"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nNonTerminal('expression'),\nOptional(Choice(0,\nTerminal('ASC'),\nTerminal('DESC')\n)),\nOptional(Choice(0,\nTerminal('NULLS FIRST'),\nTerminal('NULLS LAST')\n)),\n)\n"}),"\n",(0,s.jsx)(t.h3,{id:"parameters-3",children:"Parameters"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"expression"})," - a valid SQL expression that denotes the specific item in the SELECT clause."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#query",children:"query"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"parameter",children:"parameter"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nNonTerminal('parameter_name'),\nTerminal('='),\nNonTerminal('parameter_value'))\n"}),"\n",(0,s.jsx)(t.p,{children:"Parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"parameter_name"})," - the name of the parameter."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"parameter_value"})," - the value of the parameter."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"When a parameter is specified, you can provide it as a literal value or as an identifier. For example:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"CREATE ZONE test_zone;\r\nCREATE TABLE test_table (id INT PRIMARY KEY, val INT) WITH PRIMARY_ZONE=test_zone;\n"})}),"\n",(0,s.jsxs)(t.p,{children:["In this case, ",(0,s.jsx)(t.code,{children:"test_zone"})," is the identifier, and is used as an identifier. When used like this, the parameters are not case-sensitive."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"CREATE ZONE \"test_zone\";\r\nCREATE TABLE test_table (id INT PRIMARY KEY, val INT) WITH PRIMARY_ZONE='test_zone';\n"})}),"\n",(0,s.jsxs)(t.p,{children:["In this case, ",(0,s.jsx)(t.code,{children:"test_zone"})," is created as a literal value, and is used as a literal. When used like this, the parameter is case-sensitive."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"CREATE ZONE test_zone;\r\nCREATE TABLE test_table (id INT PRIMARY KEY, val INT) WITH PRIMARY_ZONE=`TEST_ZONE`;\n"})}),"\n",(0,s.jsxs)(t.p,{children:["In this case, ",(0,s.jsx)(t.code,{children:"test_zone"})," is created as an identifier, and is case-insensitive. As such, when ",(0,s.jsx)(t.code,{children:"TEST_ZONE"})," is used as a literal, it still matches the identifier."]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones#create-zone",children:"CREATE ZONE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones#alter-zone",children:"ALTER ZONE"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"project_item",children:"project_item"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nChoice(0,Sequence(\nNonTerminal('expression'),\nOptional('AS'),\nNonTerminal('column_definition', {href:'#column_definition'})\n),\nSequence(NonTerminal('table_alias'), Terminal('.'), Terminal('\\*')),\nTerminal('*')\n)\n)\n"}),"\n",(0,s.jsx)(t.h3,{id:"parameters-4",children:"Parameters"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"expression"})," - a valid SQL expression that denotes the specific item in the SELECT clause."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"table_alias"})," - a qualified table alias to use."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml",children:"SELECT"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#select_without_from",children:"select_without_from"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"qualified_table_name",children:"qualified_table_name"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(Sequence(\nOptional(Sequence(NonTerminal('schema'),NonTerminal('.')\n),),\nNonTerminal('table_name')\n),\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"schema"})," - a name of the table schema."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"table_name"})," - a name of the table."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#create-table",children:"CREATE TABLE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#alter-table",children:"ALTER TABLE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#drop-table",children:"DROP TABLE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#create-index",children:"CREATE INDEX"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml#delete",children:"DELETE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml#insert",children:"INSERT"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml#merge",children:"MERGE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml#update",children:"UPDATE"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#table_primary",children:"table_primary"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"query",children:"query"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nChoice(0,\nSequence(Terminal('WITH'),\nOneOrMore(\nNonTerminal('with_item', {href:'#with_item'}), Terminal(',')), NonTerminal('query', {href:'#query'})),\nSequence(\nChoice(1,\nTerminal('SELECT', {href:'../data-types-and-functions/operational-commands#select'}),\nTerminal('select_without_from', {href:'#select_without_from'}),\nSequence(NonTerminal('query', {href:'#query'}), Choice(0, Terminal('UNION'), Terminal('EXCEPT'),Terminal('MINUS'), Terminal('INTERSECT')), Optional(Choice(0, Terminal('ALL'), Terminal('DISTINCT'))),NonTerminal('query', {href:'#query'}))\n),\nOptional(Sequence(\nTerminal('ORDER BY'),\nOneOrMore(NonTerminal('order_item', {href:'#order_item'}), Terminal(',')),\n)),\nOptional(Sequence(\nTerminal('LIMIT'),\nOptional(NonTerminal('start')),\nChoice(0, NonTerminal('count'), Terminal('ALL'))\n)),\nOptional(Sequence(\nTerminal('OFFSET'),\nNonTerminal('start'),\nChoice(0, Terminal('ROW'), Terminal('ROWS'))\n)),\nOptional(Sequence(\nTerminal('FETCH'),\nChoice(0, Terminal('FIRST'), Terminal('NEXT')),\nOptional(NonTerminal('count')),\nChoice(0, Terminal('ROW'), Terminal('ROWS')),\nTerminal('ONLY'))\n)\n),\n),\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(t.h3,{id:"parameters-5",children:"Parameters"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"expression"})," - a valid SQL expression."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"start"})," - the number of result to start the query from."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"count"})," - the number of values to fetch."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml#insert",children:"INSERT"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#with_item",children:"with_item"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#table_primary",children:"table_primary"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"select_without_from",children:"select_without_from"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nTerminal('SELECT', {href:'../data-types-and-functions/operational-commands#select'}),\nOptional(\nChoice(0,\nTerminal('ALL'),\nTerminal('DISTINCT'),\n)),\nOneOrMore(Sequence(\nNonTerminal('project_item', {href:'#project_item'})),\nTerminal(',')\n),\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#query",children:"query"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"sorted_column_list",children:"sorted_column_list"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nSequence(\n'(',\nOneOrMore(\nSequence(\nNonTerminal('column_name'),\nOptional(\nChoice(0, Terminal('ASC'), Terminal('DESC')\n)),\nOptional(\nSequence(\nTerminal('NULLS'),\nChoice(0, Terminal('FIRST'), Terminal('LAST'))\n))),\n','\n),\n')'\n))\n"}),"\n",(0,s.jsx)(t.p,{children:"Keywords and parameters:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"column_name"})," - a column name."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"NULLS FIRST"})," - if specified, places any NULL values before all non-NULL in that column's ordering."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"NULLS LAST"})," - if specified, places NULLs after all non-NULLs in that column's ordering."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/ddl#create-index",children:"CREATE INDEX"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#constraint",children:"constraint"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"table_expression",children:"table_expression"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nChoice(0,\nSequence(\nChoice(0,\nSequence(\nChoice(0,Sequence(\nNonTerminal('table_expression', {href:'#table_expression'}),\nOptional('NATURAL'),\nOptional(Sequence(Choice(0,\nTerminal('LEFT'),\nTerminal('RIGHT'),\nTerminal('FULL')\n),\nOptional('OUTER')\n)),\nTerminal('JOIN'),\nNonTerminal('table_expression', {href:'#table_expression'}),\nOptional(NonTerminal('join_condition', {href:'#join_condition'}))\n),\n)),\nSequence(\nChoice(0,Sequence(\nNonTerminal('table_expression', {href:'#table_expression'}),\nTerminal('CROSS JOIN'),\nNonTerminal('table_expression', {href:'#table_expression'}))\n)),\nSequence(\nOneOrMore(Sequence(\nNonTerminal('table_reference', {href:'#table_reference'})),\nTerminal(',')\n)\n)))))\n"}),"\n",(0,s.jsx)(t.h3,{id:"parameters-6",children:"Parameters"}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/language-definition/dml",children:"SELECT"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"table_primary",children:"table_primary"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nNonTerminal('qualified_table_name', {href:'#qualified_table_name'}),\nTerminal('('),\nTerminal('TABLE'),\nNonTerminal('qualified_table_name', {href:'#qualified_table_name'}),\nTerminal(')')\n,\nEnd({type:'complex'})\n)\n"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nStart({type:'complex'}),\nChoice(0,\nSequence(\nNonTerminal('table_primary', {href:'#table_primary'}), Optional(NonTerminal('hint_comment'))),\nSequence(\nTerminal('('), NonTerminal('query', {href:'#query'}), Terminal(')')\n),\nSequence(\nTerminal('TABLE'), Terminal('('), NonTerminal('function_name'), Terminal('('), OneOrMore('expression', Terminal(',')), Terminal(')'), Terminal(')')\n))\n)\n"}),"\n",(0,s.jsx)(t.h3,{id:"parameters-7",children:"Parameters"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"hint_comment"})," - an sql ",(0,s.jsx)(t.a,{href:"/3.1.0/sql/advanced/performance-tuning#optimizer-hints",children:"optimizer hint"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"expression"})," - a valid SQL expression."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"function_name"})," - the name of the ",(0,s.jsx)(t.a,{href:"/3.1.0/sql/reference/data-types-and-functions/operators-and-functions",children:"SQL function"})," to use."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#table_reference",children:"table_reference"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"table_reference",children:"table_reference"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nNonTerminal('table_primary', {href:'#table_primary'}),\nOptional(Sequence(\nOptional('AS'), NonTerminal('alias'), Optional(Sequence(Terminal('('), OneOrMore('column_alias', Terminal(',')), Terminal(')')))\n))\n)\n"}),"\n",(0,s.jsx)(t.h3,{id:"parameters-8",children:"Parameters"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"alias"})," - the alias that will be used for the table."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"column_alias"})," - the alias used for column."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#table_expression",children:"table_expression"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"with_item",children:"with_item"}),"\n",(0,s.jsx)(h.A,{children:"\nDiagram(\nNonTerminal('item_name'),\nOptional(NonTerminal('column_list', {href:'#column_list'})),\nTerminal('AS'),\nTerminal('('),\nNonTerminal('query', {href:'#query'}),\nTerminal(')'),\n)\n"}),"\n",(0,s.jsx)(t.p,{children:"Referenced by:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"#query",children:"query"})}),"\n"]}),"\n",(0,s.jsx)(t.hr,{})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},63367:(e,t,n)=>{n.d(t,{A:()=>B});var i=n(96540);const s={},r=!1,h=8,a=10,l="railroad-diagram",d=!0,o="center",c=8.5,m=7;class u{constructor(e,t,n){this.children=n||[],this.tagName=e,this.attrs=I(t,{})}format(e,t,n){}addTo(e){if(e instanceof u)return e.children.push(this),this;var t=this.toSVG();return e.appendChild(t),t}toSVG(){var e=function(e,t,n){t=t||{},n=n||"";var i=document.createElementNS("http://www.w3.org/2000/svg",e);for(var s in t)"xlink:href"===s?i.setAttributeNS("http://www.w3.org/1999/xlink","href",t[s]):i.setAttribute(s,t[s]);return i.textContent=n,i}(this.tagName,this.attrs);return"string"==typeof this.children?e.textContent=this.children:this.children.forEach(function(t){e.appendChild(t.toSVG())}),e}toString(){var e="<"+this.tagName,t="g"==this.tagName||"svg"==this.tagName;for(var n in this.attrs)e+=" "+n+'="'+(this.attrs[n]+"").replace(/&/g,"&").replace(/"/g,""")+'"';return e+=">",t&&(e+="\n"),"string"==typeof this.children?e+=this.children.replace(/[*_\`\[\]<&]/g,function(e){return"&#"+e.charCodeAt(0)+";"}):this.children.forEach(function(t){e+=t}),e+="\n"}walk(e){e(this)}}class w extends u{constructor(e,t){super("path"),this.attrs.d="M"+e+" "+t}m(e,t){return this.attrs.d+="m"+e+" "+t,this}h(e){return this.attrs.d+="h"+e,this}right(e){return this.h(Math.max(0,e))}left(e){return this.h(-Math.max(0,e))}v(e){return this.attrs.d+="v"+e,this}down(e){return this.v(Math.max(0,e))}up(e){return this.v(-Math.max(0,e))}arc(e){var t,n=a,i=a;return"e"!=e[0]&&"w"!=e[1]||(n*=-1),"s"!=e[0]&&"n"!=e[1]||(i*=-1),t="ne"==e||"es"==e||"sw"==e||"wn"==e?1:0,this.attrs.d+="a"+a+" "+a+" 0 0 "+t+" "+n+" "+i,this}arc_8(e,t){const n=a,i=1/Math.sqrt(2)*n,s=n-i;let r="a "+n+" "+n+" 0 0 "+("cw"==t?"1":"0")+" ";const h=e+t;return r+=("ncw"==h?[i,s]:"necw"==h?[s,i]:"ecw"==h?[-s,i]:"secw"==h?[-i,s]:"scw"==h?[-i,-s]:"swcw"==h?[-s,-i]:"wcw"==h?[s,-i]:"nwcw"==h?[i,-s]:"nccw"==h?[-i,s]:"nwccw"==h?[-s,i]:"wccw"==h?[s,i]:"swccw"==h?[i,s]:"sccw"==h?[i,-s]:"seccw"==h?[s,-i]:"eccw"==h?[-s,-i]:"neccw"==h?[-i,-s]:null).join(" "),this.attrs.d+=r,this}l(e,t){return this.attrs.d+="l"+e+" "+t,this}format(){return this.attrs.d+="h.5",this}}class p extends u{constructor(e,t,n,i){super(e,n,i),this.items=t.map(P)}walk(e){e(this),this.items.forEach(t=>t.walk(e))}}class x extends p{constructor(...e){super("svg",e,{class:l}),this.items[0]instanceof M||this.items.unshift(new M),this.items[this.items.length-1]instanceof C||this.items.push(new C),this.up=this.down=this.height=this.width=0;for(const t of this.items)this.width+=t.width+(t.needsSpace?20:0),this.up=Math.max(this.up,t.up-this.height),this.height+=t.height,this.down=Math.max(this.down-t.height,t.down);this.formatted=!1}format(e,t,n,i){e=I(e,20),t=I(t,e,20),n=I(n,e,20);var s=i=I(i,t,20),r=e;r+=this.up;for(var h=new u("g",d?{transform:"translate(.5 .5)"}:{}),a=0;anew x(...e);class f extends u{constructor(...e){var t=new x(...e);return t.items[0]=new M({type:"complex"}),t.items[t.items.length-1]=new C({type:"complex"}),t}}s.ComplexDiagram=(...e)=>new f(...e);class g extends p{constructor(...e){super("g",e);this.items.length;this.needsSpace=!0,this.up=this.down=this.height=this.width=0;for(var t=0;t0&&(new w(e,t).h(10).addTo(this),e+=10),r.format(e,t,r.width).addTo(this),e+=r.width,t+=r.height,r.needsSpace&&snew g(...e);class T extends p{constructor(...e){if(super("g",e),0===e.length)throw new RangeError("Stack() must have at least one child.");this.width=Math.max.apply(null,this.items.map(function(e){return e.width+(e.needsSpace?20:0)})),this.items.length>1&&(this.width+=2*a),this.needsSpace=!0,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=0;for(var t=this.items.length-1,n=0;n0&&(this.height+=Math.max(2*a,i.up+h)),n1&&(new w(e,t).h(a).addTo(this),e+=a);for(var r=0;r1?2*a:0);l.format(e,t,d).addTo(this),e+=d,t+=l.height,r!==this.items.length-1&&(new w(e,t).arc("ne").down(Math.max(0,l.down+h-2*a)).arc("es").left(d).arc("nw").down(Math.max(0,this.items[r+1].up+h-2*a)).arc("ws").addTo(this),t+=Math.max(l.down+h,2*a)+Math.max(this.items[r+1].up+h,2*a),e=s+a)}return this.items.length>1&&(new w(e,t).h(a).addTo(this),e+=a),new w(e,t).h(i[1]).addTo(this),this}}s.Stack=(...e)=>new T(...e);class j extends p{constructor(...e){if(super("g",e),0===e.length)throw new RangeError("OptionalSequence() must have at least one child.");if(1===e.length)return new g(e);var t=a;this.needsSpace=!1,this.width=0,this.up=0,this.height=U(this.items,function(e){return e.height}),this.down=this.items[0].down;for(var n=0,i=0;i0&&(this.down=Math.max(this.height+this.down,n+Math.max(2*t,s.down+h))-this.height);var l=(s.needsSpace?10:0)+s.width;this.width+=0===i?t+Math.max(l,t):2*t+Math.max(l,t)+t}r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="optseq")}format(e,t,n){var i=a,s=D(n,this.width);new w(e,t).right(s[0]).addTo(this),new w(e+s[0]+this.width,t+this.height).right(s[1]).addTo(this),e+=s[0];for(var r=t-this.up,l=this.items.length-1,d=0;dnew j(...e);class _ extends p{constructor(...e){if(super("g",e),1===e.length)return new g(e);if(2!==e.length)throw new RangeError("AlternatingSequence() must have one or two children.");this.needsSpace=!1;const t=a,n=h,i=Math.max,s=this.items[0],l=this.items[1],d=1/Math.sqrt(2)*t*2,o=(1-1/Math.sqrt(2))*t*2,c=Math.max(t,h),m=c-o+d,u=i(t+t,c/2+t+t,c/2+n+s.down);this.up=u+s.height+s.up;const w=i(t+t,c/2+t+t,c/2+n+l.up);this.down=w+l.height+l.down,this.height=0;const p=2*(s.needsSpace?10:0)+s.width,x=2*(l.needsSpace?10:0)+l.width;this.width=2*t+i(p,m,x)+2*t,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="altseq")}format(e,t,n){const i=a,s=D(n,this.width);new w(e,t).right(s[0]).addTo(this),e+=s[0],new w(e+this.width,t).right(s[1]).addTo(this);const r=this.items[0],l=this.items[1],d=this.up-r.up,o=this.up-r.up-r.height;new w(e,t).arc("se").up(d-2*i).arc("wn").addTo(this),r.format(e+2*i,t-d,this.width-4*i).addTo(this),new w(e+this.width-2*i,t-o).arc("ne").down(o-2*i).arc("ws").addTo(this);const c=this.down-l.down-l.height,m=this.down-l.down;new w(e,t).arc("ne").down(c-2*i).arc("ws").addTo(this),l.format(e+2*i,t+c,this.width-4*i).addTo(this),new w(e+this.width-2*i,t+m).arc("se").up(m-2*i).arc("wn").addTo(this);const u=1/Math.sqrt(2)*i*2,p=(1-1/Math.sqrt(2))*i*2,x=Math.max(i,h),f=x-p+u,g=(this.width-4*i-f)/2;return new w(e+i,t-x/2-i).arc("ws").right(g).arc_8("n","cw").l(f-u,x-p).arc_8("sw","ccw").right(g).arc("ne").addTo(this),new w(e+i,t+x/2+i).arc("wn").right(g).arc_8("s","ccw").l(f-u,-(x-p)).arc_8("nw","cw").right(g).arc("se").addTo(this),this}}s.AlternatingSequence=(...e)=>new _(...e);class v extends p{constructor(e,...t){if(super("g",t),"number"!=typeof e||e!==Math.floor(e))throw new TypeError("The first argument of Choice() must be an integer.");if(e<0||e>=t.length)throw new RangeError("The first argument of Choice() must be an index for one of the items.");this.normal=e;var n,i=t.length-1;this.width=Math.max.apply(null,this.items.map(function(e){return e.width}))+4*a,this.height=this.items[e].height,this.up=this.items[0].up;for(var s=0;s=0;d--){let n=this.items[d];d==this.normal-1&&(s=Math.max(2*a,this.items[this.normal].up+h+n.down+n.height)),new w(e,t).arc("se").up(s-2*a).arc("wn").addTo(this),n.format(e+2*a,t-s,l).addTo(this),new w(e+2*a+l,t-s+n.height).arc("ne").down(s-n.height+this.height-2*a).arc("ws").addTo(this),s+=Math.max(a,n.up+h+(0===d?0:this.items[d-1].down+this.items[d-1].height))}for(new w(e,t).right(2*a).addTo(this),this.items[this.normal].format(e+2*a,t,l).addTo(this),new w(e+2*a+l,t+this.height).right(2*a).addTo(this),d=this.normal+1;d<=r;d++){let n=this.items[d];d==this.normal+1&&(s=Math.max(2*a,this.height+this.items[this.normal].down+h+n.up)),new w(e,t).arc("ne").down(s-2*a).arc("ws").addTo(this),n.format(e+2*a,t+s,l).addTo(this),new w(e+2*a+l,t+s+n.height).arc("se").up(s-2*a+n.height-this.height).arc("wn").addTo(this),s+=Math.max(a,n.height+n.down+h+(d==r?0:this.items[d+1].up))}return this}}s.Choice=(...e)=>new v(...e);class S extends p{constructor(...e){if(super("g",e),0===e.length)throw new RangeError("HorizontalChoice() must have at least one child.");if(1===e.length)return new g(e);const t=this.items.slice(0,-1),n=this.items.slice(1,-1),i=this.items[0],s=this.items[this.items.length-1];this.needsSpace=!1,this.width=a,this.width+=2*a*(this.items.length-1),this.width+=U(this.items,e=>e.width+(e.needsSpace?20:0)),this.width+=s.height>0?a:0,this.width+=a,this.height=0,this._upperTrack=Math.max(2*a,h,z(t,e=>e.up)+h),this.up=Math.max(this._upperTrack,s.up),this._lowerTrack=Math.max(h,z(n,e=>e.height+Math.max(e.down+h,2*a)),s.height+s.down+h),i.heighte.width+(e.needsSpace?20:0))+(this.items.length-2)*a*2-a;new w(e,t).arc("se").v(-(this._upperTrack-2*a)).arc("wn").h(l).addTo(this);var d=U(h,e=>e.width+(e.needsSpace?20:0))+(this.items.length-2)*a*2+(r.height>0?a:0)-a,o=e+a+s.width+(s.needsSpace?20:0)+2*a;new w(o,t+this._lowerTrack).h(d).arc("se").v(-(this._lowerTrack-2*a)).arc("wn").addTo(this);for(const[m,u]of function*(e){var t=0;for(const n of e)yield[t,n],t++}(this.items)){0===m?(new w(e,t).h(a).addTo(this),e+=a):(new w(e,t-this._upperTrack).arc("ne").v(this._upperTrack-2*a).arc("ws").addTo(this),e+=2*a);var c=u.width+(u.needsSpace?20:0);u.format(e,t,c).addTo(this),e+=c,m===this.items.length-1?0===u.height?new w(e,t).h(a).addTo(this):new w(e,t+u.height).arc("se").addTo(this):0===m&&u.height>this._lowerTrack?u.height-this._lowerTrack>=2*a?new w(e,t+u.height).arc("se").v(this._lowerTrack-u.height+2*a).arc("wn").addTo(this):new w(e,t+u.height).l(2*a,this._lowerTrack-u.height).addTo(this):new w(e,t+u.height).arc("ne").v(this._lowerTrack-u.height-2*a).arc("ws").addTo(this)}return this}}s.HorizontalChoice=(...e)=>new S(...e);class b extends p{constructor(e,t,...n){if(super("g",n),"number"!=typeof e||e!==Math.floor(e))throw new TypeError("The first argument of MultipleChoice() must be an integer.");if(e<0||e>=n.length)throw new RangeError("The first argument of MultipleChoice() must be an index for one of the items.");if(this.normal=e,"any"!=t&&"all"!=t)throw new SyntaxError("The second argument of MultipleChoice must be 'any' or 'all'.");this.type=t,this.needsSpace=!0,this.innerWidth=z(this.items,function(e){return e.width}),this.width=30+a+this.innerWidth+a+20,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=this.items[e].height;for(var i=0;ie&&(this.down+=Math.max(t,n.up+h+this.items[i-1].down+this.items[i-1].height))}this.down-=this.items[e].height,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="multiplechoice")}format(e,t,n){var i=D(n,this.width);new w(e,t).right(i[0]).addTo(this),new w(e+i[0]+this.width,t+this.height).right(i[1]).addTo(this),e+=i[0];for(var s,r=this.items[this.normal],l=this.normal-1;l>=0;l--){var d=this.items[l];l==this.normal-1&&(s=Math.max(10+a,r.up+h+d.down+d.height)),new w(e+30,t).up(s-a).arc("wn").addTo(this),d.format(e+30+a,t-s,this.innerWidth).addTo(this),new w(e+30+a+this.innerWidth,t-s+d.height).arc("ne").down(s-d.height+this.height-a-10).addTo(this),0!==l&&(s+=Math.max(a,d.up+h+this.items[l-1].down+this.items[l-1].height))}for(new w(e+30,t).right(a).addTo(this),r.format(e+30+a,t,this.innerWidth).addTo(this),new w(e+30+a+this.innerWidth,t+this.height).right(a).addTo(this),l=this.normal+1;lnew b(...e);class y extends u{constructor(e,t){if(void 0===t)return new v(1,new L,e);if("skip"===t)return new v(0,new L,e);throw"Unknown value for Optional()'s 'skip' argument."}}s.Optional=(...e)=>new y(...e);class E extends u{constructor(e,t){super("g"),t=t||new L,this.item=P(e),this.rep=P(t),this.width=Math.max(this.item.width,this.rep.width)+2*a,this.height=this.item.height,this.up=this.item.up,this.down=Math.max(2*a,this.item.down+h+this.rep.up+this.rep.height+this.rep.down),this.needsSpace=!0,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="oneormore")}format(e,t,n){var i=D(n,this.width);new w(e,t).h(i[0]).addTo(this),new w(e+i[0]+this.width,t+this.height).h(i[1]).addTo(this),e+=i[0],new w(e,t).right(a).addTo(this),this.item.format(e+a,t,this.width-2*a).addTo(this),new w(e+this.width-a,t+this.height).right(a).addTo(this);var s=Math.max(2*a,this.item.height+this.item.down+h+this.rep.up);return new w(e+a,t).arc("nw").down(s-2*a).arc("ws").addTo(this),this.rep.format(e+a,t+s,this.width-2*a).addTo(this),new w(e+this.width-a,t+s+this.rep.height).arc("se").up(s-2*a+this.rep.height-this.item.height).arc("en").addTo(this),this}walk(e){e(this),this.item.walk(e),this.rep.walk(e)}}s.OneOrMore=(...e)=>new E(...e);class q extends u{constructor(e,t,n){return new y(new E(e,t),n)}}s.ZeroOrMore=(...e)=>new q(...e);class N extends u{constructor(e,t){super("g"),this.item=P(e),this.label=t instanceof u?t:t?new O(t):void 0,this.width=Math.max(this.item.width+(this.item.needsSpace?20:0),this.label?this.label.width:0,2*a),this.height=this.item.height,this.boxUp=this.up=Math.max(this.item.up+h,a),this.label&&(this.up+=this.label.up+this.label.height+this.label.down),this.down=Math.max(this.item.down+h,a),this.needsSpace=!0,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="group")}format(e,t,n){var i=D(n,this.width);return new w(e,t).h(i[0]).addTo(this),new w(e+i[0]+this.width,t+this.height).h(i[1]).addTo(this),e+=i[0],new u("rect",{x:e,y:t-this.boxUp,width:this.width,height:this.boxUp+this.height+this.down,rx:a,ry:a,class:"group-box"}).addTo(this),this.item.format(e,t,this.width).addTo(this),this.label&&this.label.format(e,t-(this.boxUp+this.label.down+this.label.height),this.label.width).addTo(this),this}walk(e){e(this),this.item.walk(e),this.label.walk(e)}}s.Group=(...e)=>new N(...e);class M extends u{constructor({type:e="simple",label:t}={}){super("g"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=e,t&&(this.label=""+t,this.width=Math.max(20,this.label.length*c+10)),r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="start")}format(e,t){let n=new w(e,t-10);return"complex"===this.type?n.down(20).m(0,-10).right(this.width).addTo(this):n.down(20).m(10,-20).down(20).m(-10,-10).right(this.width).addTo(this),this.label&&new u("text",{x:e,y:t-15,style:"text-anchor:start"},this.label).addTo(this),this}}s.Start=(...e)=>new M(...e);class C extends u{constructor({type:e="simple"}={}){super("path"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=e,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="end")}format(e,t){return"complex"===this.type?this.attrs.d="M "+e+" "+t+" h 20 m 0 -10 v 20":this.attrs.d="M "+e+" "+t+" h 20 m -10 -10 v 20 m 10 -20 v 20",this}}s.End=(...e)=>new C(...e);class A extends u{constructor(e,{href:t,title:n,cls:i}={}){super("g",{class:["terminal",i].join(" ")}),this.text=""+e,this.href=t,this.title=n,this.cls=i,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="terminal")}format(e,t,n){var i=D(n,this.width);new w(e,t).h(i[0]).addTo(this),new w(e+i[0]+this.width,t).h(i[1]).addTo(this),e+=i[0],new u("rect",{x:e,y:t-11,width:this.width,height:this.up+this.down,rx:10,ry:10}).addTo(this);var s=new u("text",{x:e+this.width/2,y:t+4},this.text);return this.href?new u("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new u("title",{},[this.title]).addTo(this),this}}s.Terminal=(...e)=>new A(...e);class R extends u{constructor(e,{href:t,title:n,cls:i=""}={}){super("g",{class:["non-terminal",i].join(" ")}),this.text=""+e,this.href=t,this.title=n,this.cls=i,this.width=this.text.length*c+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="nonterminal")}format(e,t,n){var i=D(n,this.width);new w(e,t).h(i[0]).addTo(this),new w(e+i[0]+this.width,t).h(i[1]).addTo(this),e+=i[0],new u("rect",{x:e,y:t-11,width:this.width,height:this.up+this.down}).addTo(this);var s=new u("text",{x:e+this.width/2,y:t+4},this.text);return this.href?new u("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new u("title",{},[this.title]).addTo(this),this}}s.NonTerminal=(...e)=>new R(...e);class O extends u{constructor(e,{href:t,title:n,cls:i=""}={}){super("g",{class:["comment",i].join(" ")}),this.text=""+e,this.href=t,this.title=n,this.cls=i,this.width=this.text.length*m+10,this.height=0,this.up=8,this.down=8,this.needsSpace=!0,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="comment")}format(e,t,n){var i=D(n,this.width);new w(e,t).h(i[0]).addTo(this),new w(e+i[0]+this.width,t+this.height).h(i[1]).addTo(this),e+=i[0];var s=new u("text",{x:e+this.width/2,y:t+5,class:"comment"},this.text);return this.href?new u("a",{"xlink:href":this.href},[s]).addTo(this):s.addTo(this),this.title&&new u("title",{},this.title).addTo(this),this}}s.Comment=(...e)=>new O(...e);class L extends u{constructor(){super("g"),this.width=0,this.height=0,this.up=0,this.down=0,this.needsSpace=!1,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="skip")}format(e,t,n){return new w(e,t).right(n).addTo(this),this}}s.Skip=(...e)=>new L(...e);class k extends u{constructor({width:e=50,up:t=15,height:n=25,down:i=15,needsSpace:s=!0}={}){super("g"),this.width=e,this.height=n,this.up=t,this.down=i,this.needsSpace=!0,r&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="block")}format(e,t,n){var i=D(n,this.width);return new w(e,t).h(i[0]).addTo(this),new w(e+i[0]+this.width,t).h(i[1]).addTo(this),e+=i[0],new u("rect",{x:e,y:t-this.up,width:this.width,height:this.up+this.height+this.down}).addTo(this),this}}function I(...e){return e.reduce(function(e,t){return void 0!==e?e:t})}function D(e,t){var n=e-t;switch(o){case"left":return[0,n];case"right":return[n,0];default:return[n/2,n/2]}}function P(e){return e instanceof u?e:new A(""+e)}function U(e,t){return t||(t=function(e){return e}),e.map(t).reduce(function(e,t){return e+t},0)}function z(e,t){return t||(t=function(e){return e}),Math.max.apply(null,e.map(t))}s.Block=(...e)=>new k(...e);var W=n(74848);function B({children:e}){const t=(0,i.useRef)(null),n=(0,i.useRef)(null),[s,r]=(0,i.useState)(!1),h=t=>{if(t.current)try{const i=(...e)=>new x(...e),s=(...e)=>new A(...e),r=(...e)=>new R(...e),h=(...e)=>new y(...e),a=(...e)=>new g(...e),l=(...e)=>new v(...e),d=(...e)=>new L(...e),o=(...e)=>new O(...e),c=(...e)=>new E(...e),m=(...e)=>new q(...e),u=e.replace(/ComplexDiagram\(/g,"Diagram(").replace(/Start\([^)]*\),?\s*/g,"").replace(/,?\s*End\([^)]*\)/g,"").trim();try{const e=new Function("Diagram","Terminal","NonTerminal","Optional","Sequence","Choice","Skip","Comment","OneOrMore","ZeroOrMore",`'use strict'; return ${u};`)(i,s,r,h,a,l,d,o,c,m);if(!e||"function"!=typeof e.toSVG)throw new Error("Diagram function did not return a valid diagram object");t.current.innerHTML="";const n=e.toSVG();n.querySelectorAll("a[*|href]").forEach(e=>{const t=e.getAttributeNS("http://www.w3.org/1999/xlink","href");t&&e.setAttribute("href",t)}),t.current.appendChild(n)}catch(n){throw console.error("Error in diagram generation:",n),n}}catch(i){console.error("Error rendering railroad diagram:",i),t.current.innerHTML='

                                                              Error rendering diagram. Check console for details.

                                                              '}};(0,i.useEffect)(()=>{h(t)},[e]),(0,i.useEffect)(()=>{if(s){h(n);const e=e=>{"Escape"===e.key&&r(!1)};return document.addEventListener("keydown",e),document.body.style.overflow="hidden",()=>{document.removeEventListener("keydown",e),document.body.style.overflow=""}}},[s,e]);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)("div",{className:"railroad-diagram-wrapper",children:[(0,W.jsx)("button",{className:"railroad-expand-button",onClick:()=>r(!0),"aria-label":"Expand diagram",title:"View full size",children:(0,W.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:(0,W.jsx)("path",{d:"M1.5 1a.5.5 0 0 0-.5.5v4a.5.5 0 0 1-1 0v-4A1.5 1.5 0 0 1 1.5 0h4a.5.5 0 0 1 0 1h-4zM10 .5a.5.5 0 0 1 .5-.5h4A1.5 1.5 0 0 1 16 1.5v4a.5.5 0 0 1-1 0v-4a.5.5 0 0 0-.5-.5h-4a.5.5 0 0 1-.5-.5zM.5 10a.5.5 0 0 1 .5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 1 0 1h-4A1.5 1.5 0 0 1 0 14.5v-4a.5.5 0 0 1 .5-.5zm15 0a.5.5 0 0 1 .5.5v4a1.5 1.5 0 0 1-1.5 1.5h-4a.5.5 0 0 1 0-1h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 1 .5-.5z"})})}),(0,W.jsx)("div",{ref:t,className:"railroad-diagram-container"})]}),s&&(0,W.jsx)("div",{className:"railroad-modal-overlay",onClick:e=>{e.target===e.currentTarget&&r(!1)},children:(0,W.jsxs)("div",{className:"railroad-modal-content",children:[(0,W.jsx)("button",{className:"railroad-modal-close",onClick:()=>r(!1),"aria-label":"Close",title:"Close (ESC)",children:"\xd7"}),(0,W.jsx)("div",{ref:n,className:"railroad-diagram-container railroad-diagram-modal"})]})})]})}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/df80b230.c282501d.js b/docs/ignite3/assets/js/df80b230.c282501d.js deleted file mode 100644 index ebfcff5425..0000000000 --- a/docs/ignite3/assets/js/df80b230.c282501d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1188],{22674:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"developers-guide/sql/jdbc-driver","title":"JDBC Driver","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/sql/jdbc-driver.md","sourceDirName":"developers-guide/sql","slug":"/developers-guide/sql/jdbc-driver","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"JDBC Driver","sidebar_label":"JDBC Driver"},"sidebar":"tutorialSidebar","previous":{"title":"Java SQL API","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/sql-api"},"next":{"title":"System Views","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/system-views"}}');var r=i(74848),s=i(28453);const o={title:"JDBC Driver",sidebar_label:"JDBC Driver"},c=void 0,a={},d=[{value:"Setting Up",id:"setting-up",level:2},{value:"Parameter Precedence",id:"parameter-precedence",level:3},{value:"Performing Transactions",id:"performing-transactions",level:2}];function l(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsxs)(n.p,{children:["Ignite is shipped with JDBC driver that allows processing of distributed data using standard SQL statements like ",(0,r.jsx)(n.code,{children:"SELECT"}),", ",(0,r.jsx)(n.code,{children:"INSERT"}),", ",(0,r.jsx)(n.code,{children:"UPDATE"}),", or ",(0,r.jsx)(n.code,{children:"DELETE"})," directly from the JDBC side. The name of the driver's class is ",(0,r.jsx)(n.code,{children:"org.apache.ignite.jdbc.IgniteJdbcDriver"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"This implementation of JDBC driver does not support the following functionality:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"SSL/TLS connection;"}),"\n",(0,r.jsx)(n.li,{children:"Multiple Endpoints;"}),"\n",(0,r.jsx)(n.li,{children:"Multi-statement requests;"}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"CREATE TABLE"}),", ",(0,r.jsx)(n.code,{children:"ALTER TABLE"}),", ",(0,r.jsx)(n.code,{children:"WITH"}),", and ",(0,r.jsx)(n.code,{children:"MERGE"})," commands."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"setting-up",children:"Setting Up"}),"\n",(0,r.jsxs)(n.p,{children:["JDBC driver uses the client connector to work with the cluster. For more information on configuring client connector, see ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/clients/#client-connector-configuration",children:"Client Connector Configuration"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"The JDBC connector needs to be included from Maven:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:"\r\n org.apache.ignite\r\n ignite-jdbc\r\n 3.0.0\r\n\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Here is how you can open a JDBC connection to the cluster node listening on IP address ",(0,r.jsx)(n.code,{children:"127.0.0.1"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800");\n'})}),"\n",(0,r.jsx)(n.p,{children:"The driver connects to one of the cluster nodes and forwards all the queries to it for final execution. The node handles the query distribution and the result's aggregations. Then the result is sent back to the client application."}),"\n",(0,r.jsx)(n.p,{children:"The JDBC connection string can have an optional list of name-value pairs as parameters after the '?' delimiter. Name and value are separated by the '=' symbol and multiple properties are separated either by an '&' or a ';'.\r\nSeparator signs cannot be mixed and should be either semicolon or ampersand."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"jdbc:ignite:thin://host[:port][,host[:port][/schema][[?parameter1=value1][¶meter2=value2],...]]\r\njdbc:ignite:thin://host[:port][,host[:port][/schema][[?parameter1=value1][;parameter2=value2],...]]\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"host"})," is required and defines the host of the cluster node to connect to."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"port"})," is the port to use to open the connection. 10800 is used by default if this parameter is omitted."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"schema"})," is the schema name to access. PUBLIC is used by default. This name should correspond to the SQL ANSI-99 standard. Non-quoted identifiers are not case sensitive. Quoted identifiers are case sensitive. When semicolon format is used, the schema may be defined as a parameter with name schema."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"parameters"})," are optional parameters. The following parameters are available:\r\n** ",(0,r.jsx)(n.code,{children:"connectionTimeZone"})," - Client connection time-zone ID. This property can be used by the client to change the time zone of the session on the server. Affects the interpretation of dates in queries that do not specify the time zone explicitly. If not set, system default on client timezone will be used.\r\n** ",(0,r.jsx)(n.code,{children:"queryTimeout"})," - Number of seconds the driver will wait for a ",(0,r.jsx)(n.code,{children:"Statement"})," object to execute. 0 means there is no limit. Default value: ",(0,r.jsx)(n.code,{children:"0"}),".\r\n** ",(0,r.jsx)(n.code,{children:"connectionTimeout"})," - Number of milliseconds JDBC client will wait for server to respond. 0 means there is no limit. Default value: ",(0,r.jsx)(n.code,{children:"0"}),".\r\n** ",(0,r.jsx)(n.code,{children:"reconnectThrottlingPeriod"})," - Reconnect throttling period, in milliseconds. 0 means there is no limit. Default value: ",(0,r.jsx)(n.code,{children:"30_000"}),".\r\n** ",(0,r.jsx)(n.code,{children:"reconnectThrottlingRetries"})," - Reconnect throttling retries. 0 means there is no limit. Default value: ",(0,r.jsx)(n.code,{children:"3"}),".\r\n** ",(0,r.jsx)(n.code,{children:"username"})," - username for basic authentication to the cluster.\r\n** ",(0,r.jsx)(n.code,{children:"password"})," - user password for basic authentication to the cluster.\r\n** ",(0,r.jsx)(n.code,{children:"sslEnabled"})," - Determines if SSL is enabled. Possible values: ",(0,r.jsx)(n.code,{children:"true"}),", ",(0,r.jsx)(n.code,{children:"false"}),". Default value: ",(0,r.jsx)(n.code,{children:"false"}),"\r\n*** ",(0,r.jsx)(n.code,{children:"trustStorePath"})," - Path to trust store on client side.\r\n*** ",(0,r.jsx)(n.code,{children:"trustStorePassword"})," - Trust store password.\r\n*** ",(0,r.jsx)(n.code,{children:"keyStorePath"})," - Path to key store on client side.\r\n*** ",(0,r.jsx)(n.code,{children:"keyStorePassword"})," - Key store password.\r\n*** ",(0,r.jsx)(n.code,{children:"clientAuth"})," - SSL client authentication. Possible values: ",(0,r.jsx)(n.code,{children:"NONE"}),", ",(0,r.jsx)(n.code,{children:"OPTIONAL"}),", ",(0,r.jsx)(n.code,{children:"REQUIRE"}),".\r\n*** ",(0,r.jsx)(n.code,{children:"ciphers"})," - comma-separated SSL ciphers list."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"parameter-precedence",children:"Parameter Precedence"}),"\n",(0,r.jsx)(n.p,{children:"If the same parameters are passed by using different means, the JDBC driver prioritizes them in the following way:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["API arguments passed in the ",(0,r.jsx)(n.code,{children:"Connection"})," objects;"]}),"\n",(0,r.jsx)(n.li,{children:"Last instance of the parameter in the connection string;"}),"\n",(0,r.jsx)(n.li,{children:"Properties object passed during connection."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"performing-transactions",children:"Performing Transactions"}),"\n",(0,r.jsxs)(n.p,{children:["With the JDBC driver, you can perform ",(0,r.jsx)(n.code,{children:"commit"})," and ",(0,r.jsx)(n.code,{children:"rollback"})," transactions. For more information about transactions, see ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/transactions",children:"Performing Transactions"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Here is how you can commit a transaction:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'// Open the JDBC connection.\r\nConnection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1:10800");\r\n\r\n// Commit a transaction\r\nconn.commit();\n'})}),"\n",(0,r.jsxs)(n.p,{children:["You can also configure Ignite to automatically commit transactions by using the ",(0,r.jsx)(n.code,{children:"setAutoCommit()"})," method."]}),"\n",(0,r.jsx)(n.p,{children:"Here is how you can rollback a transaction:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"conn.rollback();\n"})})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>c});var t=i(96540);const r={},s=t.createContext(r);function o(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/e0d8b5f8.c4d1b12f.js b/docs/ignite3/assets/js/e0d8b5f8.c4d1b12f.js deleted file mode 100644 index 8f0db1a054..0000000000 --- a/docs/ignite3/assets/js/e0d8b5f8.c4d1b12f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2209],{2896:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"developers-guide/clients/java","title":"Java Client","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/clients/java.md","sourceDirName":"developers-guide/clients","slug":"/developers-guide/clients/java","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/java","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Java Client","sidebar_label":"Java"},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/"},"next":{"title":".NET","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/dotnet"}}');var r=t(74848),s=t(28453);const l={title:"Java Client",sidebar_label:"Java"},d=void 0,c={},a=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Installation",id:"installation",level:3},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Authentication",id:"authentication",level:2},{value:"Logging",id:"logging",level:2},{value:"Client Metrics",id:"client-metrics",level:2},{value:"Java",id:"java",level:3},{value:"Available Java Metrics",id:"available-java-metrics",level:4},{value:"Client Connection Configuration",id:"client-connection-configuration",level:2}];function o(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(n.p,{children:"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there are no separate Thin and Thick clients in Ignite 3. All clients are 'thin'."}),"\n",(0,r.jsx)(n.p,{children:"Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations."}),"\n",(0,r.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,r.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"To use Java thin client, Java 11 or newer is required."}),"\n",(0,r.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.p,{children:"Java client can be added to your project by using maven:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:"\r\n org.apache.ignite\r\n ignite-client\r\n 3.0.0\r\n\n"})}),"\n",(0,r.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["To initialize a client, use the ",(0,r.jsx)(n.code,{children:"IgniteClient"})," class, and provide it with the configuration:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n) {\r\n // Your code goes here\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsxs)(n.p,{children:["To pass ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/security/authentication",children:"authentication"})," information, use the ",(0,r.jsx)(n.code,{children:"IgniteClientAuthenticator"})," class and pass it to ",(0,r.jsx)(n.code,{children:"IgniteClient"})," builder:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClientAuthenticator auth = BasicAuthenticator.builder().username("myUser").password("myPassword").build();\r\nIgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .authenticator(auth)\r\n .build();\n'})}),"\n",(0,r.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsxs)(n.p,{children:["To configure client logging, add ",(0,r.jsx)(n.code,{children:"loggerFactory"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1")\r\n .loggerFactory(System::getLogger)\r\n .build();\n'})}),"\n",(0,r.jsx)(n.p,{children:"The client logs connection errors, reconnects, and retries."}),"\n",(0,r.jsx)(n.h2,{id:"client-metrics",children:"Client Metrics"}),"\n",(0,r.jsx)(n.h3,{id:"java",children:"Java"}),"\n",(0,r.jsx)(n.p,{children:"When running Java client, you need to enable metrics in the client builder:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .metricsEnabled(true)\r\n .build();\n'})}),"\n",(0,r.jsxs)(n.p,{children:["After that, client metrics will be available to any Java monitoring tool, for example ",(0,r.jsx)(n.a,{href:"https://www.oracle.com/java/technologies/jdk-mission-control.html",children:"JDK Mission Control"}),"."]}),"\n",(0,r.jsx)(n.h4,{id:"available-java-metrics",children:"Available Java Metrics"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Metric name"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ConnectionsActive"}),(0,r.jsx)(n.td,{children:"The number of currently active connections."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ConnectionsEstablished"}),(0,r.jsx)(n.td,{children:"The number of established connections."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ConnectionsLost"}),(0,r.jsx)(n.td,{children:"The number of connections lost."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ConnectionsLostTimeout"}),(0,r.jsx)(n.td,{children:"The number of connections lost due to a timeout."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"HandshakesFailed"}),(0,r.jsx)(n.td,{children:"The number of failed handshakes."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"HandshakesFailedTimeout"}),(0,r.jsx)(n.td,{children:"The number of handshakes that failed due to a timeout."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsActive"}),(0,r.jsx)(n.td,{children:"The number of currently active requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsSent"}),(0,r.jsx)(n.td,{children:"The number of requests sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsCompleted"}),(0,r.jsx)(n.td,{children:"The number of completed requests. Requests are completed once a response is received."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsRetried"}),(0,r.jsx)(n.td,{children:"The number of request retries."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsFailed"}),(0,r.jsx)(n.td,{children:"The number of failed requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"BytesSent"}),(0,r.jsx)(n.td,{children:"The amount of bytes sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"BytesReceived"}),(0,r.jsx)(n.td,{children:"The amount of bytes received."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"StreamerBatchesSent"}),(0,r.jsx)(n.td,{children:"The number of data streamer batches sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"StreamerItemsSent"}),(0,r.jsx)(n.td,{children:"The number of data streamer items sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"StreamerBatchesActive"}),(0,r.jsx)(n.td,{children:"The number of in-flight data streamer batches."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"StreamerItemsQueued"}),(0,r.jsx)(n.td,{children:"The number of queued data streamer items."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"client-connection-configuration",children:"Client Connection Configuration"}),"\n",(0,r.jsx)(n.p,{children:"There is a number of configuration properties managing the connection between the client and Ignite cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .connectTimeout(5000)\r\n .heartbeatInterval(30000)\r\n .heartbeatTimeout(5000)\r\n .operationTimeout(3000)\r\n .backgroundReconnectInterval(30000)\r\n .retryPolicy(new RetryLimitPolicy().retryLimit(8))\r\n .build();\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Configuration name"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connectTimeout"}),(0,r.jsx)(n.td,{children:"Client connection timeout, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"heartbeatInterval"}),(0,r.jsx)(n.td,{children:"Heartbeat message interval, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"heartbeatTimeout"}),(0,r.jsx)(n.td,{children:"Heartbeat message timeout, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"operationTimeout"}),(0,r.jsx)(n.td,{children:"Operation timeout, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"backgroundReconnectInterval"}),(0,r.jsx)(n.td,{children:"Background reconnect interval, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"retryPolicy"}),(0,r.jsx)(n.td,{children:"Retry policy. By default, all read operations are retried up to 16 times, and write operations are not retried."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>d});var i=t(96540);const r={},s=i.createContext(r);function l(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/e288cdcf.b9f473c3.js b/docs/ignite3/assets/js/e288cdcf.b9f473c3.js deleted file mode 100644 index f38593eda4..0000000000 --- a/docs/ignite3/assets/js/e288cdcf.b9f473c3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5024],{10976:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"sql-reference/transactions","title":"Transactions","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-reference/transactions.md","sourceDirName":"sql-reference","slug":"/sql-reference/transactions","permalink":"/docs/ignite3/3.0.0/sql-reference/transactions","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Transactions","sidebar_label":"Transactions"},"sidebar":"tutorialSidebar","previous":{"title":"DML","permalink":"/docs/ignite3/3.0.0/sql-reference/dml"},"next":{"title":"Distribution Zones","permalink":"/docs/ignite3/3.0.0/sql-reference/distribution-zones"}}');var i=t(74848),r=t(28453);const a={title:"Transactions",sidebar_label:"Transactions"},o=void 0,l={},c=[{value:"Example",id:"example",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsxs)(n.p,{children:["A transaction is a sequence of SQL operations that starts with the ",(0,i.jsx)(n.code,{children:"START TRANSACTION"})," statement and ends with the ",(0,i.jsx)(n.code,{children:"COMMIT"})," statement. Either the effect of all operations will be published, or no results will be published at all."]}),"\n",(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["Transaction control statements are only allowed within a ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/sql/sql-api#sql-scripts",children:"script"}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["In Apache Ignite 3, you start the transaction by using the ",(0,i.jsx)(n.code,{children:"START TRANSACTION"})," statement:"]}),"\n","\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"DDL statements are not supported inside transactions."})}),"\n",(0,i.jsx)(n.p,{children:"Parameters:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"READ WRITE"})," - both read and write operations are allowed in the transaction. Used by default."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"READ ONLY"})," - only read operations are allowed in the transaction."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["You close and commit the transaction by using the ",(0,i.jsx)(n.code,{children:"COMMIT"})," statement:"]}),"\n","\n",(0,i.jsx)(n.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(n.p,{children:"The example below inserts 3 lines into the table in a single transaction, ensuring they will all be committed together:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"START TRANSACTION READ WRITE;\r\n\r\nINSERT INTO Person (id, name, surname) VALUES (1, 'John', 'Smith');\r\nINSERT INTO Person (id, name, surname) VALUES (2, 'Jane', 'Smith');\r\nINSERT INTO Person (id, name, surname) VALUES (3, 'Adam', 'Mason');\r\n\r\nCOMMIT;\n"})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var s=t(96540);const i={},r=s.createContext(i);function a(e){const n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/e30f13ec.aaebf2c7.js b/docs/ignite3/assets/js/e30f13ec.aaebf2c7.js deleted file mode 100644 index d8ec38c718..0000000000 --- a/docs/ignite3/assets/js/e30f13ec.aaebf2c7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2313],{28453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>o});var i=r(96540);const t={},a=i.createContext(t);function s(e){const n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(a.Provider,{value:n},e.children)}},40879:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"sql/advanced/performance-tuning","title":"Performance Tuning","description":"Optimizer Hints","source":"@site/docs/sql/advanced/performance-tuning.md","sourceDirName":"sql/advanced","slug":"/sql/advanced/performance-tuning","permalink":"/docs/ignite3/3.1.0/sql/advanced/performance-tuning","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Performance Tuning","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"EXPLAIN Statement","permalink":"/docs/ignite3/3.1.0/sql/advanced/explain-statement"},"next":{"title":"Configure and Operate","permalink":"/docs/ignite3/3.1.0/configure-and-operate/"}}');var t=r(74848),a=r(28453);const s={title:"Performance Tuning",sidebar_position:3},o="SQL Performance Tuning",l={},d=[{value:"Optimizer Hints",id:"optimizer-hints",level:2},{value:"Hints format",id:"hints-format",level:3},{value:"Hint parameters",id:"hint-parameters",level:4},{value:"Hints errors",id:"hints-errors",level:3},{value:"Supported hints",id:"supported-hints",level:3},{value:"FORCE_INDEX / NO_INDEX",id:"force_index--no_index",level:4},{value:"Parameters:",id:"parameters",level:5},{value:"Examples:",id:"examples",level:5},{value:"Using EXPLAIN Statement",id:"using-explain-statement",level:2},{value:"EXPLAIN PLAN FOR Statement",id:"explain-plan-for-statement",level:3},{value:"EXPLAIN MAPPING FOR Statement",id:"explain-mapping-for-statement",level:3},{value:"Query Batching",id:"query-batching",level:2},{value:"Performance Consideration For Correlated Subqueries",id:"performance-consideration-for-correlated-subqueries",level:2},{value:"What Are Correlated Subqueries",id:"what-are-correlated-subqueries",level:3},{value:"Performance Impact",id:"performance-impact",level:3},{value:"Improving Performance",id:"improving-performance",level:3},{value:"Examples of Improved Queries",id:"examples-of-improved-queries",level:3},{value:"Dropping Cached Plans",id:"dropping-cached-plans",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"sql-performance-tuning",children:"SQL Performance Tuning"})}),"\n",(0,t.jsx)(n.h2,{id:"optimizer-hints",children:"Optimizer Hints"}),"\n",(0,t.jsx)(n.p,{children:"The query optimizer tries to execute the fastest execution plan. However, you can know about the data design, application design or data distribution in your cluster better. SQL hints can help the optimizer to make optimizations more rationally or build execution plan faster."}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"SQL hints are optional to apply and might be skipped in some cases."})}),"\n",(0,t.jsx)(n.h3,{id:"hints-format",children:"Hints format"}),"\n",(0,t.jsxs)(n.p,{children:["SQL hints are defined by a special comment ",(0,t.jsx)(n.code,{children:"/*+ HINT */"}),", referred to as a ",(0,t.jsx)(n.em,{children:"hint block"}),". Spaces before and after the\r\nhint name are required. The hint block must be placed right after the operator. Several hints for one relation operator are not supported."]}),"\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ NO_INDEX */ T1.* FROM TBL1 where T1.V1=? and T1.V2=?\n"})}),"\n",(0,t.jsx)(n.h4,{id:"hint-parameters",children:"Hint parameters"}),"\n",(0,t.jsx)(n.p,{children:"Hint parameters, if required, are placed in brackets after the hint name and separated by commas."}),"\n",(0,t.jsx)(n.p,{children:"The hint parameter can be quoted. Quoted parameter is case-sensitive. The quoted and unquoted parameters cannot be\r\ndefined for the same hint."}),"\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ FORCE_INDEX(TBL1_IDX2,TBL2_IDX1) */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 T2 WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;\r\n\r\nSELECT /*+ FORCE_INDEX('TBL2_idx1') */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 T2 WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;\n"})}),"\n",(0,t.jsx)(n.h3,{id:"hints-errors",children:"Hints errors"}),"\n",(0,t.jsx)(n.p,{children:"The optimizer tries to apply every hint and its parameters, if possible. But it skips the hint or hint parameter if:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The hint is not supported."}),"\n",(0,t.jsx)(n.li,{children:"Required hint parameters are not passed."}),"\n",(0,t.jsx)(n.li,{children:"The hint parameters have been passed, but the hint does not support any parameter."}),"\n",(0,t.jsx)(n.li,{children:"The hint parameter is incorrect or refers to a nonexistent object, such as a nonexistent index or table."}),"\n",(0,t.jsx)(n.li,{children:"The current hints or current parameters are incompatible with the previous ones, such as forcing the use and disabling of the same index."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a ",(0,t.jsx)(n.code,{children:"FORCE_INDEX"})," hint references an index that does not exist, the following error will be thrown:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-java",children:'Hints mentioned indexes "IDX_NOT_FOUND1", "IDX_NOT_FOUND2" were not found.\n'})}),"\n",(0,t.jsx)(n.h3,{id:"supported-hints",children:"Supported hints"}),"\n",(0,t.jsx)(n.h4,{id:"force_index--no_index",children:"FORCE_INDEX / NO_INDEX"}),"\n",(0,t.jsx)(n.p,{children:"Forces or disables index scan."}),"\n",(0,t.jsx)(n.h5,{id:"parameters",children:"Parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Empty. To force an index scan for every underlying table. Optimizer will choose any available index. Or to disable all indexes."}),"\n",(0,t.jsx)(n.li,{children:"Single index name to use or skip exactly this index."}),"\n",(0,t.jsx)(n.li,{children:"Several index names. They can relate to different tables. The optimizer will choose indexes for scanning or skip them all."}),"\n"]}),"\n",(0,t.jsx)(n.h5,{id:"examples",children:"Examples:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"SELECT /*+ FORCE_INDEX */ T1.* FROM TBL1 T1 WHERE T1.V1 = T2.V1 AND T1.V2 > ?;\r\n\r\nSELECT /*+ FORCE_INDEX(TBL1_IDX2, TBL2_IDX1) */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 T2 WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;\r\n\r\nSELECT /*+ NO_INDEX */ T1.* FROM TBL1 T1 WHERE T1.V1 = T2.V1 AND T1.V2 > ?;\r\n\r\nSELECT /*+ NO_INDEX(TBL1_IDX2, TBL2_IDX1) */ T1.V1, T2.V1 FROM TBL1 T1, TBL2 T2 WHERE T1.V1 = T2.V1 AND T1.V2 > ? AND T2.V2 > ?;\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The query cannot have both ",(0,t.jsx)(n.code,{children:"FORCE_INDEX"})," and ",(0,t.jsx)(n.code,{children:"NO_INDEX"})," hints at the same time."]})}),"\n",(0,t.jsx)(n.h2,{id:"using-explain-statement",children:"Using EXPLAIN Statement"}),"\n",(0,t.jsx)(n.h3,{id:"explain-plan-for-statement",children:"EXPLAIN PLAN FOR Statement"}),"\n",(0,t.jsxs)(n.p,{children:["Apache Ignite supports the ",(0,t.jsx)(n.a,{href:"/3.1.0/sql/reference/data-types-and-functions/operational-commands",children:(0,t.jsx)(n.code,{children:"EXPLAIN PLAN FOR"})})," statement that can be used to read the execution plan of a query."]}),"\n",(0,t.jsx)(n.p,{children:"Use this command to analyse your queries for possible optimization, for example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"EXPLAIN PLAN FOR SELECT name FROM Person WHERE age = 26;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Here is how the results of the explanation may look like:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 PLAN \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 Exchange \u2551\r\n\u2551 distribution: single \u2551\r\n\u2551 est. row count: 333000 \u2551\r\n\u2551 TableScan \u2551\r\n\u2551 table: [PUBLIC, PERSON] \u2551\r\n\u2551 filters: =(AGE, 26) \u2551\r\n\u2551 fields: [$f0] \u2551\r\n\u2551 projects: [NAME] \u2551\r\n\u2551 est. row count: 333000 \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,t.jsx)(n.h3,{id:"explain-mapping-for-statement",children:"EXPLAIN MAPPING FOR Statement"}),"\n",(0,t.jsxs)(n.p,{children:["Apache Ignite supports the ",(0,t.jsx)(n.a,{href:"/3.1.0/sql/reference/data-types-and-functions/operational-commands",children:(0,t.jsx)(n.code,{children:"EXPLAIN MAPPING FOR"})})," statement that can be used to track how the query is split and what nodes the subqueries are executed on."]}),"\n",(0,t.jsx)(n.p,{children:"Use this command if you need an insight into how the query is broken down and executed across multiple nodes in the distributed cluster."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"EXPLAIN MAPPING FOR SELECT name FROM Person WHERE age = 26;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Here is how the results of the query may look like:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 PLAN \u2551\r\n\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563\r\n\u2551 Fragment#0 root \u2551\r\n\u2551 executionNodes: [defaultNode] \u2551\r\n\u2551 remoteFragments: [1] \u2551\r\n\u2551 exchangeSourceNodes: {1=[defaultNode]} \u2551\r\n\u2551 tree: \u2551\r\n\u2551 Receiver(sourceFragment=1, exchange=1, distribution=single) \u2551\r\n\u2551 \u2551\r\n\u2551 Fragment#1 \u2551\r\n\u2551 targetNodes: [defaultNode] \u2551\r\n\u2551 executionNodes: [defaultNode] \u2551\r\n\u2551 tables: [PERSON] \u2551\r\n\u2551 partitions: {defaultNode=[0:12, 1:12, 2:12, 3:12, 4:12, 5:12, 6:12, 7:12, 8:12, 9:12, 10:12, 11:12, 12:12, 13:12, 14:12, 15:12, 16:12, 17:12, 18:12, 19:12, 20:12, 21:12, 22:12, 23:12, 24:12]} \u2551\r\n\u2551 tree: \u2551\r\n\u2551 Sender(targetFragment=0, exchange=1, distribution=single) \u2551\r\n\u2551 TableScan(name=PUBLIC.PERSON, source=2, partitions=25, distribution=random) \u2551\r\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d\n"})}),"\n",(0,t.jsx)(n.h2,{id:"query-batching",children:"Query Batching"}),"\n",(0,t.jsx)(n.p,{children:"Apache Ignite handles batched requests faster than individual requests, so we recommend using multi-statement execution when possible."}),"\n",(0,t.jsx)(n.p,{children:"When executing multiple queries in a single call, similar requests are automatically batched together. When writing large scripts that perform multiple different kinds of operations, we recommend the following order:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["All required ",(0,t.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/ddl",children:"DDL operations"}),";"]}),"\n",(0,t.jsxs)(n.li,{children:["Assigning ",(0,t.jsx)(n.a,{href:"/3.1.0/sql/reference/data-types-and-functions/operational-commands",children:"access permissions"}),";"]}),"\n",(0,t.jsx)(n.li,{children:"Loading data into the tables."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["As execution of each statement is considered complete when the first page is ready to be returned, when working with large data sets, ",(0,t.jsx)(n.code,{children:"SELECT"})," statements may be affected by later statements in the same script."]}),"\n",(0,t.jsx)(n.h2,{id:"performance-consideration-for-correlated-subqueries",children:"Performance Consideration For Correlated Subqueries"}),"\n",(0,t.jsx)(n.p,{children:"Apache Ignite supports correlated subqueries, but the performance of certain complex correlated subqueries may be insufficient, especially when used in high-volume transactional or analytical workloads."}),"\n",(0,t.jsx)(n.h3,{id:"what-are-correlated-subqueries",children:"What Are Correlated Subqueries"}),"\n",(0,t.jsx)(n.p,{children:"A correlated subquery is a subquery that depends on values from the outer query for execution. It is evaluated once for every row of the outer query."}),"\n",(0,t.jsx)(n.p,{children:"For example, for a schema that is defined in the following way:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE projects (id INT PRIMARY KEY, name VARCHAR);\r\nCREATE TABLE employees (id INT PRIMARY KEY, department_id INT, name VARCHAR, salary DECIMAl);\r\nCREATE TABLE departments (id INT PRIMARY KEY, name VARCHAR);\r\nCREATE TABLE assignments (project_id INT, employee_id INT, PRIMARY KEY (project_id, employee_id));\n"})}),"\n",(0,t.jsx)(n.p,{children:"The correlated subquery may look like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"SELECT e.name,\r\n (SELECT COUNT(*)\r\n FROM assignments a\r\n WHERE a.employee_id = e.id\r\n ) AS project_count\r\nFROM employees e;\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Here, the subquery references ",(0,t.jsx)(n.code,{children:"e.id"})," from the outer query, meaning it's re-evaluated for every employee row, leading to N separate subquery executions for N employees."]}),"\n",(0,t.jsx)(n.h3,{id:"performance-impact",children:"Performance Impact"}),"\n",(0,t.jsx)(n.p,{children:"In Apache Ignite 3, repeated subquery executions are not automatically optimized. As a result:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Scalar subqueries may become bottlenecks."}),"\n",(0,t.jsx)(n.li,{children:"Even small tables can cause high CPU and memory consumption when repeatedly queried."}),"\n",(0,t.jsx)(n.li,{children:"Certain queries may perform slower than expected."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"improving-performance",children:"Improving Performance"}),"\n",(0,t.jsx)(n.p,{children:"In general, highly-selective outer queries with cheap scalar subqueries (like single-row index lookup) will perform just fine. Here is an example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- This query returns an employee along with the name of the department they belong to.\r\n-- It uses a correlated scalar subquery to resolve the department name.\r\n--\r\n-- Note the predicate `e.id = ?`, which filters by the employee's primary key.\r\n-- This makes the outer query highly selective -- typically returning only a single row.\r\n--\r\n-- Because the subquery is evaluated only once (or a very small number of times),\r\n-- using a correlated scalar subquery is safe and has negligible performance impact\r\n-- in this case. There's no need to rewrite it using a join.\r\nSELECT e.*,\r\n (SELECT name\r\n FROM departments\r\n WHERE id = e.department_id\r\n ) AS employees_department\r\n FROM employees e\r\n WHERE e.id = ?;\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Similar query but without predicate may result in lower performance. If the query with predicate finishes in ",(0,t.jsx)(n.code,{children:"0.007s"}),", similar query without predicate could take up to ",(0,t.jsx)(n.code,{children:"2.4s"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Here is another example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- This query returns all employees along with the name of the department they\r\n-- belong to.\r\nSELECT e.*,\r\n (SELECT name\r\n FROM departments\r\n WHERE id = e.department_id\r\n ) AS employees_department\r\n FROM employees e;\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Query like the one above may easily be rewritten with regular ",(0,t.jsx)(n.code,{children:"JOIN"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- Equivalent query to the previous example, but uses a `LEFT JOIN` instead of a\r\n-- correlated subquery. This rewrite is valid as long as the subquery in the original\r\n-- version would return at most one row.\r\n--\r\n-- If multiple rows exist in the `departments` table for the same `id`, the original\r\n-- scalar subquery would result in a runtime error (due to a non-scalar result), while\r\n-- the join version would produce duplicated rows in the output.\r\n--\r\n-- In our case, `departments.id` is a primary key, so the join is safe and will return\r\n-- at most one matching department per employee.\r\n--\r\n-- A `LEFT JOIN` is used to ensure that employees with no matching department are still\r\n-- returned. If it's guaranteed that every employee has a valid department reference,\r\n-- an `INNER JOIN` may be used instead, which is slightly more efficient.\r\nSELECT e.*,\r\n d.name AS employees_department\r\n FROM employees e\r\n LEFT JOIN departments d ON d.id = e.department_id;\n"})}),"\n",(0,t.jsx)(n.p,{children:"Rewritten query on the same environment finishes significantly faster."}),"\n",(0,t.jsx)(n.h3,{id:"examples-of-improved-queries",children:"Examples of Improved Queries"}),"\n",(0,t.jsx)(n.p,{children:"The first example shows how you can correctly query the database without evaluating each row:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- This query returns all employees without assigned projects.\r\n--\r\n-- Finishes in 3.2s (assuming there is an index on `assignments(employee_id)`;\r\n-- without the index, execution time increases significantly -- up to 12s).\r\nSELECT e.id, e.name\r\nFROM employees e\r\nWHERE NOT EXISTS (\r\n SELECT 1\r\n FROM assignments a\r\n WHERE a.employee_id = e.id\r\n);\r\n\r\n-- Equivalent query without correlated subqueries.\r\n-- Instead of evaluating a subquery for each row, we join the tables and compute\r\n-- the number of assignments using aggregation. It is important to include all\r\n-- columns that form a unique key from the outer table in the `GROUP BY` clause.\r\n-- Otherwise, multiple rows may be grouped together incorrectly, potentially\r\n-- affecting the result. If you're unsure about the uniqueness of specific columns,\r\n-- include all columns from the table's `PRIMARY KEY`.\r\n--\r\n-- A `LEFT JOIN` is used because we want to retain employees even when there is\r\n-- no matching assignment. An `INNER JOIN` would exclude those employees.\r\n--\r\n-- The `HAVING COUNT(a.employee_id) = 0` clause checks for the absence of matches.\r\n-- You must count a column from the right-hand side of the join that is guaranteed\r\n-- to be non-null. In this case, `a.employee_id` is suitable because the `JOIN`\r\n-- condition (`a.employee_id = e.id`) ensures that only non-null `employee_id`s\r\n-- are matched; nulls are excluded during the join phase.\r\n--\r\n-- Finishes in 0.04s.\r\nSELECT e.id, e.name\r\n FROM employees e\r\n LEFT JOIN assignments a ON a.employee_id = e.id\r\n GROUP BY e.id, e.name\r\nHAVING COUNT(a.employee_id) = 0;\r\n\r\n-- Similar query, but returns only employees who have at least one project assigned.\r\n-- Note the use of `INNER JOIN`: since we are only interested in employees with a\r\n-- matching assignment, an inner join is both sufficient and more efficient in this case.\r\n--\r\n-- The `HAVING COUNT(a.employee_id) > 0` condition ensures that only employees\r\n-- with one or more matching rows in the `assignments` table are returned.\r\n-- As with the previous example, `a.employee_id` is safe to count because it cannot be null\r\n-- due to the join condition (`a.employee_id = e.id`) filtering out nulls.\r\n--\r\n-- Finishes in 0.03s.\r\nSELECT e.id, e.name\r\n FROM employees e\r\n JOIN assignments a ON a.employee_id = e.id\r\n GROUP BY e.id, e.name\r\nHAVING COUNT(a.employee_id) > 0;\n"})}),"\n",(0,t.jsx)(n.p,{children:"This example demonstrates drastic performance improvement you can gain by improving your queries:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"-- This query returns all employees whose salary is the minimum within their department.\r\n--\r\n-- Finishes in 18s.\r\nSELECT e.*\r\n FROM employees e\r\n WHERE e.salary = (SELECT MIN(salary) FROM employees WHERE department_id = e.department_id);\r\n\r\n-- Equivalent query without a correlated subquery.\r\n-- Instead of comparing each employee's salary with a scalar subquery result,\r\n-- we precompute the minimum salary per department using a grouped subquery,\r\n-- and then join it back to the employees table.\r\n--\r\n-- This rewrite is safe because:\r\n-- - For each department, we compute the minimum salary exactly once.\r\n-- - The join condition ensures we only return employees whose salary matches\r\n-- the minimum salary for their department.\r\n-- - No grouping is needed on the outer query because we're performing an equality match\r\n-- on both `department_id` and the computed minimum salary.\r\n--\r\n-- This approach avoids per-row subquery evaluation and leverages set-based operations,\r\n-- which are significantly faster.\r\n--\r\n-- Finishes in 0.02s.\r\nSELECT e.*\r\n FROM employees e\r\n JOIN (\r\n SELECT department_id, MIN(salary) AS min_salary\r\n FROM employees\r\n GROUP BY department_id\r\n ) AS min_salaries_by_department\r\n ON e.department_id = min_salaries_by_department.department_id\r\n AND e.salary = min_salaries_by_department.min_salary;\n"})}),"\n",(0,t.jsx)(n.h2,{id:"dropping-cached-plans",children:"Dropping Cached Plans"}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsx)(n.p,{children:"This is an experimental API."})}),"\n",(0,t.jsxs)(n.p,{children:["As optimizing the query plan is a resource-intensive operation, Apache Ignite caches the plan and reuses it for subsequent related queries. As data is updated, the plan may be outdated and require recalculation. By default, the plans expire after the period specified in the ",(0,t.jsx)(n.code,{children:"ignite.planner.planCacheExpiresAfterSeconds"})," parameter (1800 seconds by default)."]}),"\n",(0,t.jsxs)(n.p,{children:["To force the update earlier, you can use the ",(0,t.jsx)(n.code,{children:"sql planner invalidate-cache"})," CLI tool command."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"sql planner invalidate-cache --tables=PUBLIC.Person\n"})})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/e4ab0479.565582b8.js b/docs/ignite3/assets/js/e4ab0479.565582b8.js deleted file mode 100644 index b13539e781..0000000000 --- a/docs/ignite3/assets/js/e4ab0479.565582b8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1605],{28453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>a});var t=i(96540);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}},58266:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>g,frontMatter:()=>s,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"getting-started/migrate-from-ignite-2","title":"Migrating from Ignite 2","description":"This section describes how to configure an Apache Ignite 3 cluster into which you will migrate all the components of your Apache Ignite 2 cluster.","source":"@site/docs/getting-started/migrate-from-ignite-2.md","sourceDirName":"getting-started","slug":"/getting-started/migrate-from-ignite-2","permalink":"/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Migrating from Ignite 2"},"sidebar":"tutorialSidebar","previous":{"title":"Configuration Tips","permalink":"/docs/ignite3/3.1.0/getting-started/best-practices"},"next":{"title":"Migrate from 3.0 to 3.1","permalink":"/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1"}}');var r=i(74848),o=i(28453);const s={title:"Migrating from Ignite 2"},a=void 0,c={},l=[{value:"Configuration Migration",id:"configuration-migration",level:2},{value:"Node Configuration",id:"node-configuration",level:3},{value:"Storage Configuration",id:"storage-configuration",level:4},{value:"Client Configuration",id:"client-configuration",level:4},{value:"Network Configuration",id:"network-configuration",level:4},{value:"REST API Configuration",id:"rest-api-configuration",level:4},{value:"Cluster Configuration",id:"cluster-configuration",level:3},{value:"Handling Events",id:"handling-events",level:4},{value:"Metrics Collection",id:"metrics-collection",level:4},{value:"Code Migration",id:"code-migration",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"This section describes how to configure an Apache Ignite 3 cluster into which you will migrate all the components of your Apache Ignite 2 cluster."}),"\n",(0,r.jsx)(n.h2,{id:"configuration-migration",children:"Configuration Migration"}),"\n",(0,r.jsx)(n.p,{children:"You need to configure the cluster you have created to match the Apache Ignite 2 cluster you are migrating from."}),"\n",(0,r.jsx)(n.p,{children:"While cluster configurations in Apache Ignite 2 are XML beans, in Apache Ignite 3 they are in HOCON format. Moreover, many configuration structures in version 3 are different from those in version 2."}),"\n",(0,r.jsxs)(n.p,{children:['In Apache Ignite 3, the configuration file has a single root "node," called ',(0,r.jsx)(n.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,r.jsx)(n.p,{children:"For example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "network" : {\r\n "nodeFinder" : {\r\n "netClusterNodes" : ["localhost:3344"]\r\n },\r\n "port" : 3344\r\n },\r\n "storage" : {\r\n "profiles" : [\r\n {\r\n "name" : "persistent",\r\n "engine" : "aipersist"\r\n }\r\n ]\r\n },\r\n "nodeAttributes.nodeAttributes" : {\r\n "region" : "US",\r\n "storage" : "SSD"\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"When migrating your environment Apache Ignite 3 configuration is split between Cluster, Node and distribution zone configurations."}),"\n",(0,r.jsx)(n.h3,{id:"node-configuration",children:"Node Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Node configuration stores information about the locally running node."}),"\n",(0,r.jsx)(n.h4,{id:"storage-configuration",children:"Storage Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite 3 storage is configured in a completely different manner from Apache Ignite 2."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["First, you configure ",(0,r.jsx)(n.strong,{children:"storage engine"})," properties, which may include properties like page size or checkpoint frequency."]}),"\n",(0,r.jsxs)(n.li,{children:["Then, you create a ",(0,r.jsx)(n.strong,{children:"storage profile"}),", which defines a specific storage that will be used."]}),"\n",(0,r.jsxs)(n.li,{children:["Then, you create a ",(0,r.jsx)(n.strong,{children:"distribution zone"})," using the storage profile, which can be further used to fine-tune the storage by defining where and how to store data across the cluster."]}),"\n",(0,r.jsxs)(n.li,{children:["Finally, each ",(0,r.jsx)(n.strong,{children:"table"})," can be assigned to the distribution zone, or directly to a storage profile."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Note:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Only tables and distribution zones can be configured from code. Storage profiles and engines must be configured by updating node configuration and restarting node."}),"\n",(0,r.jsx)(n.li,{children:"Custom affinity functions are replaced by distribution zones."}),"\n",(0,r.jsx)(n.li,{children:"External storage is supported via cache storage that must be configured by using SQL."}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"client-configuration",children:"Client Configuration"}),"\n",(0,r.jsxs)(n.p,{children:['All clients in Apache Ignite 3 are "thin", and use a similar ',(0,r.jsx)(n.code,{children:"clientConnector"})," configuration. See ",(0,r.jsx)(n.a,{href:"/3.1.0/develop/ignite-clients/",children:"Apache Ignite Clients"})," section for more information on configuring client connector."]}),"\n",(0,r.jsx)(n.h4,{id:"network-configuration",children:"Network Configuration"}),"\n",(0,r.jsxs)(n.p,{children:["Node network configuration is now performed in the ",(0,r.jsx)(n.code,{children:"network"})," section of the ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/reference/node-configuration",children:"node configuration"}),"."]}),"\n",(0,r.jsx)(n.h4,{id:"rest-api-configuration",children:"REST API Configuration"}),"\n",(0,r.jsx)(n.p,{children:"REST API is a significant part of Apache Ignite 3. It can be used for multiple purposes, including cluster and node configuration and running SQL requests."}),"\n",(0,r.jsxs)(n.p,{children:["You can configure REST properties in ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/reference/node-configuration",children:"node configuration"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"cluster-configuration",children:"Cluster Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Cluster configuration applies to all nodes in the cluster. It is automatically propagated across the cluster from the node you apply in at."}),"\n",(0,r.jsx)(n.h4,{id:"handling-events",children:"Handling Events"}),"\n",(0,r.jsx)(n.p,{children:"Events configuration is simplified in Apache Ignite 3. It is separated in 2 configurations:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Event ",(0,r.jsx)(n.strong,{children:"channels"})," define what is collected."]}),"\n",(0,r.jsxs)(n.li,{children:["Event ",(0,r.jsx)(n.strong,{children:"sinks"})," define where the data is sent."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["In the current release, only ",(0,r.jsx)(n.code,{children:"log"})," sink are supported. You can configure events as described in the ",(0,r.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/events",children:"Events"})," section."]}),"\n",(0,r.jsx)(n.h4,{id:"metrics-collection",children:"Metrics Collection"}),"\n",(0,r.jsx)(n.p,{children:"Apache Ignite 3 has metrics disabled by default."}),"\n",(0,r.jsx)(n.p,{children:"All metrics are grouped according to their metric sources, and are enabled in cluster configuration per metric source."}),"\n",(0,r.jsx)(n.p,{children:"Then, these metrics will be available in Apache Ignite JMX beans."}),"\n",(0,r.jsxs)(n.p,{children:["For instructions on configuring metrics, see ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/metrics-configuration",children:"Metrics Configuration"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"code-migration",children:"Code Migration"}),"\n",(0,r.jsx)(n.p,{children:"Code written for Apache Ignite 2 cannot be directly reused, however as most concepts remain similar, code migration should not take too much time."})]})}function g(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/e6238dca.29038b27.js b/docs/ignite3/assets/js/e6238dca.29038b27.js deleted file mode 100644 index 8b64b26522..0000000000 --- a/docs/ignite3/assets/js/e6238dca.29038b27.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4443],{11015:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"understand/core-concepts/data-partitioning","title":"Data Partitioning","description":"Data partitioning divides table data into fixed-size chunks called partitions and distributes them across cluster nodes. This distribution enables horizontal scaling: adding nodes increases both storage capacity and query throughput.","source":"@site/docs/understand/core-concepts/data-partitioning.md","sourceDirName":"understand/core-concepts","slug":"/understand/core-concepts/data-partitioning","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"id":"data-partitioning","title":"Data Partitioning","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Distribution and Colocation","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation"},"next":{"title":"Compute and Events","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events"}}');var a=r(74848),t=r(28453);const s={id:"data-partitioning",title:"Data Partitioning",sidebar_position:2},o="Data Partitioning",l={},d=[{value:"Partition Distribution",id:"partition-distribution",level:2},{value:"Partition Number",id:"partition-number",level:3},{value:"Replica Number",id:"replica-number",level:3},{value:"Primary Replicas and Leases",id:"primary-replicas-and-leases",level:2},{value:"Reading Data From Replicas",id:"reading-data-from-replicas",level:3},{value:"Version Storage",id:"version-storage",level:2},{value:"Distribution Reset",id:"distribution-reset",level:2},{value:"Partition Rebalance",id:"partition-rebalance",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",mermaid:"mermaid",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"data-partitioning",children:"Data Partitioning"})}),"\n",(0,a.jsx)(n.p,{children:"Data partitioning divides table data into fixed-size chunks called partitions and distributes them across cluster nodes. This distribution enables horizontal scaling: adding nodes increases both storage capacity and query throughput."}),"\n",(0,a.jsx)(n.h2,{id:"partition-distribution",children:"Partition Distribution"}),"\n",(0,a.jsxs)(n.p,{children:["Tables belong to distribution zones, which define how data is partitioned and replicated. The zone's ",(0,a.jsx)(n.code,{children:"PARTITIONS"})," parameter sets the number of partitions, and ",(0,a.jsx)(n.code,{children:"REPLICAS"})," sets how many copies of each partition exist."]}),"\n",(0,a.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Distribution Zone: financial"\r\n direction TB\r\n ZC[PARTITIONS: 6
                                                              REPLICAS: 3]\r\n end\r\n\r\n subgraph "Table: accounts"\r\n direction LR\r\n P0[Partition 0]\r\n P1[Partition 1]\r\n P2[Partition 2]\r\n P3[Partition 3]\r\n P4[Partition 4]\r\n P5[Partition 5]\r\n end\r\n\r\n subgraph "Cluster Nodes"\r\n subgraph "Node 1"\r\n N1P0[P0 Primary]\r\n N1P3[P3 Backup]\r\n N1P4[P4 Backup]\r\n end\r\n subgraph "Node 2"\r\n N2P1[P1 Primary]\r\n N2P0[P0 Backup]\r\n N2P5[P5 Backup]\r\n end\r\n subgraph "Node 3"\r\n N3P2[P2 Primary]\r\n N3P1[P1 Backup]\r\n N3P3[P3 Primary]\r\n end\r\n subgraph "Node 4"\r\n N4P4[P4 Primary]\r\n N4P2[P2 Backup]\r\n N4P5[P5 Primary]\r\n end\r\n end\r\n\r\n ZC --\x3e P0 & P1 & P2 & P3 & P4 & P5\r\n P0 --\x3e N1P0 & N2P0\r\n P1 --\x3e N2P1 & N3P1\r\n P2 --\x3e N3P2 & N4P2\r\n P3 --\x3e N3P3 & N1P3\r\n P4 --\x3e N4P4 & N1P4\r\n P5 --\x3e N4P5 & N2P5'}),"\n",(0,a.jsx)(n.p,{children:"Key behaviors:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Each partition is identified by a number (0 to PARTITIONS-1)"}),"\n",(0,a.jsx)(n.li,{children:"Replicas of the same partition are placed on different nodes when possible"}),"\n",(0,a.jsx)(n.li,{children:"Tables in the same zone share partition-to-node mappings (enabling colocation)"}),"\n",(0,a.jsx)(n.li,{children:"The Fair distribution algorithm stores placement decisions in metastorage and reuses them for consistent assignment"}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["You can configure the way node stores relevant information in the ",(0,a.jsx)(n.a,{href:"/3.1.0/configure-and-operate/reference/node-configuration",children:"node configuration"}),":"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"ignite.system.partitionsBasePath"})," defines the folder partitions are stored in. By default, partitions are stored in the ",(0,a.jsx)(n.code,{children:"work/partitions"})," folder."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"ignite.system.partitionsLogPath"})," defines the folder where partition-specific RAFT logs are stored. These logs contain information on RAFT elections and consensus."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"ignite.system.metastoragePath"})," defines the folder where cluster metadata is stored. It is recommended to store metadata on a separate device from partitions."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"partition-number",children:"Partition Number"}),"\n",(0,a.jsxs)(n.p,{children:["When creating a distribution zone, you have an option to manually set the number of partitions with the ",(0,a.jsx)(n.code,{children:"PARTITIONS"})," parameter, for example:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (PARTITIONS 10) STORAGE PROFILES ['default'];\n"})}),"\n",(0,a.jsx)(n.p,{children:"As partitions will be spread across the cluster, we recommend to set the number of partitions depending on its size and the number of available cores."}),"\n",(0,a.jsx)(n.p,{children:"In most cases, we recommend using 2, 3 or 4 times the number of total available cores, divided by the number of replicas as the number of partitions. For example:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"For a cluster with 3 nodes, 8 cores on each node, and 3 data replicas, we recommend using 16, 24 or 32 partitions."}),"\n",(0,a.jsx)(n.li,{children:"For a cluster with 7 nodes, 16 cores on each node, and 3 data replicas, we recommend using 75, 112 or 150 partitions."}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"It is not recommended to set a significantly larger number of partitions or replicas, as maintaining partitions and their distribution can cause a performance drain on the cluster."}),"\n",(0,a.jsx)(n.p,{children:"Otherwise, Apache Ignite will automatically calculate the recommended number of partitions:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-text",children:"dataNodesCount * coresOnNode * 2 / replicas\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In this case, the ",(0,a.jsx)(n.code,{children:"dataNodesCount"})," is the estimated number of nodes that will be in the distribution zone when it is created, according to its ",(0,a.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"filter"})," and ",(0,a.jsx)(n.a,{href:"/3.1.0/understand/architecture/storage-architecture",children:"storage profiles"}),". At least 1 partition is always created."]}),"\n",(0,a.jsx)(n.h3,{id:"replica-number",children:"Replica Number"}),"\n",(0,a.jsxs)(n.p,{children:["When creating a distribution zone, you can configure the number of ",(0,a.jsx)(n.em,{children:"replicas"})," (individual copies of data on the cluster) by setting the ",(0,a.jsx)(n.code,{children:"REPLICAS"})," parameter. By default, no additional replicas of data are created. As more replicas are added, additional copies of data will be stored on the cluster, and automatically spread to ensure data availability in case of a node leaving the cluster."]}),"\n",(0,a.jsxs)(n.p,{children:["Replicas of each partition form a RAFT group, and a ",(0,a.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"quorum"})," in that group is required to perform updates to the partition. The default quorum size depends on the number of replicas in the distribution zone: 3 replicas are required for quorum if the distribution zone has 5 or more replicas, 2 if there are between 2 and 4 replicas, or 1 if only one data replica exists."]}),"\n",(0,a.jsxs)(n.p,{children:["Some replicas will be selected as part of a consensus group. These nodes will be voting members, confirming all data changes in the replication group, while other replicas will be ",(0,a.jsx)(n.em,{children:"learners"}),", only passively receiving data from the group leader and not participating in elections."]}),"\n",(0,a.jsxs)(n.p,{children:["Losing the majority of the consensus group leads the partition to enter the ",(0,a.jsx)(n.code,{children:"Read-only"})," state. In this state, no data can be written and only explicit read-only transactions can be used to retrieve data. If the distribution zone ",(0,a.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"scales"})," up or down (typically, due to a node entering or leaving the cluster), new replicas will be selected as the consensus group."]}),"\n",(0,a.jsx)(n.p,{children:"The size of the consensus group is automatically calculated based on quorum size:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-text",children:"quorumSize * 2 - 1\n"})}),"\n",(0,a.jsx)(n.p,{children:"For example, with 5 replicas and quorum size of 2, 3 replicas will be part of consensus group, and 2 replicas will be learners. In this scenario, losing 2 nodes will lead to some partitions losing the majority of the consensus group and becoming unavailable. For this reason, it is recommended to have a quorum size of 3 for a 5-node cluster."}),"\n",(0,a.jsxs)(n.p,{children:["It is recommended to always have an odd number of replicas and at least 3 replicas of your data on the cluster. When only 2 data replicas exist, losing one will always lead to losing majority, while having 3 or 5 data replicas will allow the cluster to stay functional in ",(0,a.jsx)(n.a,{href:"/3.1.0/configure-and-operate/operations/lifecycle",children:"network segmentation"})," scenarios."]}),"\n",(0,a.jsxs)(n.p,{children:["You can also store data replicas on every node in cluster by creating a zone with ",(0,a.jsx)(n.code,{children:"REPLICAS ALL"})," parameter to ensure data is always available to the cluster."]}),"\n",(0,a.jsx)(n.h2,{id:"primary-replicas-and-leases",children:"Primary Replicas and Leases"}),"\n",(0,a.jsx)(n.p,{children:"Once partitions are distributed, Apache Ignite forms replication groups for each partition. Each group elects a leader through RAFT consensus, and the placement driver grants a lease to designate one replica as primary."}),"\n",(0,a.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Placement Driver"\r\n PD[Lease Placement Driver]\r\n MS[(Metastorage)]\r\n end\r\n\r\n subgraph "Partition 0 Replication Group"\r\n subgraph "Node 1"\r\n R1[Replica
                                                              PRIMARY
                                                              Lease Holder]\r\n end\r\n subgraph "Node 2"\r\n R2[Replica
                                                              BACKUP
                                                              Voter]\r\n end\r\n subgraph "Node 3"\r\n R3[Replica
                                                              BACKUP
                                                              Learner]\r\n end\r\n end\r\n\r\n PD --\x3e|"Grant Lease"| R1\r\n PD --\x3e|"Store Lease"| MS\r\n R1 <--\x3e|"RAFT Consensus"| R2\r\n R1 --\x3e|"Replicate"| R3\r\n\r\n Client[Client] --\x3e|"Read-Write TX"| R1\r\n Client -.->|"Read-Only TX"| R2\r\n Client -.->|"Read-Only TX"| R3'}),"\n",(0,a.jsx)(n.p,{children:"The lease mechanism provides:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Write linearization"}),": Only the primary replica handles read-write transactions"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Lease renewal"}),": Leases are extended periodically to maintain continuity"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Automatic failover"}),": When a lease expires, the placement driver negotiates a new primary"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"Only the primary replica can handle operations of read-write transactions. Other replicas of the partition can be read from by using read-only transactions."}),"\n",(0,a.jsxs)(n.p,{children:["If a new replica is chosen to receive the lease, it first makes sure it is up-to-date with its replication group based on the stored data. In scenarios where replication group is no longer operable (for example, a node unexpectedly leaves the cluster and the group loses majority), it follows the ",(0,a.jsx)(n.a,{href:"/3.1.0/configure-and-operate/operations/disaster-recovery-partitions",children:"disaster recovery"})," procedure, and you may need to reset the partitions manually."]}),"\n",(0,a.jsx)(n.h3,{id:"reading-data-from-replicas",children:"Reading Data From Replicas"}),"\n",(0,a.jsxs)(n.p,{children:["Reading data as part of a read-write ",(0,a.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/transactions",children:"transaction"})," is always handled by the primary data replica."]}),"\n",(0,a.jsx)(n.p,{children:"Read-only transactions can be handled by either backup or primary replicas, depending on the specifics of the transaction."}),"\n",(0,a.jsx)(n.h2,{id:"version-storage",children:"Version Storage"}),"\n",(0,a.jsx)(n.p,{children:"Apache Ignite maintains multiple versions of each row to support MVCC (Multi-Version Concurrency Control). When a row is updated, the old version is preserved in a version chain rather than being deleted immediately."}),"\n",(0,a.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Version Chain for Key: 42"\r\n V3[Version 3
                                                              ts: 1500
                                                              value: 300]\r\n V2[Version 2
                                                              ts: 1200
                                                              value: 200]\r\n V1[Version 1
                                                              ts: 1000
                                                              value: 100]\r\n end\r\n\r\n V3 --\x3e V2 --\x3e V1\r\n\r\n subgraph "Transactions"\r\n RW[Read-Write TX
                                                              sees: V3]\r\n RO1[Read-Only TX
                                                              at ts: 1400
                                                              sees: V2]\r\n RO2[Read-Only TX
                                                              at ts: 1100
                                                              sees: V1]\r\n end\r\n\r\n RW -.-> V3\r\n RO1 -.-> V2\r\n RO2 -.-> V1\r\n\r\n LW[Low Watermark
                                                              ts: 1100] --\x3e V1\r\n GC[Garbage Collector] --\x3e LW'}),"\n",(0,a.jsx)(n.p,{children:"Version visibility:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Read-write transactions see the latest version"}),"\n",(0,a.jsx)(n.li,{children:"Read-only transactions see the version valid at their start timestamp"}),"\n",(0,a.jsx)(n.li,{children:"Versions older than the low watermark are eligible for garbage collection"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The low watermark defaults to 600000 ms (10 minutes). Versions beyond this threshold are cleaned up by the garbage collector, though cleanup is deferred if any active transaction still requires the data."}),"\n",(0,a.jsxs)(n.p,{children:["In a similar manner, ",(0,a.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/ddl#drop-table",children:"dropped tables"})," are also not removed from disk until the low watermark point, however you can no longer write to these tables. Read-only transactions that try to get data from these tables will succeed if they read data at timestamp before the table was dropped, and will delay the low watermark point if it is necessary to complete the transaction."]}),"\n",(0,a.jsx)(n.p,{children:"Once the low watermark is reached, old versions of data are considered garbage and will be cleaned up by garbage collector during the next cleanup. This data may or may not be available, as garbage collection is not an immediate process. If a transaction was already started before the low watermark was reached, the required data will be kept available until the end of transaction even if the garbage collection happens. Additionally, Apache Ignite checks that old data is not required anywhere on the cluster before cleaning up the data."}),"\n",(0,a.jsx)(n.h2,{id:"distribution-reset",children:"Distribution Reset"}),"\n",(0,a.jsxs)(n.p,{children:["The SQL query performance can deteriorate in a cluster where tables had been created over a long period, alongside topology changes, due to sub-optimum data colocation. To resolve this issue, you can reset (recalculate) partition distribution using ",(0,a.jsx)(n.a,{href:"/3.1.0/tools/cli-commands",children:"CLI"})," or ",(0,a.jsx)(n.a,{href:"/3.1.0/tools/rest-api",children:"REST API"}),"."]}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsx)(n.p,{children:"Reset is likely to result in Partition Rebalance, which may take a long time."})}),"\n",(0,a.jsx)(n.h2,{id:"partition-rebalance",children:"Partition Rebalance"}),"\n",(0,a.jsxs)(n.p,{children:["When the ",(0,a.jsx)(n.a,{href:"/3.1.0/sql/reference/language-definition/distribution-zones",children:"cluster size changes"}),", Apache Ignite waits for the timeout specified in the ",(0,a.jsx)(n.code,{children:"AUTO SCALE UP"})," or ",(0,a.jsx)(n.code,{children:"AUTO SCALE DOWN"})," distribution zone properties, and then redistributes partitions according to partition distribution algorithm and transfers data to make it up-to-date with the replication group. This process is called ",(0,a.jsx)(n.em,{children:"data rebalance"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>o});var i=r(96540);const a={},t=i.createContext(a);function s(e){const n=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/e6e12c77.8801b6fc.js b/docs/ignite3/assets/js/e6e12c77.8801b6fc.js deleted file mode 100644 index 638fe789d4..0000000000 --- a/docs/ignite3/assets/js/e6e12c77.8801b6fc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9883],{28453:(n,e,t)=>{t.d(e,{R:()=>s,x:()=>c});var a=t(96540);const i={},r=a.createContext(i);function s(n){const e=a.useContext(r);return a.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function c(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:s(n.components),a.createElement(r.Provider,{value:e},n.children)}},46513:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>o,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"api-reference/native-clients/java/transactions-api","title":"Transactions API","description":"The Transactions API provides ACID guarantees for operations spanning multiple tables or operations. Applications use transactions to ensure data consistency when executing related updates that must succeed or fail as a unit.","source":"@site/docs/api-reference/native-clients/java/transactions-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/transactions-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"title":"Transactions API","id":"transactions-api","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"SQL API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api"},"next":{"title":"Compute API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api"}}');var i=t(74848),r=t(28453);const s={title:"Transactions API",id:"transactions-api",sidebar_position:6},c="Transactions API",o={},l=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Implicit Transactions",id:"implicit-transactions",level:2},{value:"Return Values from Transactions",id:"return-values-from-transactions",level:2},{value:"Explicit Transactions",id:"explicit-transactions",level:2},{value:"Read-Only Transactions",id:"read-only-transactions",level:2},{value:"Transaction Timeouts",id:"transaction-timeouts",level:2},{value:"Multi-Table Transactions",id:"multi-table-transactions",level:2},{value:"Asynchronous Transactions",id:"asynchronous-transactions",level:2},{value:"Async Transaction Closures",id:"async-transaction-closures",level:2},{value:"SQL and Transactions",id:"sql-and-transactions",level:2},{value:"Transaction Status",id:"transaction-status",level:2},{value:"Idempotent Operations",id:"idempotent-operations",level:2},{value:"Error Handling",id:"error-handling",level:2},{value:"Exception Types",id:"exception-types",level:2},{value:"Reference",id:"reference",level:2},{value:"IgniteTransactions Methods",id:"ignitetransactions-methods",level:3},{value:"Transaction Methods",id:"transaction-methods",level:3},{value:"TransactionOptions Configuration",id:"transactionoptions-configuration",level:3},{value:"Transaction Isolation",id:"transaction-isolation",level:3},{value:"Transaction Best Practices",id:"transaction-best-practices",level:3}];function d(n){const e={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...n.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.header,{children:(0,i.jsx)(e.h1,{id:"transactions-api",children:"Transactions API"})}),"\n",(0,i.jsx)(e.p,{children:"The Transactions API provides ACID guarantees for operations spanning multiple tables or operations. Applications use transactions to ensure data consistency when executing related updates that must succeed or fail as a unit."}),"\n",(0,i.jsx)(e.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,i.jsx)(e.p,{children:"Read-write transactions execute with SERIALIZABLE isolation. Operations within a transaction see a consistent view of data as it existed when the transaction started. Changes remain invisible to other transactions until commit."}),"\n",(0,i.jsx)(e.p,{children:"The API supports explicit transaction management and closure-based implicit transactions. Closure-based transactions automatically commit on normal completion and rollback on exceptions, reducing boilerplate code."}),"\n",(0,i.jsx)(e.p,{children:"Transactions have configurable timeouts. Read-write transactions default to 30 seconds. Read-only transactions optimize for read operations by eliminating write overhead."}),"\n",(0,i.jsx)(e.h2,{id:"implicit-transactions",children:"Implicit Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Use runInTransaction for automatic lifecycle management:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'ignite.transactions().runInTransaction(tx -> {\r\n RecordView view = ignite.tables().table("accounts").recordView();\r\n\r\n Tuple key = Tuple.create().set("id", 1);\r\n Tuple record = view.get(tx, key);\r\n\r\n int balance = record.intValue("balance");\r\n record.set("balance", balance + 100);\r\n\r\n view.put(tx, record);\r\n});\n'})}),"\n",(0,i.jsx)(e.p,{children:"The transaction commits automatically when the closure completes normally. Exceptions trigger automatic rollback."}),"\n",(0,i.jsx)(e.h2,{id:"return-values-from-transactions",children:"Return Values from Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Return values from transaction closures:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'int newBalance = ignite.transactions().runInTransaction(tx -> {\r\n RecordView view = ignite.tables().table("accounts").recordView();\r\n\r\n Tuple key = Tuple.create().set("id", 1);\r\n Tuple record = view.get(tx, key);\r\n\r\n int balance = record.intValue("balance") + 100;\r\n record.set("balance", balance);\r\n view.put(tx, record);\r\n\r\n return balance;\r\n});\r\n\r\nSystem.out.println("New balance: " + newBalance);\n'})}),"\n",(0,i.jsx)(e.h2,{id:"explicit-transactions",children:"Explicit Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Manage transaction lifecycle explicitly:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'Transaction tx = ignite.transactions().begin();\r\ntry {\r\n RecordView view = ignite.tables().table("accounts").recordView();\r\n\r\n Tuple key = Tuple.create().set("id", 1);\r\n Tuple record = view.get(tx, key);\r\n\r\n record.set("balance", record.intValue("balance") + 100);\r\n view.put(tx, record);\r\n\r\n tx.commit();\r\n} catch (Exception e) {\r\n tx.rollback();\r\n throw e;\r\n}\n'})}),"\n",(0,i.jsx)(e.p,{children:"Explicit management provides control over commit timing and error handling."}),"\n",(0,i.jsx)(e.h2,{id:"read-only-transactions",children:"Read-Only Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Optimize read operations with read-only transactions:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'TransactionOptions options = new TransactionOptions().readOnly(true);\r\n\r\nignite.transactions().runInTransaction(options, tx -> {\r\n RecordView view = ignite.tables().table("users").recordView();\r\n\r\n Tuple key = Tuple.create().set("id", 1);\r\n Tuple record = view.get(tx, key);\r\n\r\n System.out.println("User: " + record.stringValue("name"));\r\n});\n'})}),"\n",(0,i.jsx)(e.p,{children:"Read-only transactions eliminate write coordination overhead, improving performance for read operations."}),"\n",(0,i.jsx)(e.h2,{id:"transaction-timeouts",children:"Transaction Timeouts"}),"\n",(0,i.jsx)(e.p,{children:"Configure transaction timeouts:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:"TransactionOptions options = new TransactionOptions().timeoutMillis(60000);\r\n\r\nTransaction tx = ignite.transactions().begin(options);\n"})}),"\n",(0,i.jsx)(e.p,{children:"Transactions that exceed the timeout automatically rollback. This prevents long-running transactions from blocking other operations."}),"\n",(0,i.jsx)(e.h2,{id:"multi-table-transactions",children:"Multi-Table Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Execute operations across multiple tables:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'ignite.transactions().runInTransaction(tx -> {\r\n RecordView accounts = ignite.tables().table("accounts").recordView();\r\n RecordView history = ignite.tables().table("history").recordView();\r\n\r\n Tuple accountKey = Tuple.create().set("id", 1);\r\n Tuple account = accounts.get(tx, accountKey);\r\n\r\n int balance = account.intValue("balance");\r\n account.set("balance", balance - 50);\r\n accounts.put(tx, account);\r\n\r\n Tuple historyRecord = Tuple.create()\r\n .set("account_id", 1)\r\n .set("amount", -50)\r\n .set("timestamp", LocalDateTime.now());\r\n history.put(tx, historyRecord);\r\n});\n'})}),"\n",(0,i.jsx)(e.p,{children:"Both operations commit or rollback together."}),"\n",(0,i.jsx)(e.h2,{id:"asynchronous-transactions",children:"Asynchronous Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Create transactions asynchronously:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'ignite.transactions().beginAsync().thenCompose(tx ->\r\n ignite.tables().tableAsync("accounts")\r\n .thenCompose(table -> {\r\n RecordView view = table.recordView();\r\n Tuple key = Tuple.create().set("id", 1);\r\n return view.getAsync(tx, key)\r\n .thenCompose(record -> {\r\n record.set("balance", record.intValue("balance") + 100);\r\n return view.putAsync(tx, record);\r\n })\r\n .thenCompose(v -> tx.commitAsync());\r\n })\r\n).exceptionally(ex -> {\r\n return null;\r\n});\n'})}),"\n",(0,i.jsx)(e.p,{children:"Asynchronous transactions enable non-blocking transaction processing."}),"\n",(0,i.jsx)(e.h2,{id:"async-transaction-closures",children:"Async Transaction Closures"}),"\n",(0,i.jsx)(e.p,{children:"Use async closures for non-blocking transaction execution:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'CompletableFuture resultFuture =\r\n ignite.transactions().runInTransactionAsync(tx ->\r\n ignite.tables().tableAsync("accounts")\r\n .thenCompose(table -> {\r\n RecordView view = table.recordView();\r\n Tuple key = Tuple.create().set("id", 1);\r\n return view.getAsync(tx, key);\r\n })\r\n .thenApply(record -> {\r\n int balance = record.intValue("balance") + 100;\r\n record.set("balance", balance);\r\n return balance;\r\n })\r\n );\r\n\r\nresultFuture.thenAccept(balance ->\r\n System.out.println("New balance: " + balance)\r\n);\n'})}),"\n",(0,i.jsx)(e.h2,{id:"sql-and-transactions",children:"SQL and Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Execute SQL within transactions:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'ignite.transactions().runInTransaction(tx -> {\r\n try (ResultSet rs = ignite.sql().execute(\r\n tx,\r\n "SELECT balance FROM accounts WHERE id = ?",\r\n 1\r\n )) {\r\n SqlRow row = rs.next();\r\n int balance = row.intValue("balance");\r\n\r\n ignite.sql().execute(\r\n tx,\r\n "UPDATE accounts SET balance = ? WHERE id = ?",\r\n balance + 100,\r\n 1\r\n ).close();\r\n }\r\n});\n'})}),"\n",(0,i.jsx)(e.p,{children:"SQL statements and table operations within the same transaction see consistent data."}),"\n",(0,i.jsx)(e.h2,{id:"transaction-status",children:"Transaction Status"}),"\n",(0,i.jsx)(e.p,{children:"Check transaction properties:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'Transaction tx = ignite.transactions().begin();\r\n\r\nboolean readOnly = tx.isReadOnly();\r\nSystem.out.println("Read-only: " + readOnly);\r\n\r\n// Use transaction\r\ntx.commit();\n'})}),"\n",(0,i.jsx)(e.h2,{id:"idempotent-operations",children:"Idempotent Operations"}),"\n",(0,i.jsx)(e.p,{children:"Commit and rollback operations are idempotent:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:"Transaction tx = ignite.transactions().begin();\r\ntry {\r\n // Operations\r\n tx.commit();\r\n} finally {\r\n tx.rollback(); // Safe even if already committed\r\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"Calling commit or rollback on completed transactions has no effect."}),"\n",(0,i.jsx)(e.h2,{id:"error-handling",children:"Error Handling"}),"\n",(0,i.jsx)(e.p,{children:"Handle transaction-specific exceptions:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'try {\r\n ignite.transactions().runInTransaction(tx -> {\r\n // Operations\r\n });\r\n} catch (RetriableTransactionException e) {\r\n // Transaction can be retried\r\n System.err.println("Retry transaction: " + e.getMessage());\r\n} catch (TransactionException e) {\r\n // Transaction error\r\n System.err.println("Transaction failed: " + e.getMessage());\r\n}\n'})}),"\n",(0,i.jsx)(e.p,{children:"RetriableTransactionException indicates conflicts that may succeed on retry. Other TransactionException subtypes indicate non-retriable errors."}),"\n",(0,i.jsx)(e.h2,{id:"exception-types",children:"Exception Types"}),"\n",(0,i.jsx)(e.p,{children:"Common transaction exceptions:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-java",children:'try {\r\n ignite.transactions().runInTransaction(tx -> {\r\n // Operations\r\n });\r\n} catch (IncompatibleSchemaException e) {\r\n // Schema changed during transaction\r\n System.err.println("Schema incompatible: " + e.getMessage());\r\n} catch (MismatchingTransactionOutcomeException e) {\r\n // Inconsistent commit/rollback across replicas\r\n System.err.println("Outcome mismatch: " + e.getMessage());\r\n}\n'})}),"\n",(0,i.jsx)(e.p,{children:"IncompatibleSchemaException occurs when table schemas change during transaction execution. MismatchingTransactionOutcomeException indicates inconsistent transaction outcomes."}),"\n",(0,i.jsx)(e.h2,{id:"reference",children:"Reference"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:["Transaction manager: ",(0,i.jsx)(e.code,{children:"org.apache.ignite.tx.IgniteTransactions"})]}),"\n",(0,i.jsxs)(e.li,{children:["Transaction handle: ",(0,i.jsx)(e.code,{children:"org.apache.ignite.tx.Transaction"})]}),"\n",(0,i.jsxs)(e.li,{children:["Configuration: ",(0,i.jsx)(e.code,{children:"org.apache.ignite.tx.TransactionOptions"})]}),"\n",(0,i.jsxs)(e.li,{children:["Exceptions: ",(0,i.jsx)(e.code,{children:"org.apache.ignite.tx.TransactionException"}),", ",(0,i.jsx)(e.code,{children:"org.apache.ignite.tx.RetriableTransactionException"}),", ",(0,i.jsx)(e.code,{children:"org.apache.ignite.tx.IncompatibleSchemaException"}),", ",(0,i.jsx)(e.code,{children:"org.apache.ignite.tx.MismatchingTransactionOutcomeException"})]}),"\n"]}),"\n",(0,i.jsx)(e.h3,{id:"ignitetransactions-methods",children:"IgniteTransactions Methods"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"Transaction begin()"})," - Start transaction with defaults"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"Transaction begin(TransactionOptions)"})," - Start with configuration"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"CompletableFuture beginAsync()"})," - Async start"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"CompletableFuture beginAsync(TransactionOptions)"})," - Async start with configuration"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"void runInTransaction(Consumer)"})," - Execute in transaction"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:" T runInTransaction(Function)"})," - Execute with return value"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"void runInTransaction(TransactionOptions, Consumer)"})," - Execute with options"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:" T runInTransaction(TransactionOptions, Function)"})," - Execute with options and return"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:" CompletableFuture runInTransactionAsync(Function>)"})," - Async execution"]}),"\n"]}),"\n",(0,i.jsx)(e.h3,{id:"transaction-methods",children:"Transaction Methods"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"void commit()"})," - Commit transaction"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"CompletableFuture commitAsync()"})," - Async commit"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"void rollback()"})," - Rollback transaction"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"CompletableFuture rollbackAsync()"})," - Async rollback"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"boolean isReadOnly()"})," - Check read-only status"]}),"\n"]}),"\n",(0,i.jsx)(e.h3,{id:"transactionoptions-configuration",children:"TransactionOptions Configuration"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"readOnly(boolean)"})," - Set read-only mode"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.code,{children:"timeoutMillis(long)"})," - Set transaction timeout in milliseconds"]}),"\n"]}),"\n",(0,i.jsx)(e.h3,{id:"transaction-isolation",children:"Transaction Isolation"}),"\n",(0,i.jsx)(e.p,{children:"Read-write transactions use SERIALIZABLE isolation. Each transaction acquires locks during the first read or write access and holds the lock until the transaction is committed or rolled back. Changes remain invisible to concurrent transactions until commit. Read-only transactions provide a snapshot view of data without acquiring locks."}),"\n",(0,i.jsx)(e.h3,{id:"transaction-best-practices",children:"Transaction Best Practices"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsx)(e.li,{children:"Use implicit transactions (runInTransaction) for automatic lifecycle management"}),"\n",(0,i.jsx)(e.li,{children:"Configure appropriate timeouts to prevent blocking operations"}),"\n",(0,i.jsx)(e.li,{children:"Use read-only transactions for operations that only read data"}),"\n",(0,i.jsx)(e.li,{children:"Handle RetriableTransactionException by retrying operations"}),"\n",(0,i.jsx)(e.li,{children:"Keep transactions short to minimize lock contention"}),"\n",(0,i.jsx)(e.li,{children:"Avoid user interaction or slow operations within transactions"}),"\n"]})]})}function u(n={}){const{wrapper:e}={...(0,r.R)(),...n.components};return e?(0,i.jsx)(e,{...n,children:(0,i.jsx)(d,{...n})}):d(n)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/e910cb7c.05e3bbd2.js b/docs/ignite3/assets/js/e910cb7c.05e3bbd2.js deleted file mode 100644 index f9fb45ab4d..0000000000 --- a/docs/ignite3/assets/js/e910cb7c.05e3bbd2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8351],{28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>c});var t=o(96540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}},62660:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>s,contentTitle:()=>c,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"configure-and-operate/operations/colocation","title":"Data Colocation","description":"In many cases you may want to store related data on the same node. This way multi-entry queries do not need to pull data from other nodes and are thus executed faster.","source":"@site/docs/configure-and-operate/operations/colocation.md","sourceDirName":"configure-and-operate/operations","slug":"/configure-and-operate/operations/colocation","permalink":"/docs/ignite3/3.1.0/configure-and-operate/operations/colocation","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"colocation","title":"Data Colocation","sidebar_label":"Colocation"},"sidebar":"tutorialSidebar","previous":{"title":"Handle Exceptions","permalink":"/docs/ignite3/3.1.0/configure-and-operate/operations/handle-exceptions"},"next":{"title":"Monitoring","permalink":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/"}}');var a=o(74848),i=o(28453);const r={id:"colocation",title:"Data Colocation",sidebar_label:"Colocation"},c=void 0,s={},d=[{value:"Configuring Colocation Key",id:"configuring-colocation-key",level:2}];function l(e){const n={admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:"In many cases you may want to store related data on the same node. This way multi-entry queries do not need to pull data from other nodes and are thus executed faster."}),"\n",(0,a.jsx)(n.p,{children:"When the table is created, you can choose the key that will be used to colocate data."}),"\n",(0,a.jsxs)(n.p,{children:["For example, if you have ",(0,a.jsx)(n.code,{children:"Person"})," and ",(0,a.jsx)(n.code,{children:"Company"})," objects, and each person has the companyId field that indicates the company the person works for. By specifying the ",(0,a.jsx)(n.code,{children:"Person.companyId"})," and ",(0,a.jsx)(n.code,{children:"Company.ID"})," as colocation keys, you ensure that all the persons working for the same company are stored on the same node, where the company object is stored as well. Queries that request persons working for a specific company are processed on a single node."]}),"\n",(0,a.jsx)(n.h2,{id:"configuring-colocation-key",children:"Configuring Colocation Key"}),"\n",(0,a.jsxs)(n.p,{children:["Data colocation is configured during table creation by using the ",(0,a.jsx)(n.code,{children:"COLOCATE BY"})," clause. The columns used to colocate data must be in the primary key and must be specified in the same order as the ",(0,a.jsx)(n.code,{children:"PRIMARY KEY"})," of the main table."]}),"\n",(0,a.jsxs)(n.p,{children:["For example, the table below will colocate data for people based on the ",(0,a.jsx)(n.code,{children:"city_id"})," column:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE IF NOT EXISTS Person (\r\n id int,\r\n city_id int primary key,\r\n name varchar,\r\n age int,\r\n company varchar\r\n) COLOCATE BY (city_id)\n"})}),"\n",(0,a.jsx)(n.p,{children:"When using composite primary keys, you can specify multiple columns to colocate data by:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE Company (\r\n company_id int,\r\n department_id int,\r\n city_id int,\r\n company_name timestamp,\r\n PRIMARY KEY (company_id, city_id)\r\n)\r\n\r\nCREATE TABLE IF NOT EXISTS Person (\r\n id int,\r\n city_id int,\r\n name varchar,\r\n age int,\r\n company_id int,\r\n PRIMARY KEY (id, company_id, city_id)\r\n)\r\nCOLOCATE BY (company_id, city_id)\n"})}),"\n",(0,a.jsx)(n.p,{children:"In this case, Ignite will try to colocate these tables together for storage."}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"COLOCATE BY"})," clause of colocated table (",(0,a.jsx)(n.code,{children:"Person"})," table in the example above) must contain the same set of columns and in the same order as the ",(0,a.jsx)(n.code,{children:"PRIMARY KEY"})," clause of the main table (Company table in the example above) to colocate the data."]})})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/ea9d2f00.8641ca4b.js b/docs/ignite3/assets/js/ea9d2f00.8641ca4b.js deleted file mode 100644 index 5390d7e6f8..0000000000 --- a/docs/ignite3/assets/js/ea9d2f00.8641ca4b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[4690],{28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var r=t(96540);const o={},i=r.createContext(o);function s(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:n},e.children)}},41453:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"api-reference/native-clients/java/compute-api","title":"Compute API","description":"The Compute API executes custom code on cluster nodes. Applications submit jobs that run on selected nodes and return results. This enables data-local processing, distributed algorithms, and workload distribution across the cluster.","source":"@site/docs/api-reference/native-clients/java/compute-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/compute-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"Compute API","id":"compute-api","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"Transactions API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api"},"next":{"title":"Catalog API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api"}}');var o=t(74848),i=t(28453);const s={title:"Compute API",id:"compute-api",sidebar_position:7},c="Compute API",l={},a=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Job Implementation",id:"job-implementation",level:2},{value:"Job Submission",id:"job-submission",level:2},{value:"Job Targets",id:"job-targets",level:2},{value:"Colocated Execution",id:"colocated-execution",level:2},{value:"Job Context",id:"job-context",level:2},{value:"Job Cancellation",id:"job-cancellation",level:2},{value:"Cancellation Tokens",id:"cancellation-tokens",level:2},{value:"Job Priority",id:"job-priority",level:2},{value:"Job Status",id:"job-status",level:2},{value:"Broadcast Execution",id:"broadcast-execution",level:2},{value:"Broadcast Results Collection",id:"broadcast-results-collection",level:2},{value:"Deployment Units",id:"deployment-units",level:2},{value:"Custom Serialization",id:"custom-serialization",level:2},{value:"Map-Reduce Tasks",id:"map-reduce-tasks",level:2},{value:"Error Handling",id:"error-handling",level:2},{value:"Reference",id:"reference",level:2},{value:"IgniteCompute Methods",id:"ignitecompute-methods",level:3},{value:"JobExecution Methods",id:"jobexecution-methods",level:3},{value:"JobTarget Factory Methods",id:"jobtarget-factory-methods",level:3},{value:"BroadcastJobTarget Factory Methods",id:"broadcastjobtarget-factory-methods",level:3},{value:"JobExecutionContext Methods",id:"jobexecutioncontext-methods",level:3},{value:"BroadcastExecution Methods",id:"broadcastexecution-methods",level:3},{value:"ComputeJob Interface",id:"computejob-interface",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"compute-api",children:"Compute API"})}),"\n",(0,o.jsx)(n.p,{children:"The Compute API executes custom code on cluster nodes. Applications submit jobs that run on selected nodes and return results. This enables data-local processing, distributed algorithms, and workload distribution across the cluster."}),"\n",(0,o.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,o.jsx)(n.p,{children:"Compute jobs implement the ComputeJob interface. Job descriptors identify which class to execute and where to find it. Job targets specify execution location using strategies like specific nodes, any available node, or colocated with table partitions."}),"\n",(0,o.jsx)(n.p,{children:"Jobs execute asynchronously and return JobExecution handles. Use these handles to retrieve results, monitor status, cancel execution, or adjust priority. Broadcast jobs execute on multiple nodes and aggregate results."}),"\n",(0,o.jsx)(n.h2,{id:"job-implementation",children:"Job Implementation"}),"\n",(0,o.jsx)(n.p,{children:"Implement ComputeJob for custom processing:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'public class WordCountJob implements ComputeJob {\r\n @Override\r\n public CompletableFuture executeAsync(\r\n JobExecutionContext context,\r\n String text\r\n ) {\r\n int count = text.split("\\\\s+").length;\r\n return CompletableFuture.completedFuture(count);\r\n }\r\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:"Jobs receive execution context and arguments. Return CompletableFuture for asynchronous processing."}),"\n",(0,o.jsx)(n.h2,{id:"job-submission",children:"Job Submission"}),"\n",(0,o.jsx)(n.p,{children:"Submit jobs with descriptors and targets:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'JobDescriptor descriptor =\r\n JobDescriptor.builder("com.example.WordCountJob").build();\r\n\r\nCompletableFuture> executionFuture =\r\n ignite.compute().submitAsync(\r\n JobTarget.anyNode(ignite.clusterNodes()),\r\n descriptor,\r\n "the quick brown fox"\r\n );\r\n\r\nInteger result = executionFuture\r\n .thenCompose(JobExecution::resultAsync)\r\n .join();\r\n\r\nSystem.out.println("Word count: " + result);\n'})}),"\n",(0,o.jsx)(n.p,{children:"The submitAsync method returns immediately while the job executes on the target node."}),"\n",(0,o.jsx)(n.h2,{id:"job-targets",children:"Job Targets"}),"\n",(0,o.jsx)(n.p,{children:"Target specific execution locations:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:"// Execute on specific node\r\nClusterNode node = ignite.cluster().localNode();\r\nJobTarget target = JobTarget.node(node);\r\n\r\n// Execute on any node from set\r\nCollection nodes = ignite.clusterNodes();\r\nJobTarget target = JobTarget.anyNode(nodes);\r\n\r\n// Execute on all nodes (broadcast)\r\nBroadcastJobTarget target = BroadcastJobTarget.nodes(nodes);\n"})}),"\n",(0,o.jsx)(n.p,{children:"Choose targets based on workload characteristics and data locality requirements."}),"\n",(0,o.jsx)(n.h2,{id:"colocated-execution",children:"Colocated Execution"}),"\n",(0,o.jsx)(n.p,{children:"Execute jobs colocated with data:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'JobDescriptor descriptor =\r\n JobDescriptor.builder("com.example.DataProcessor").build();\r\n\r\nTuple key = Tuple.create().set("id", 100);\r\nQualifiedName tableName = QualifiedName.of("products");\r\n\r\nJobTarget target = JobTarget.colocated(tableName, key, Mapper.of(Tuple.class));\r\n\r\nCompletableFuture> execution =\r\n ignite.compute().submitAsync(target, descriptor, 100);\n'})}),"\n",(0,o.jsx)(n.p,{children:"Colocated execution eliminates network overhead by running jobs on nodes that store the data."}),"\n",(0,o.jsx)(n.h2,{id:"job-context",children:"Job Context"}),"\n",(0,o.jsx)(n.p,{children:"Access cluster resources within jobs:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'public class DataProcessorJob implements ComputeJob {\r\n @Override\r\n public CompletableFuture executeAsync(\r\n JobExecutionContext context,\r\n Integer productId\r\n ) {\r\n Ignite ignite = context.ignite();\r\n Table table = ignite.tables().table("products");\r\n RecordView view = table.recordView();\r\n\r\n Tuple key = Tuple.create().set("id", productId);\r\n Tuple record = view.get(null, key);\r\n\r\n return CompletableFuture.completedFuture(\r\n record.stringValue("name")\r\n );\r\n }\r\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:"JobExecutionContext provides access to the Ignite instance, partition information, deployment units, and cancellation status."}),"\n",(0,o.jsx)(n.h2,{id:"job-cancellation",children:"Job Cancellation"}),"\n",(0,o.jsx)(n.p,{children:"Cancel running jobs using CancellationToken:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'CancelHandle cancelHandle = CancelHandle.create();\r\n\r\nCompletableFuture> executionFuture =\r\n ignite.compute().submitAsync(\r\n target,\r\n descriptor,\r\n input,\r\n cancelHandle.token()\r\n );\r\n\r\n// Cancel the job\r\ncancelHandle.cancel();\r\nSystem.out.println("Cancellation requested");\n'})}),"\n",(0,o.jsx)(n.p,{children:"Cancelled jobs stop execution and release resources. Check cancellation status within job implementation using context.isCancelled()."}),"\n",(0,o.jsx)(n.h2,{id:"cancellation-tokens",children:"Cancellation Tokens"}),"\n",(0,o.jsx)(n.p,{children:"Respond to cancellation within jobs:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'public class CancellableJob implements ComputeJob {\r\n @Override\r\n public CompletableFuture executeAsync(\r\n JobExecutionContext context,\r\n String input\r\n ) {\r\n return CompletableFuture.supplyAsync(() -> {\r\n int count = 0;\r\n for (String word : input.split("\\\\s+")) {\r\n if (context.isCancelled()) {\r\n throw new CancellationException("Job cancelled");\r\n }\r\n count++;\r\n }\r\n return count;\r\n });\r\n }\r\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:"Check cancellation status periodically during long-running operations."}),"\n",(0,o.jsx)(n.h2,{id:"job-priority",children:"Job Priority"}),"\n",(0,o.jsx)(n.p,{children:"Adjust job priority dynamically:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'JobExecution execution = executionFuture.join();\r\n\r\nexecution.changePriorityAsync(10).thenAccept(changed -> {\r\n if (changed) {\r\n System.out.println("Priority updated");\r\n }\r\n});\n'})}),"\n",(0,o.jsx)(n.p,{children:"Higher priority jobs execute before lower priority jobs in the queue."}),"\n",(0,o.jsx)(n.h2,{id:"job-status",children:"Job Status"}),"\n",(0,o.jsx)(n.p,{children:"Monitor job execution status:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'JobExecution execution = executionFuture.join();\r\n\r\nexecution.stateAsync().thenAccept(state -> {\r\n System.out.println("Job state: " + state);\r\n});\r\n\r\nexecution.idAsync().thenAccept(id -> {\r\n System.out.println("Job ID: " + id);\r\n});\n'})}),"\n",(0,o.jsx)(n.p,{children:"Job states include queued, executing, completed, cancelled, and failed."}),"\n",(0,o.jsx)(n.h2,{id:"broadcast-execution",children:"Broadcast Execution"}),"\n",(0,o.jsx)(n.p,{children:"Execute jobs on multiple nodes:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'JobDescriptor descriptor =\r\n JobDescriptor.builder("com.example.MetricsCollector").build();\r\n\r\nCollection nodes = ignite.clusterNodes();\r\n\r\nCompletableFuture> broadcastFuture =\r\n ignite.compute().submitAsync(\r\n BroadcastJobTarget.nodes(nodes),\r\n descriptor,\r\n "collect"\r\n );\r\n\r\nBroadcastExecution broadcast = broadcastFuture.join();\r\n\r\n// Get individual job executions by node\r\nMap> executions = broadcast.executions();\r\n\r\nfor (Map.Entry> entry : executions.entrySet()) {\r\n Integer result = entry.getValue().resultAsync().join();\r\n System.out.println("Node " + entry.getKey().name() + ": " + result);\r\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:"Broadcast execution returns results from all target nodes."}),"\n",(0,o.jsx)(n.h2,{id:"broadcast-results-collection",children:"Broadcast Results Collection"}),"\n",(0,o.jsx)(n.p,{children:"Access all broadcast results asynchronously:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'BroadcastExecution broadcast = broadcastFuture.join();\r\n\r\nCompletableFuture> allResults = broadcast.resultsAsync();\r\n\r\nList values = allResults.join();\r\n\r\nint total = values.stream().mapToInt(Integer::intValue).sum();\r\nSystem.out.println("Total: " + total);\n'})}),"\n",(0,o.jsx)(n.h2,{id:"deployment-units",children:"Deployment Units"}),"\n",(0,o.jsx)(n.p,{children:"Reference jobs from deployment units:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'DeploymentUnit unit = new DeploymentUnit("my-jobs", "1.0.0");\r\n\r\nJobDescriptor descriptor =\r\n JobDescriptor.builder("com.example.CustomJob")\r\n .units(unit)\r\n .build();\r\n\r\nCompletableFuture> execution =\r\n ignite.compute().submitAsync(target, descriptor, "input");\n'})}),"\n",(0,o.jsx)(n.p,{children:"Deployment units enable versioned job deployment and isolation."}),"\n",(0,o.jsx)(n.h2,{id:"custom-serialization",children:"Custom Serialization"}),"\n",(0,o.jsx)(n.p,{children:"Implement custom marshallers for job arguments and results:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:"public class CustomJob implements ComputeJob {\r\n @Override\r\n public CompletableFuture executeAsync(\r\n JobExecutionContext context,\r\n MyData input\r\n ) {\r\n // Process input\r\n return CompletableFuture.completedFuture(new MyResult());\r\n }\r\n\r\n @Override\r\n public Marshaller inputMarshaller() {\r\n return new MyDataMarshaller();\r\n }\r\n\r\n @Override\r\n public Marshaller resultMarshaller() {\r\n return new MyResultMarshaller();\r\n }\r\n}\n"})}),"\n",(0,o.jsx)(n.p,{children:"Custom marshallers control serialization for non-standard types."}),"\n",(0,o.jsx)(n.h2,{id:"map-reduce-tasks",children:"Map-Reduce Tasks"}),"\n",(0,o.jsx)(n.p,{children:"Execute map-reduce computations:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'public class WordCountTask implements MapReduceTask, Map> {\r\n @Override\r\n public String name() {\r\n return "word-count";\r\n }\r\n\r\n @Override\r\n public CompletableFuture>>>\r\n splitAsync(TaskExecutionContext context, String input) {\r\n\r\n List>> jobs = new ArrayList<>();\r\n String[] lines = input.split("\\n");\r\n\r\n for (String line : lines) {\r\n jobs.add(new WordCountJob(line));\r\n }\r\n\r\n return CompletableFuture.completedFuture(jobs);\r\n }\r\n\r\n @Override\r\n public CompletableFuture> reduceAsync(\r\n TaskExecutionContext context,\r\n List> results\r\n ) {\r\n Map combined = new HashMap<>();\r\n for (Map result : results) {\r\n result.forEach((word, count) ->\r\n combined.merge(word, count, Integer::sum)\r\n );\r\n }\r\n return CompletableFuture.completedFuture(combined);\r\n }\r\n}\n'})}),"\n",(0,o.jsx)(n.p,{children:"Submit map-reduce tasks:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'TaskDescriptor> taskDescriptor =\r\n TaskDescriptor.builder(new WordCountTask()).build();\r\n\r\nCompletableFuture>> execution =\r\n ignite.compute().executeMapReduceAsync(\r\n taskDescriptor,\r\n "line one\\nline two\\nline three"\r\n );\r\n\r\nMap wordCounts = execution\r\n .thenCompose(JobExecution::resultAsync)\r\n .join();\n'})}),"\n",(0,o.jsx)(n.h2,{id:"error-handling",children:"Error Handling"}),"\n",(0,o.jsx)(n.p,{children:"Handle compute exceptions:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-java",children:'try {\r\n JobExecution execution = executionFuture.join();\r\n Integer result = execution.resultAsync().join();\r\n} catch (CompletionException e) {\r\n if (e.getCause() instanceof ComputeException) {\r\n System.err.println("Compute error: " + e.getCause().getMessage());\r\n } else if (e.getCause() instanceof NodeNotFoundException) {\r\n System.err.println("Target node not found");\r\n }\r\n}\n'})}),"\n",(0,o.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Compute facade: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.compute.IgniteCompute"})]}),"\n",(0,o.jsxs)(n.li,{children:["Job interface: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.compute.ComputeJob"})]}),"\n",(0,o.jsxs)(n.li,{children:["Job execution: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.compute.JobExecution"})]}),"\n",(0,o.jsxs)(n.li,{children:["Job targeting: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.compute.JobTarget"})]}),"\n",(0,o.jsxs)(n.li,{children:["Job descriptor: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.compute.JobDescriptor"})]}),"\n",(0,o.jsxs)(n.li,{children:["Job context: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.compute.JobExecutionContext"})]}),"\n",(0,o.jsxs)(n.li,{children:["Broadcast execution: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.compute.BroadcastExecution"})]}),"\n",(0,o.jsxs)(n.li,{children:["Map-reduce: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.compute.task.MapReduceTask"})]}),"\n",(0,o.jsxs)(n.li,{children:["Task descriptor: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.compute.task.TaskDescriptor"})]}),"\n",(0,o.jsxs)(n.li,{children:["Deployment: ",(0,o.jsx)(n.code,{children:"org.apache.ignite.deployment.DeploymentUnit"})]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"ignitecompute-methods",children:"IgniteCompute Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:" CompletableFuture> submitAsync(JobTarget, JobDescriptor, T)"})," - Submit job"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:" CompletableFuture> submitAsync(JobTarget, JobDescriptor, T, CancellationToken)"})," - Submit with cancellation"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:" CompletableFuture> submitAsync(BroadcastJobTarget, JobDescriptor, T)"})," - Submit broadcast"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:" CompletableFuture> executeMapReduceAsync(TaskDescriptor, T)"})," - Execute map-reduce"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"jobexecution-methods",children:"JobExecution Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"CompletableFuture resultAsync()"})," - Get job result"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"CompletableFuture stateAsync()"})," - Get job state"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"CompletableFuture idAsync()"})," - Get job ID"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"CompletableFuture changePriorityAsync(int)"})," - Change priority"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"jobtarget-factory-methods",children:"JobTarget Factory Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"static JobTarget node(ClusterNode)"})," - Target specific node"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"static JobTarget anyNode(ClusterNode...)"})," - Target any from set"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"static JobTarget colocated(QualifiedName, Object, Mapper)"})," - Target colocated with data"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"broadcastjobtarget-factory-methods",children:"BroadcastJobTarget Factory Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"static BroadcastJobTarget nodes(Collection)"})," - Target all specified nodes"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"jobexecutioncontext-methods",children:"JobExecutionContext Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Ignite ignite()"})," - Get Ignite instance"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"boolean isCancelled()"})," - Check if job is cancelled"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"int partition()"})," - Get partition number for colocated jobs"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"List deploymentUnits()"})," - Get deployment units"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"broadcastexecution-methods",children:"BroadcastExecution Methods"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Map> executions()"})," - Get job executions by node"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"CompletableFuture> resultsAsync()"})," - Get all results asynchronously"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"computejob-interface",children:"ComputeJob Interface"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"CompletableFuture executeAsync(JobExecutionContext, T)"})," - Execute job"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Marshaller inputMarshaller()"})," - Custom input serialization"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"Marshaller resultMarshaller()"})," - Custom result serialization"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/eb76c95c.3897385f.js b/docs/ignite3/assets/js/eb76c95c.3897385f.js deleted file mode 100644 index ecd5c65da4..0000000000 --- a/docs/ignite3/assets/js/eb76c95c.3897385f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1597],{11470:(e,n,a)=>{a.d(n,{A:()=>j});var t=a(96540),r=a(34164),l=a(17559),s=a(23104),i=a(56347),c=a(205),o=a(57485),u=a(31682),d=a(70679);function h(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:a}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:a,default:t}})=>({value:e,label:n,attributes:a,default:t}))}(a);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,a])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const a=(0,i.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,o.aZ)(r),(0,t.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(a.location.search);n.set(r,e),a.replace({...a.location,search:n.toString()})},[r,a])]}function x(e){const{defaultValue:n,queryString:a=!1,groupId:r}=e,l=p(e),[s,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const a=n.find(e=>e.default)??n[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:l})),[o,u]=g({queryString:a,groupId:r}),[h,x]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[a,r]=(0,d.Dv)(n);return[a,(0,t.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),b=(()=>{const e=o??h;return m({value:e,tabValues:l})?e:null})();(0,c.A)(()=>{b&&i(b)},[b]);return{selectedValue:s,selectValue:(0,t.useCallback)(e=>{if(!m({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),x(e)},[u,x,l]),tabValues:l}}var b=a(92303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var A=a(74848);function T({className:e,block:n,selectedValue:a,selectValue:t,tabValues:l}){const i=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),o=e=>{const n=e.currentTarget,r=i.indexOf(n),s=l[r].value;s!==a&&(c(n),t(s))},u=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const a=i.indexOf(e.currentTarget)+1;n=i[a]??i[0];break}case"ArrowLeft":{const a=i.indexOf(e.currentTarget)-1;n=i[a]??i[i.length-1];break}}n?.focus()};return(0,A.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:t})=>(0,A.jsx)("li",{role:"tab",tabIndex:a===e?0:-1,"aria-selected":a===e,ref:e=>{i.push(e)},onKeyDown:u,onClick:o,...t,className:(0,r.A)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":a===e}),children:n??e},e))})}function E({lazy:e,children:n,selectedValue:a}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===a);return e?(0,t.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,A.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==a}))})}function f(e){const n=x(e);return(0,A.jsxs)("div",{className:(0,r.A)(l.G.tabs.container,"tabs-container",v.tabList),children:[(0,A.jsx)(T,{...n,...e}),(0,A.jsx)(E,{...n,...e})]})}function j(e){const n=(0,b.A)();return(0,A.jsx)(f,{...e,children:h(e.children)},String(n))}},19365:(e,n,a)=>{a.d(n,{A:()=>s});a(96540);var t=a(34164);const r={tabItem:"tabItem_Ymn6"};var l=a(74848);function s({children:e,hidden:n,className:a}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,a),hidden:n,children:e})}},28453:(e,n,a)=>{a.d(n,{R:()=>s,x:()=>i});var t=a(96540);const r={},l=t.createContext(r);function s(e){const n=t.useContext(l);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(l.Provider,{value:n},e.children)}},67089:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>u,contentTitle:()=>o,default:()=>p,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"developers-guide/sql/sql-api","title":"Java SQL API","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/sql/sql-api.md","sourceDirName":"developers-guide/sql","slug":"/developers-guide/sql/sql-api","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/sql-api","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Java SQL API","sidebar_label":"Java SQL API"},"sidebar":"tutorialSidebar","previous":{"title":"Introduction","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine"},"next":{"title":"JDBC Driver","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver"}}');var r=a(74848),l=a(28453),s=a(11470),i=a(19365);const c={title:"Java SQL API",sidebar_label:"Java SQL API"},o=void 0,u={},d=[{value:"Creating Tables",id:"creating-tables",level:2},{value:"Using Sequences",id:"using-sequences",level:3},{value:"Filling Tables",id:"filling-tables",level:2},{value:"Partition-Specific SELECTs",id:"partition-specific-selects",level:2},{value:"Getting Data From Tables",id:"getting-data-from-tables",level:2},{value:"SQL Scripts",id:"sql-scripts",level:2},{value:"Query Cancellation",id:"query-cancellation",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:["\n","\n",(0,r.jsx)(n.p,{children:"In your Java projects, you can use the Java SQL API to execute SQL statements and getting results."}),"\n",(0,r.jsx)(n.h2,{id:"creating-tables",children:"Creating Tables"}),"\n",(0,r.jsx)(n.p,{children:"Here is an example of how you can create a new table on a cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'client.sql().executeScript(\r\n "CREATE TABLE CITIES ("\r\n + "ID INT PRIMARY KEY,"\r\n + "NAME VARCHAR);"\r\n\r\n + "CREATE TABLE ACCOUNTS ("\r\n + " ACCOUNT_ID INT PRIMARY KEY,"\r\n + " CITY_ID INT,"\r\n + " FIRST_NAME VARCHAR,"\r\n + " LAST_NAME VARCHAR,"\r\n + " BALANCE DOUBLE)"\r\n);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"using-sequences",children:"Using Sequences"}),"\n",(0,r.jsx)(n.p,{children:"When creating a table, you can designate the primary key column to be filled automatically from the sequence the values for your primary key by using sql sequences:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'client.sql().execute(null, "CREATE SEQUENCE IF NOT EXISTS defaultSequence;");\r\nclient.sql().execute(null, "CREATE TABLE IF NOT EXISTS Person (ID BIGINT DEFAULT NEXTVAL(\'defaultSequence\') PRIMARY KEY, "\r\n + "CITY_ID BIGINT, "\r\n + "NAME VARCHAR, "\r\n + "AGE INT, "\r\n + "COMPANY VARCHAR);");\r\n\r\n\r\nclient.sql().execute(null,\r\n "INSERT INTO Person (CITY_ID, NAME, AGE, COMPANY) VALUES " +\r\n "(1, \'Alice\', 30, \'Google\'), " +\r\n "(2, \'Bob\', 40, \'Meta\'), " +\r\n "(3, \'Charlie\', 25, \'Spotify\')");\n'})}),"\n",(0,r.jsx)(n.h2,{id:"filling-tables",children:"Filling Tables"}),"\n",(0,r.jsxs)(n.p,{children:["With Apache Ignite 3, you can fill the table by adding rows one by one, or in a batch. In both cases, you create an ",(0,r.jsx)(n.code,{children:"INSERT"})," statement, and then execute it:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'rowsAdded = Arrays.stream(client.sql().executeBatch(tx,\r\n "INSERT INTO ACCOUNTS (ACCOUNT_ID, CITY_ID, FIRST_NAME, LAST_NAME, BALANCE) values (?, ?, ?, ?, ?)",\r\n BatchedArguments.of(1, 1, "John", "Doe", 1000.0d)\r\n .add(2, 1, "Jane", "Roe", 2000.0d)\r\n .add(3, 2, "Mary", "Major", 1500.0d)\r\n .add(4, 3, "Richard", "Miles", 1450.0d)))\r\n .sum();\r\n\r\nSystem.out.println("\\nAdded accounts: " + rowsAdded);\n'})}),"\n",(0,r.jsx)(n.h2,{id:"partition-specific-selects",children:"Partition-Specific SELECTs"}),"\n",(0,r.jsxs)(n.p,{children:["When executing a SELECT operation, you can use the system ",(0,r.jsx)(n.code,{children:"__part"})," column to only ",(0,r.jsx)(n.code,{children:"SELECT"})," data in a specific partition. To find out partition information, use the SELECT request that explicitly includes the ",(0,r.jsx)(n.code,{children:"__part"})," column as its part:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:'SELECT city_id, id, "__part" FROM Person;\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Once you know the partition, you can use it in the ",(0,r.jsx)(n.code,{children:"WHERE"})," clause:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sql",children:'SELECT city_id, id FROM Person WHERE "__part"=23;\n'})}),"\n",(0,r.jsx)(n.h2,{id:"getting-data-from-tables",children:"Getting Data From Tables"}),"\n",(0,r.jsxs)(n.p,{children:["To get data from a table, execute the ",(0,r.jsx)(n.code,{children:"SELECT"})," statement to get a set of results. SqlRow can provide access to column values by column name or column index. You can then iterate through results to get data."]}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Always close the ",(0,r.jsx)(n.code,{children:"ResultSet"}),", either by using a ",(0,r.jsx)(n.code,{children:"try-with-resources"})," statement or by calling its ",(0,r.jsx)(n.code,{children:"close()"})," method directly."]})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (ResultSet rs = client.sql().execute(null,\r\n "SELECT a.FIRST_NAME, a.LAST_NAME, c.NAME FROM ACCOUNTS a "\r\n + "INNER JOIN CITIES c on c.ID = a.CITY_ID ORDER BY a.ACCOUNT_ID")) {\r\n while (rs.hasNext()) {\r\n SqlRow row = rs.next();\r\n\r\n System.out.println(" "\r\n + row.stringValue(0) + ", "\r\n + row.stringValue(1) + ", "\r\n + row.stringValue(2));\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"sql-scripts",children:"SQL Scripts"}),"\n",(0,r.jsxs)(n.p,{children:["The default API executes SQL statements one at a time. For large SQL statements, pass them to the ",(0,r.jsx)(n.code,{children:"executeScript()"})," method. The statements will be batched together similar to using ",(0,r.jsx)(n.code,{children:"SET STREAMING"})," command in Apache Ignite 2, significantly improving performance when executing a large number of queries at once. These statements will be executed in order."]}),"\n",(0,r.jsx)(s.A,{children:(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"String script = \"CREATE TABLE IF NOT EXISTS Person (id int primary key, name varchar, age int default 0);\"\r\n + \"INSERT INTO Person (id, name, age) VALUES ('1', 'John', '46');\";\r\nclient.sql().executeScript(script);\n"})})})}),"\n",(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsx)(n.p,{children:"Execution of each statement is considered complete when the first page is ready to be returned. As a result, when working with large data sets, SELECT statement may be affected by later statements in the same script."})}),"\n",(0,r.jsx)(n.h3,{id:"query-cancellation",children:"Query Cancellation"}),"\n",(0,r.jsx)(n.p,{children:"To cancel a query, create and pass the cancellation token to the execution method:"}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'CancelHandle cancelHandle = CancelHandle.create();\r\nCancellationToken cancelToken = cancelHandle.token();\r\n\r\nclient.sql().executeAsync(\r\n null, cancelToken,\r\n "SELECT a.FIRST_NAME, b.LAST_NAME " +\r\n "FROM ACCOUNTS a, ACCOUNTS b, ACCOUNTS c ORDER BY a.ACCOUNT_ID"\r\n);\n'})})}),(0,r.jsx)(i.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:'std::shared_ptr handle = cancel_handle::create();\r\nstd::shared_ptr token = handle->get_token();\r\n\r\nclient.get_sql().execute(nullptr, token.get(), "CREATE TABLE IF NOT EXISTS Person (id int primary key, name varchar, age int);", {});\n'})})})]}),"\n",(0,r.jsxs)(n.p,{children:["After the query is submitted, you can cancel all queries that use the tokens from the same ",(0,r.jsx)(n.code,{children:"cancelHandle"})," object at any point by using the ",(0,r.jsx)(n.code,{children:"cancel()"})," or ",(0,r.jsx)(n.code,{children:"cancelAsync()"})," methods, for example:"]}),"\n",(0,r.jsxs)(s.A,{children:[(0,r.jsx)(i.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'CompletableFuture cancelled = cancelHandle.cancelAsync();\r\ncancelled.get(5, TimeUnit.SECONDS);\r\n\r\nSystem.out.println("\\nIs query cancelled: " + cancelled.isDone());\n'})})}),(0,r.jsx)(i.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-csharp",children:'var cts = new CancellationTokenSource();\r\nawait using var resultSet = await Client.Sql.ExecuteAsync(null, "CREATE TABLE IF NOT EXISTS Person (id int primary key)", cts.Token);\r\nawait cts.CancelAsync();\n'})})}),(0,r.jsx)(i.A,{value:"cpp",label:"C++",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-cpp",children:"handle->cancel_async(ignite_result cancellationResult) {\r\n// Handle cancellationResult here\r\n});\n"})})})]}),"\n",(0,r.jsxs)(n.p,{children:["Another way to cancel queries is by using the SQL ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/operational-commands#kill-query",children:"KILL QUERY"})," command. The query id can be retrieved via the ",(0,r.jsx)(n.code,{children:"SQL_QUERIES"})," ",(0,r.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views",children:"system view"}),"."]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/ede2c0d3.a87c16c3.js b/docs/ignite3/assets/js/ede2c0d3.a87c16c3.js deleted file mode 100644 index c40a89842e..0000000000 --- a/docs/ignite3/assets/js/ede2c0d3.a87c16c3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6527],{28453:(e,n,t)=>{t.d(n,{R:()=>d,x:()=>l});var i=t(96540);const s={},r=i.createContext(s);function d(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),i.createElement(r.Provider,{value:n},e.children)}},38127:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/partitionawareness02-41c06c7cc3fe8dc603a94aa65e0a8736.png"},98366:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>d,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"developers-guide/clients/index","title":"Ignite Clients","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/clients/index.md","sourceDirName":"developers-guide/clients","slug":"/developers-guide/clients/","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Ignite Clients","sidebar_label":"Overview"},"sidebar":"tutorialSidebar","previous":{"title":"Table API","permalink":"/docs/ignite3/3.0.0/developers-guide/table-api"},"next":{"title":"Overview","permalink":"/docs/ignite3/3.0.0/developers-guide/clients/"}}');var s=t(74848),r=t(28453);const d={title:"Ignite Clients",sidebar_label:"Overview"},l=void 0,c={},o=[{value:"Client Connector Configuration",id:"client-connector-configuration",level:2},{value:"Client Connection",id:"client-connection",level:2},{value:"Partition Awareness",id:"partition-awareness",level:2},{value:"Limitations",id:"limitations",level:3},{value:"How to Check if Partition Awareness is Applicable",id:"how-to-check-if-partition-awareness-is-applicable",level:3},{value:"Examples",id:"examples",level:3},{value:"Client Features",id:"client-features",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n",(0,s.jsx)(n.p,{children:"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike in Ignite 2.x, there are no separate Thin and Thick clients in Ignite 3. All clients are 'thin'."}),"\n",(0,s.jsx)(n.p,{children:"Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations."}),"\n",(0,s.jsx)(n.h2,{id:"client-connector-configuration",children:"Client Connector Configuration"}),"\n",(0,s.jsxs)(n.p,{children:["Client connection parameters are controlled by the client connector configuration. By default, Ignite accepts client connections on port 10800. You can change the configuration for the node by using the ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/ignite-cli-tool",children:"CLI tool"})," at any time."]}),"\n",(0,s.jsxs)(n.p,{children:['In Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,s.jsx)(n.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node. Here is what the client connector configuration looks like:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "clientConnector" : {\r\n "connectTimeoutMillis" : 5000,\r\n "idleTimeoutMillis" : 0,\r\n "listenAddresses" : "",\r\n "metricsEnabled" : false,\r\n "name" : "client_1",\r\n "port" : 10800,\r\n "sendServerExceptionStackTraceToClient" : false,\r\n "ssl" : {\r\n "ciphers" : "",\r\n "clientAuth" : "none",\r\n "enabled" : false,\r\n "keyStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n },\r\n "trustStore" : {\r\n "password" : "********",\r\n "path" : "",\r\n "type" : "PKCS12"\r\n }\r\n }\r\n }\r\n }\r\n}\n'})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Property"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"}),(0,s.jsx)(n.th,{children:"Changeable"}),(0,s.jsx)(n.th,{children:"Requires Restart"}),(0,s.jsx)(n.th,{children:"Acceptable Values"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"connectTimeoutMillis"}),(0,s.jsx)(n.td,{children:"5000"}),(0,s.jsx)(n.td,{children:"Connection attempt timeout, in milliseconds."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"0 - inf"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"idleTimeoutMillis"}),(0,s.jsx)(n.td,{children:"0"}),(0,s.jsx)(n.td,{children:"How long the client can be idle before the connection is dropped, in milliseconds. By default, there is no limit (0)."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"0-2147483647"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"listenAddresses"}),(0,s.jsx)(n.td,{children:'""'}),(0,s.jsx)(n.td,{children:"Address (IP or hostname) to listen on. Listens on all interfaces if empty."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Valid IP address or host name"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"metricsEnabled"}),(0,s.jsx)(n.td,{children:"false"}),(0,s.jsx)(n.td,{children:"Defines if client metrics are collected."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"true, false"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"name"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"client_{number}"})}),(0,s.jsx)(n.td,{children:"Defines the unique client name. If not specified, generated automatically based on client number."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"A valid string"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"port"}),(0,s.jsx)(n.td,{children:"10800"}),(0,s.jsx)(n.td,{children:"The port the client connector will be listening to."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"1024-65535"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"sendServerExceptionStackTraceToClient"}),(0,s.jsx)(n.td,{children:"false"}),(0,s.jsxs)(n.td,{children:["By default, only the exception message and code are sent back to the client.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),"Set this property to true to include the full stack trace, which will appear as part of the client-side exception.",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),(0,s.jsx)(n.strong,{children:"Note:"})," Not recommended for production: stack trace disclosure is a ",(0,s.jsx)(n.a,{href:"https://owasp.org/www-community/Improper_Error_Handling",children:"security weakness"}),"."]}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"true, false"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.ciphers"}),(0,s.jsx)(n.td,{children:'""'}),(0,s.jsx)(n.td,{children:"List of ciphers to enable, comma-separated. Empty for automatic cipher selection."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"TLS_AES_256_GCM_SHA384, etc. (standard cipher ids)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.clientAuth"}),(0,s.jsx)(n.td,{children:"none"}),(0,s.jsx)(n.td,{children:"Whether the SSL client authentication is enabled and whether it is mandatory."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"none, optional, require"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.enabled"}),(0,s.jsx)(n.td,{children:"false"}),(0,s.jsx)(n.td,{children:"Defines if SSL is enabled."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"true, false"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.keyStore.password"}),(0,s.jsx)(n.td,{children:"********"}),(0,s.jsx)(n.td,{children:"SSL keystore password."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"A valid password"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.keyStore.path"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Path to the SSL keystore."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"A valid path"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.keyStore.type"}),(0,s.jsx)(n.td,{children:"PKCS12"}),(0,s.jsx)(n.td,{children:"Keystore type."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"PKCS12, JKS"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.trustStore.password"}),(0,s.jsx)(n.td,{children:"********"}),(0,s.jsx)(n.td,{children:"Truststore password."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"A valid password"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.trustStore.path"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Path to the truststore."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"A valid path"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ssl.trustStore.type"}),(0,s.jsx)(n.td,{children:"PKCS12"}),(0,s.jsx)(n.td,{children:"Truststore type."}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"Yes"}),(0,s.jsx)(n.td,{children:"PKCS12, JKS"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"Here is how you can change the parameters:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"node config update clientConnector.port=10469\n"})}),"\n",(0,s.jsx)(n.h2,{id:"client-connection",children:"Client Connection"}),"\n",(0,s.jsxs)(n.p,{children:["When Ignite client is starting (when the ",(0,s.jsx)(n.code,{children:"build()"})," or ",(0,s.jsx)(n.code,{children:"buildAsync()"})," method is called), it tries to connect to all configured endpoints one by one in the specified order, and returns as soon as one connection is established. If the client fails to connect to any nodes, the initialization fails."]}),"\n",(0,s.jsx)(n.p,{children:"Once the client connects to the cluster, it keeps attempting to connect to all other specified nodes in the background, and uses them as failover in case the connection to the primary node is interrupted. Client does not directly connect to nodes not specified in its configuration, but is aware of them through cluster topology and can send indirect write or read requests."}),"\n",(0,s.jsxs)(n.p,{children:["An inactive client sends periodic heartbeat messages to the cluster to confirm that it is still active and running. If no heartbeat messages are received for the duration specified in the ",(0,s.jsx)(n.code,{children:"idleTimeoutMillis"})," configuration, the client will be disconnected. By default, the heartbeat interval is equal to half the idle timeout or 30 seconds, whichever is shorter."]}),"\n",(0,s.jsx)(n.h2,{id:"partition-awareness",children:"Partition Awareness"}),"\n",(0,s.jsx)(n.p,{children:"As data in the cluster is distributed between the nodes, the client can improve throughput by immediately sending updates and read requests to target nodes holding the data."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Partition Awareness",src:t(38127).A+"",width:"862",height:"468"})}),"\n",(0,s.jsx)(n.p,{children:"For each key that needs updating, the client will get the name of the node holding its primary partition and then send an update directly to this node. If there is an active connection to this node, the update will be sent directly to it. Otherwise, the update will be sent to a random node on the list to be redirected to the target node. As such, it is recommended to list all cluster nodes in client configuration to reduce unnecessary network load."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Partition awareness assumes that the cluster is stable. Client receives information about cluster data assignments in the background, and it may be outdated by the time an update is sent. If it is, nodes will automatically redirect requests to correct nodes until data on the client is updated."})}),"\n",(0,s.jsx)(n.h3,{id:"limitations",children:"Limitations"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Apache Ignite can only apply partition awareness optimization for queries over single partition of a single table."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["DML queries, which ",(0,s.jsx)(n.strong,{children:"cannot"})," be rewritten to key-value operations, are not supported yet.",(0,s.jsx)("br",{}),"\r\nApache Ignite can execute a query as key-value operation only if the query contains an equality condition on all key columns.\r\nPartition awareness will only work for DML queries if the query can be rewritten to a single key-value operation. The explain plan will contains ",(0,s.jsx)(n.code,{children:"KeyValueGet"})," or ",(0,s.jsx)(n.code,{children:"KeyValueModify"})," node in that case.\r\nBulk DML operations (like ",(0,s.jsx)(n.code,{children:"INSERT FROM SELECT"})," or multi-value ",(0,s.jsx)(n.code,{children:"INSERT FROM VALUES"}),") are not supported yet."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Equality condition on colocation key columns is required.",(0,s.jsx)("br",{}),"\r\nApache Ignite can only apply partition awareness optimization if the SQL query contains an equality condition on all colocated columns. This requirement allows the client to route the query to the node where the partition with the data resides."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Partition awareness cache on client may miss required metadata.",(0,s.jsx)("br",{}),"\r\nClient nodes do not parse or execute queries by themselves, they require query metadata with colocation information from the server node to utilize partition awareness optimization. The query metadata is cached on client after the first query execution and can be used in later query runs. However, it also can be evicted due to cache eviction policies.",(0,s.jsx)("br",{}),"\r\nSee ",(0,s.jsx)(n.code,{children:"org.apache.ignite.client.IgniteClient.Builder#sqlPartitionAwarenessMetadataCacheSize()"})," for more information."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"how-to-check-if-partition-awareness-is-applicable",children:"How to Check if Partition Awareness is Applicable"}),"\n",(0,s.jsx)(n.p,{children:"You can verify whether partition awareness is used for a given SQL query by inspecting the EXPLAIN command results."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The resulting plan should contain a ",(0,s.jsx)(n.code,{children:"TableScan"})," node with equality conditions on all colocation columns of the table:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"TableScan\r\n table: PUBLIC.T\r\n predicate: AND(=(COLOCATION_COL_1, ?), =(COLOCATION_COL_2, ?))\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["or a similar ",(0,s.jsx)(n.code,{children:"IndexScan"})," where the search bound has a prefix of all the colocation columns:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"IndexScan\r\n table: PUBLIC.T\r\n predicate: AND(=(COLOCATION_COL_1, ?), =(COLOCATION_COL_2, ?))\r\n searchBounds: [ExactBounds [bound=?], ExactBounds [bound=?]]\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["or ",(0,s.jsx)(n.code,{children:"KeyValueGet"})," node:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"KeyValueGet\r\n table: PUBLIC.T\r\n key: [?0]\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["or ",(0,s.jsx)(n.code,{children:"KeyValueModify"})," node:"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"KeyValueModify\r\n table: PUBLIC.T\r\n key: [?0]\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Apache Ignite supports both literals and dynamic parameters in equality conditions for partition awareness purposes."})}),"\n",(0,s.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,s.jsxs)(n.p,{children:["Assuming a table ",(0,s.jsx)(n.code,{children:"T"})," is defined as:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE T (\r\n id INT NOT NULL,\r\n region_id INT NOT NULL,\r\n customer_id INT NOT NULL,\r\n val VARCHAR,\r\n PRIMARY KEY (id, region_id, customer_id)\r\n) COLOCATE BY (region_id, customer_id);\n"})}),"\n",(0,s.jsx)(n.p,{children:"The following queries can utilize partition awareness optimization:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"SELECT * FROM T WHERE region_id =? AND customer_id = ?\r\n\r\nDELETE FROM T\r\nWHERE id = ? AND region_id = ? AND customer_id = ?;\r\n\r\nINSERT INTO T (id, region_id, customer_id, val)\r\nVALUES (?, ?, ?, ?);\n"})}),"\n",(0,s.jsx)(n.p,{children:"While these queries will not utilize partition awareness:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"// Missing condition for colocation column `customer_id`.\r\nSELECT * FROM T WHERE region_id =?\r\n\r\n// Non-equality condition on colocation column.\r\nSELECT * FROM T WHERE region_id = ? AND customer_id > ?\n"})}),"\n",(0,s.jsx)(n.p,{children:"In more complex cases (nested queries, IN condition, JOINS), partition awareness is not guaranteed to work. It depends on whether the query can be rewritten in a form which contains sufficient information to locate the data."}),"\n",(0,s.jsx)(n.h2,{id:"client-features",children:"Client Features"}),"\n",(0,s.jsx)(n.p,{children:"The following table outlines features supported by each client."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Feature"}),(0,s.jsx)(n.th,{children:"Java"}),(0,s.jsx)(n.th,{children:".NET"}),(0,s.jsx)(n.th,{children:"C++"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Record Binary View"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Key-Value Binary View"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Record View"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Key-Value View"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"SQL API"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Partition Awareness"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"No"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Transactions"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Compute API"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Retry Policy"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"No"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Heartbeats"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Data Streamer"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"yes"}),(0,s.jsx)(n.td,{children:"No"})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/ee0a6a95.2848d885.js b/docs/ignite3/assets/js/ee0a6a95.2848d885.js deleted file mode 100644 index 8048c3efcf..0000000000 --- a/docs/ignite3/assets/js/ee0a6a95.2848d885.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5641],{11470:(e,n,t)=>{t.d(n,{A:()=>T});var i=t(96540),r=t(34164),a=t(17559),s=t(23104),l=t(56347),c=t(205),o=t(57485),d=t(31682),u=t(70679);function h(e){return i.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,i.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function j(e){const{values:n,children:t}=e;return(0,i.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:i}})=>({value:e,label:n,attributes:t,default:i}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const t=(0,l.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,o.aZ)(r),(0,i.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,a=j(e),[s,l]=(0,i.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a})),[o,d]=x({queryString:t,groupId:r}),[h,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,u.Dv)(n);return[t,(0,i.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),v=(()=>{const e=o??h;return g({value:e,tabValues:a})?e:null})();(0,c.A)(()=>{v&&l(v)},[v]);return{selectedValue:s,selectValue:(0,i.useCallback)(e=>{if(!g({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),m(e)},[d,m,a]),tabValues:a}}var v=t(92303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var p=t(74848);function f({className:e,block:n,selectedValue:t,selectValue:i,tabValues:a}){const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),o=e=>{const n=e.currentTarget,r=l.indexOf(n),s=a[r].value;s!==t&&(c(n),i(s))},d=e=>{let n=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,p.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:a.map(({value:e,label:n,attributes:i})=>(0,p.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:o,...i,className:(0,r.A)("tabs__item",b.tabItem,i?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:t}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===t);return e?(0,i.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,p.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,i.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function I(e){const n=m(e);return(0,p.jsxs)("div",{className:(0,r.A)(a.G.tabs.container,"tabs-container",b.tabList),children:[(0,p.jsx)(f,{...n,...e}),(0,p.jsx)(y,{...n,...e})]})}function T(e){const n=(0,v.A)();return(0,p.jsx)(I,{...e,children:h(e.children)},String(n))}},19365:(e,n,t)=>{t.d(n,{A:()=>s});t(96540);var i=t(34164);const r={tabItem:"tabItem_Ymn6"};var a=t(74848);function s({children:e,hidden:n,className:t}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,i.A)(r.tabItem,t),hidden:n,children:e})}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var i=t(96540);const r={},a=i.createContext(r);function s(e){const n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(a.Provider,{value:n},e.children)}},91922:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>j,frontMatter:()=>c,metadata:()=>i,toc:()=>u});const i=JSON.parse('{"id":"develop/ignite-clients/java-client","title":"Java Client","description":"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there are no separate Thin and Thick clients in Ignite 3. All clients are \'thin\'.","source":"@site/docs/develop/ignite-clients/java.md","sourceDirName":"develop/ignite-clients","slug":"/develop/ignite-clients/java-client","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/java-client","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"id":"java-client","title":"Java Client","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Ignite Clients","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/"},"next":{"title":".NET Client","permalink":"/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client"}}');var r=t(74848),a=t(28453),s=t(11470),l=t(19365);const c={id:"java-client",title:"Java Client",sidebar_position:1},o=void 0,d={},u=[{value:"Getting Started",id:"getting-started",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Installation",id:"installation",level:3},{value:"Connecting to Cluster",id:"connecting-to-cluster",level:2},{value:"Authentication",id:"authentication",level:2},{value:"Logging",id:"logging",level:2},{value:"Client Metrics",id:"client-metrics",level:2},{value:"Java",id:"java",level:3},{value:"Available Java Metrics",id:"available-java-metrics",level:4},{value:"Client Connection Configuration",id:"client-connection-configuration",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there are no separate Thin and Thick clients in Ignite 3. All clients are 'thin'."}),"\n",(0,r.jsx)(n.p,{children:"Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations."}),"\n",(0,r.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,r.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"To use Java thin client, Java 11 or newer is required."}),"\n",(0,r.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.p,{children:"Java client can be added to your project by using maven:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:"\r\n org.apache.ignite\r\n ignite-client\r\n 3.0.0\r\n\n"})}),"\n",(0,r.jsx)(n.h2,{id:"connecting-to-cluster",children:"Connecting to Cluster"}),"\n",(0,r.jsxs)(n.p,{children:["To initialize a client, use the ",(0,r.jsx)(n.code,{children:"IgniteClient"})," class, and provide it with the configuration:"]}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'try (IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .build()\r\n) {\r\n // Your code goes here\r\n}\n'})})})}),"\n",(0,r.jsx)(n.h2,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsxs)(n.p,{children:["To pass ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-authentication",children:"authentication"})," information, use the ",(0,r.jsx)(n.code,{children:"IgniteClientAuthenticator"})," class and pass it to ",(0,r.jsx)(n.code,{children:"IgniteClient"})," builder:"]}),"\n",(0,r.jsx)(s.A,{groupId:"languages",children:(0,r.jsx)(l.A,{value:"java",label:"Java",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClientAuthenticator auth = BasicAuthenticator.builder().username("myUser").password("myPassword").build();\r\nIgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .authenticator(auth)\r\n .build();\n'})})})}),"\n",(0,r.jsx)(n.h2,{id:"logging",children:"Logging"}),"\n",(0,r.jsxs)(n.p,{children:["To configure client logging, add ",(0,r.jsx)(n.code,{children:"loggerFactory"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1")\r\n .loggerFactory(System::getLogger) // Optional: this is the default\r\n .build();\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The client logs connection errors, reconnects, and retries. By default, logging routes to ",(0,r.jsx)(n.code,{children:"java.util.logging"})," (JUL) at INFO level."]}),"\n",(0,r.jsxs)(n.p,{children:["For detailed configuration with Logback, Log4j2, or JUL, see ",(0,r.jsx)(n.a,{href:"../work-with-data/java-client-logging",children:"Java Client Logging"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"client-metrics",children:"Client Metrics"}),"\n",(0,r.jsx)(n.h3,{id:"java",children:"Java"}),"\n",(0,r.jsx)(n.p,{children:"When running Java client, you need to enable metrics in the client builder:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .metricsEnabled(true)\r\n .build();\n'})}),"\n",(0,r.jsxs)(n.p,{children:["After that, client metrics will be available to any Java monitoring tool, for example ",(0,r.jsx)(n.a,{href:"https://www.oracle.com/java/technologies/jdk-mission-control.html",children:"JDK Mission Control"}),"."]}),"\n",(0,r.jsx)(n.h4,{id:"available-java-metrics",children:"Available Java Metrics"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Metric name"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ConnectionsActive"}),(0,r.jsx)(n.td,{children:"The number of currently active connections."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ConnectionsEstablished"}),(0,r.jsx)(n.td,{children:"The number of established connections."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ConnectionsLost"}),(0,r.jsx)(n.td,{children:"The number of connections lost."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ConnectionsLostTimeout"}),(0,r.jsx)(n.td,{children:"The number of connections lost due to a timeout."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"HandshakesFailed"}),(0,r.jsx)(n.td,{children:"The number of failed handshakes."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"HandshakesFailedTimeout"}),(0,r.jsx)(n.td,{children:"The number of handshakes that failed due to a timeout."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsActive"}),(0,r.jsx)(n.td,{children:"The number of currently active requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsSent"}),(0,r.jsx)(n.td,{children:"The number of requests sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsCompleted"}),(0,r.jsx)(n.td,{children:"The number of completed requests. Requests are completed once a response is received."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsRetried"}),(0,r.jsx)(n.td,{children:"The number of request retries."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"RequestsFailed"}),(0,r.jsx)(n.td,{children:"The number of failed requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"BytesSent"}),(0,r.jsx)(n.td,{children:"The amount of bytes sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"BytesReceived"}),(0,r.jsx)(n.td,{children:"The amount of bytes received."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"StreamerBatchesSent"}),(0,r.jsx)(n.td,{children:"The number of data streamer batches sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"StreamerItemsSent"}),(0,r.jsx)(n.td,{children:"The number of data streamer items sent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"StreamerBatchesActive"}),(0,r.jsx)(n.td,{children:"The number of in-flight data streamer batches."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"StreamerItemsQueued"}),(0,r.jsx)(n.td,{children:"The number of queued data streamer items."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"client-connection-configuration",children:"Client Connection Configuration"}),"\n",(0,r.jsx)(n.p,{children:"There is a number of configuration properties managing the connection between the client and Ignite cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("127.0.0.1:10800")\r\n .connectTimeout(5000)\r\n .heartbeatInterval(30000)\r\n .heartbeatTimeout(5000)\r\n .operationTimeout(3000)\r\n .backgroundReconnectInterval(30000)\r\n .retryPolicy(new RetryLimitPolicy().retryLimit(8))\r\n .build();\n'})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Configuration name"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"connectTimeout"}),(0,r.jsx)(n.td,{children:"Client connection timeout, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"heartbeatInterval"}),(0,r.jsx)(n.td,{children:"Heartbeat message interval, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"heartbeatTimeout"}),(0,r.jsx)(n.td,{children:"Heartbeat message timeout, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"operationTimeout"}),(0,r.jsx)(n.td,{children:"Operation timeout, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"backgroundReconnectInterval"}),(0,r.jsx)(n.td,{children:"Background reconnect interval, in milliseconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"retryPolicy"}),(0,r.jsx)(n.td,{children:"Retry policy. By default, all read operations are retried up to 16 times, and write operations are not retried."})]})]})]})]})}function j(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/ee8364d1.3d752467.js b/docs/ignite3/assets/js/ee8364d1.3d752467.js deleted file mode 100644 index d94b68b416..0000000000 --- a/docs/ignite3/assets/js/ee8364d1.3d752467.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3149],{28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>d});var r=i(96540);const s={},l=r.createContext(s);function o(e){const n=r.useContext(l);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(l.Provider,{value:n},e.children)}},45659:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"developers-guide/sql/odbc/odbc-driver","title":"ODBC Driver","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/sql/odbc/odbc-driver.md","sourceDirName":"developers-guide/sql/odbc","slug":"/developers-guide/sql/odbc/odbc-driver","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"ODBC Driver","sidebar_label":"ODBC Driver"},"sidebar":"tutorialSidebar","previous":{"title":"System Views","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/system-views"},"next":{"title":"ODBC Driver","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver"}}');var s=i(74848),l=i(28453);const o={title:"ODBC Driver",sidebar_label:"ODBC Driver"},d=void 0,t={},c=[{value:"Overview",id:"overview",level:2},{value:"Installing ODBC Driver",id:"installing-odbc-driver",level:2},{value:"Installing on Windows",id:"installing-on-windows",level:3},{value:"Prerequisites",id:"prerequisites",level:4},{value:"Installation process",id:"installation-process",level:4},{value:"Configuring the Cluster",id:"configuring-the-cluster",level:3},{value:"Installing on Linux",id:"installing-on-linux",level:3},{value:"Prerequisites",id:"prerequisites-1",level:4},{value:"Download from website",id:"download-from-website",level:4},{value:"Supported Data Types",id:"supported-data-types",level:2},{value:"Using pyodbc",id:"using-pyodbc",level:2}];function a(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:["\n",(0,s.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsxs)(n.p,{children:["Ignite 3 includes an ODBC driver that allows you both to select and to modify data stored in a distributed cache by using standard SQL queries and native ODBC API. ODBC driver uses your ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/clients/",children:"client connection configuration"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"ODBC driver only provides thread-safety at the connections level. This means that you should not access the same connection from multiple threads without additional synchronization, though you can create separate connections for every thread and use them simultaneously."}),"\n",(0,s.jsxs)(n.p,{children:["The ODBC driver implements version 3.8 of the ODBC API. For detailed information on ODBC please refer to ",(0,s.jsx)(n.a,{href:"https://msdn.microsoft.com/en-us/library/ms714177.aspx",children:"ODBC Programmer's Reference"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"installing-odbc-driver",children:"Installing ODBC Driver"}),"\n",(0,s.jsx)(n.p,{children:"To use ODBC driver, register it in your system so that your ODBC Driver Manager will be able to locate it."}),"\n",(0,s.jsx)(n.h3,{id:"installing-on-windows",children:"Installing on Windows"}),"\n",(0,s.jsx)(n.h4,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsx)(n.p,{children:"Microsoft Visual C++ 2017 Redistributable Package should be installed first."}),"\n",(0,s.jsx)(n.h4,{id:"installation-process",children:"Installation process"}),"\n",(0,s.jsx)(n.p,{children:"Launch the provided installer and follow the instructions."}),"\n",(0,s.jsx)(n.h3,{id:"configuring-the-cluster",children:"Configuring the Cluster"}),"\n",(0,s.jsx)(n.p,{children:"ODBC driver uses the client connector to work with the cluster. Make sure to configure the port to the one you intend to use, for example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"node config update clientConnector.port=10469\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For more information on configuring client connector, see ",(0,s.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/clients/#client-connector-configuration",children:"Client Connector Configuration"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"installing-on-linux",children:"Installing on Linux"}),"\n",(0,s.jsxs)(n.p,{children:["To build and install ODBC driver on Linux, you need to first install\r\nODBC Driver Manager. The ODBC driver has been tested with ",(0,s.jsx)(n.a,{href:"http://www.unixodbc.org",children:"UnixODBC"}),"."]}),"\n",(0,s.jsx)(n.h4,{id:"prerequisites-1",children:"Prerequisites"}),"\n",(0,s.jsx)(n.p,{children:"Install the following prerequisites first:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://gcc.gnu.org/onlinedocs/libstdc%2B%2B",children:"libstdc"})," library supporting C++14 standard;"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"http://www.unixodbc.org",children:"UnixODBC"})," driver manager."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"download-from-website",children:"Download from website"}),"\n",(0,s.jsx)(n.p,{children:"You can get the built rpm or deb package from the provided website. Then, install the package locally to use it."}),"\n",(0,s.jsx)(n.h2,{id:"supported-data-types",children:"Supported Data Types"}),"\n",(0,s.jsx)(n.p,{children:"The following SQL data types are supported:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_CHAR"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_VARCHAR"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_LONGVARCHAR"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_SMALLINT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_INTEGER"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_FLOAT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_DOUBLE"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_BIT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_TINYINT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_BIGINT"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_BINARY"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_VARBINARY"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_LONGVARBINARY"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_GUID"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_DECIMAL"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_TYPE_DATE"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_TYPE_TIMESTAMP"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"SQL_TYPE_TIME"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"using-pyodbc",children:"Using pyodbc"}),"\n",(0,s.jsxs)(n.p,{children:["Ignite can be used with ",(0,s.jsx)(n.a,{href:"https://pypi.org/project/pyodbc/",children:"pyodbc"}),". Here is how you can use pyodbc in Ignite 3:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Install pyodbc"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"pip3 install pyodbc\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Import pyodbc to your project:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"import pyodbc\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Connect to the database:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"conn = pyodbc.connect('Driver={Apache Ignite 3};Address=127.0.0.1:10800;')\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Set encoding to UTF-8:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'conn.setencoding(encoding=\'utf-8\')\r\nconn.setdecoding(sqltype=pyodbc.SQL_CHAR, encoding="utf-8")\r\nconn.setdecoding(sqltype=pyodbc.SQL_WCHAR, encoding="utf-8")\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Get data from your database:"}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:"cursor = conn.cursor()\r\ncursor.execute('SELECT * FROM table_name')\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For more information on using pyodbc, use the ",(0,s.jsx)(n.a,{href:"https://github.com/mkleehammer/pyodbc/wiki",children:"official documentation"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/eff8d8a9.a0964b93.js b/docs/ignite3/assets/js/eff8d8a9.a0964b93.js deleted file mode 100644 index 5f85f6ea7b..0000000000 --- a/docs/ignite3/assets/js/eff8d8a9.a0964b93.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[186],{28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var r=t(96540);const i={},o=r.createContext(i);function s(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(o.Provider,{value:n},e.children)}},35955:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"administrators-guide/config/storage/rocksdb","title":"RocksDB Storage","description":"{/*","source":"@site/versioned_docs/version-3.0.0/administrators-guide/config/storage/rocksdb.md","sourceDirName":"administrators-guide/config/storage","slug":"/administrators-guide/config/storage/rocksdb","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"RocksDB Storage","sidebar_label":"RocksDB Storage"},"sidebar":"tutorialSidebar","previous":{"title":"Persistent Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent"},"next":{"title":"Volatile Storage","permalink":"/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile"}}');var i=t(74848),o=t(28453);const s={title:"RocksDB Storage",sidebar_label:"RocksDB Storage"},a="RocksDB Storage",c={},d=[{value:"Profile Configuration",id:"profile-configuration",level:2},{value:"Configuration Example",id:"configuration-example",level:2}];function l(e){const n={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"rocksdb-storage",children:"RocksDB Storage"})}),"\n",(0,i.jsx)(n.p,{children:"RocksDB is a persistent storage engine based on an LSM tree. It is best used in environments with a large number of write requests."}),"\n",(0,i.jsx)(n.h2,{id:"profile-configuration",children:"Profile Configuration"}),"\n",(0,i.jsx)(n.p,{children:"Each Apache Ignite storage engine can have several storage profiles. Each profile has the following properties:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Property"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"engine"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"The name of the storage engine."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"sizeBytes"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"256 * 1024 * 1024"})}),(0,i.jsx)(n.td,{children:"Sets the space allocated to the storage profile, in bytes."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"writeBufferSizeBytes"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"64 * 1024 * 1024"})}),(0,i.jsx)(n.td,{children:"Size of rocksdb write buffer."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"configuration-example",children:"Configuration Example"}),"\n",(0,i.jsxs)(n.p,{children:['In Apache Ignite 3, you can create and maintain configuration in either HOCON or JSON. The configuration file has a single root "node," called ',(0,i.jsx)(n.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node. The example below shows how to configure a storage profile with RocksDB storage:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "storage" : {\r\n "profiles" : [\r\n {\r\n "name" : "rocks_profile",\r\n "engine" : "rocksDb",\r\n "sizeBytes" : 2560000\r\n }\r\n ]\r\n }\r\n }\r\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can then use the profile (in this case, ",(0,i.jsx)(n.code,{children:"rocks_profile"}),") in your distribution zone configuration."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/f043e5a8.2ce62d2b.js b/docs/ignite3/assets/js/f043e5a8.2ce62d2b.js deleted file mode 100644 index 457d846a9c..0000000000 --- a/docs/ignite3/assets/js/f043e5a8.2ce62d2b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[1019],{28453:(e,n,l)=>{l.d(n,{R:()=>d,x:()=>t});var i=l(96540);const r={},s=i.createContext(r);function d(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),i.createElement(s.Provider,{value:n},e.children)}},68150:(e,n,l)=>{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>o,frontMatter:()=>d,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"tools/cli-commands","title":"CLI Commands Reference","description":"Overview","source":"@site/docs/tools/cli-commands.md","sourceDirName":"tools","slug":"/tools/cli-commands","permalink":"/docs/ignite3/3.1.0/tools/cli-commands","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"id":"cli-commands","title":"CLI Commands Reference","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Tools","permalink":"/docs/ignite3/3.1.0/tools/"},"next":{"title":"REST API","permalink":"/docs/ignite3/3.1.0/tools/rest-api"}}');var r=l(74848),s=l(28453);const d={id:"cli-commands",title:"CLI Commands Reference",sidebar_position:1},t="Apache Ignite CLI Tool",c={},a=[{value:"Overview",id:"overview",level:2},{value:"Interactive CLI Mode",id:"interactive-cli-mode",level:3},{value:"Non-Interactive CLI Mode",id:"non-interactive-cli-mode",level:3},{value:"Verbose Output",id:"verbose-output",level:3},{value:"CLI Tool Logs",id:"cli-tool-logs",level:3},{value:"SQL Commands",id:"sql-commands",level:2},{value:"sql",id:"sql",level:3},{value:"Syntax",id:"syntax",level:4},{value:"Parameters",id:"parameters",level:4},{value:"Example",id:"example",level:4},{value:"sql planner invalidate-cache",id:"sql-planner-invalidate-cache",level:3},{value:"Syntax",id:"syntax-1",level:4},{value:"Parameters",id:"parameters-1",level:4},{value:"Example",id:"example-1",level:4},{value:"CLI Configuration Commands",id:"cli-configuration-commands",level:2},{value:"cli config profile create",id:"cli-config-profile-create",level:3},{value:"Syntax",id:"syntax-2",level:4},{value:"Parameters",id:"parameters-2",level:4},{value:"Example",id:"example-2",level:4},{value:"cli config profile activate",id:"cli-config-profile-activate",level:3},{value:"Syntax",id:"syntax-3",level:4},{value:"Parameters",id:"parameters-3",level:4},{value:"Example",id:"example-3",level:4},{value:"cli config profile list",id:"cli-config-profile-list",level:3},{value:"Syntax",id:"syntax-4",level:4},{value:"Parameters",id:"parameters-4",level:4},{value:"Example",id:"example-4",level:4},{value:"cli config profile show",id:"cli-config-profile-show",level:3},{value:"Syntax",id:"syntax-5",level:4},{value:"Parameters",id:"parameters-5",level:4},{value:"Example",id:"example-5",level:4},{value:"cli config get",id:"cli-config-get",level:3},{value:"Syntax",id:"syntax-6",level:4},{value:"Parameters",id:"parameters-6",level:4},{value:"Example",id:"example-6",level:4},{value:"cli config set",id:"cli-config-set",level:3},{value:"Syntax",id:"syntax-7",level:4},{value:"Parameters",id:"parameters-7",level:4},{value:"Example",id:"example-7",level:4},{value:"cli config show",id:"cli-config-show",level:3},{value:"Syntax",id:"syntax-8",level:4},{value:"Parameters",id:"parameters-8",level:4},{value:"Example",id:"example-8",level:4},{value:"cli config remove",id:"cli-config-remove",level:3},{value:"Syntax",id:"syntax-9",level:4},{value:"Parameters",id:"parameters-9",level:4},{value:"Example",id:"example-9",level:4},{value:"Cluster Commands",id:"cluster-commands",level:2},{value:"cluster config show",id:"cluster-config-show",level:3},{value:"Syntax",id:"syntax-10",level:4},{value:"Parameters",id:"parameters-10",level:4},{value:"Example",id:"example-10",level:4},{value:"cluster config update",id:"cluster-config-update",level:3},{value:"Syntax",id:"syntax-11",level:4},{value:"Parameters",id:"parameters-11",level:4},{value:"Example",id:"example-11",level:4},{value:"cluster init",id:"cluster-init",level:3},{value:"Syntax",id:"syntax-12",level:4},{value:"Parameters",id:"parameters-12",level:4},{value:"Example",id:"example-12",level:4},{value:"cluster status",id:"cluster-status",level:3},{value:"Syntax",id:"syntax-13",level:4},{value:"Parameters",id:"parameters-13",level:4},{value:"Example",id:"example-13",level:4},{value:"cluster topology physical",id:"cluster-topology-physical",level:3},{value:"Syntax",id:"syntax-14",level:4},{value:"Parameters",id:"parameters-14",level:4},{value:"Example",id:"example-14",level:4},{value:"cluster topology logical",id:"cluster-topology-logical",level:3},{value:"Syntax",id:"syntax-15",level:4},{value:"Parameters",id:"parameters-15",level:4},{value:"Example",id:"example-15",level:4},{value:"cluster unit deploy",id:"cluster-unit-deploy",level:3},{value:"Syntax",id:"syntax-16",level:4},{value:"Parameters",id:"parameters-16",level:4},{value:"Example",id:"example-16",level:4},{value:"cluster unit undeploy",id:"cluster-unit-undeploy",level:3},{value:"Syntax",id:"syntax-17",level:4},{value:"Parameters",id:"parameters-17",level:4},{value:"Example",id:"example-17",level:4},{value:"cluster unit list",id:"cluster-unit-list",level:3},{value:"Syntax",id:"syntax-18",level:4},{value:"Parameters",id:"parameters-18",level:4},{value:"Example",id:"example-18",level:4},{value:"cluster metric source enable",id:"cluster-metric-source-enable",level:3},{value:"Syntax",id:"syntax-19",level:4},{value:"Parameters",id:"parameters-19",level:4},{value:"Example",id:"example-19",level:4},{value:"cluster metric source disable",id:"cluster-metric-source-disable",level:3},{value:"Syntax",id:"syntax-20",level:4},{value:"Parameters",id:"parameters-20",level:4},{value:"Example",id:"example-20",level:4},{value:"cluster metric source list",id:"cluster-metric-source-list",level:3},{value:"Syntax",id:"syntax-21",level:4},{value:"Parameters",id:"parameters-21",level:4},{value:"Example",id:"example-21",level:4},{value:"Node Commands",id:"node-commands",level:2},{value:"node config show",id:"node-config-show",level:3},{value:"Syntax",id:"syntax-22",level:4},{value:"Parameters",id:"parameters-22",level:4},{value:"Example",id:"example-22",level:4},{value:"node config update",id:"node-config-update",level:3},{value:"Syntax",id:"syntax-23",level:4},{value:"Parameters",id:"parameters-23",level:4},{value:"Example",id:"example-23",level:4},{value:"node status",id:"node-status",level:3},{value:"Syntax",id:"syntax-24",level:4},{value:"Parameters",id:"parameters-24",level:4},{value:"Example",id:"example-24",level:4},{value:"node version",id:"node-version",level:3},{value:"Syntax",id:"syntax-25",level:4},{value:"Parameters",id:"parameters-25",level:4},{value:"Example",id:"example-25",level:4},{value:"node metric list",id:"node-metric-list",level:3},{value:"Syntax",id:"syntax-26",level:4},{value:"Parameters",id:"parameters-26",level:4},{value:"Example",id:"example-26",level:4},{value:"node metric source enable",id:"node-metric-source-enable",level:3},{value:"Syntax",id:"syntax-27",level:4},{value:"Parameters",id:"parameters-27",level:4},{value:"Example",id:"example-27",level:4},{value:"node metric source disable",id:"node-metric-source-disable",level:3},{value:"Syntax",id:"syntax-28",level:4},{value:"Parameters",id:"parameters-28",level:4},{value:"Example",id:"example-28",level:4},{value:"node metric source list",id:"node-metric-source-list",level:3},{value:"Syntax",id:"syntax-29",level:4},{value:"Parameters",id:"parameters-29",level:4},{value:"Example",id:"example-29",level:4},{value:"node unit list",id:"node-unit-list",level:3},{value:"Syntax",id:"syntax-30",level:4},{value:"Parameters",id:"parameters-30",level:4},{value:"Example",id:"example-30",level:4},{value:"Disaster Recovery Commands",id:"disaster-recovery-commands",level:2},{value:"recovery partitions restart",id:"recovery-partitions-restart",level:3},{value:"Syntax",id:"syntax-31",level:4},{value:"Parameters",id:"parameters-31",level:4},{value:"Example",id:"example-31",level:4},{value:"recovery partitions reset",id:"recovery-partitions-reset",level:3},{value:"Syntax",id:"syntax-32",level:4},{value:"Parameters",id:"parameters-32",level:4},{value:"Example",id:"example-32",level:4},{value:"recovery partitions states",id:"recovery-partitions-states",level:3},{value:"Syntax",id:"syntax-33",level:4},{value:"Parameters",id:"parameters-33",level:4},{value:"Example",id:"example-33",level:4},{value:"recovery cluster reset",id:"recovery-cluster-reset",level:3},{value:"Syntax",id:"syntax-34",level:4},{value:"Parameters",id:"parameters-34",level:4},{value:"Example",id:"example-34",level:4},{value:"recovery cluster migrate",id:"recovery-cluster-migrate",level:3},{value:"Syntax",id:"syntax-35",level:4},{value:"Parameters",id:"parameters-35",level:4},{value:"Example",id:"example-35",level:4},{value:"Distribution Commands",id:"distribution-commands",level:2},{value:"distribution reset",id:"distribution-reset",level:3},{value:"Syntax",id:"syntax-36",level:4},{value:"Parameters",id:"parameters-36",level:4},{value:"Example",id:"example-36",level:4},{value:"Zone Commands",id:"zone-commands",level:2},{value:"zone datanodes reset",id:"zone-datanodes-reset",level:3},{value:"Syntax",id:"syntax-37",level:4},{value:"Parameters",id:"parameters-37",level:4},{value:"Miscellaneous Commands",id:"miscellaneous-commands",level:2},{value:"connect",id:"connect",level:3},{value:"Syntax",id:"syntax-38",level:4},{value:"Parameters",id:"parameters-38",level:4},{value:"Example",id:"example-37",level:4},{value:"disconnect",id:"disconnect",level:3},{value:"Syntax",id:"syntax-39",level:4},{value:"Parameters",id:"parameters-39",level:4},{value:"Example",id:"example-38",level:4},{value:"clear",id:"clear",level:3},{value:"Syntax",id:"syntax-40",level:4},{value:"Parameters",id:"parameters-40",level:4},{value:"Example",id:"example-39",level:4},{value:"cls",id:"cls",level:3},{value:"Syntax",id:"syntax-41",level:4},{value:"Parameters",id:"parameters-41",level:4},{value:"Example",id:"example-40",level:4},{value:"exit",id:"exit",level:3},{value:"Syntax",id:"syntax-42",level:4},{value:"Parameters",id:"parameters-42",level:4},{value:"Example",id:"example-41",level:4},{value:"help",id:"help",level:3},{value:"Syntax",id:"syntax-43",level:4},{value:"Parameters",id:"parameters-43",level:4},{value:"Example",id:"example-42",level:4},{value:"version",id:"version",level:3},{value:"Syntax",id:"syntax-44",level:4},{value:"Parameters",id:"parameters-44",level:4},{value:"Example",id:"example-43",level:4}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"apache-ignite-cli-tool",children:"Apache Ignite CLI Tool"})}),"\n",(0,r.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsx)(n.p,{children:"The Apache Ignite CLI communicates with the cluster via the REST API, allowing you to configure the entire cluster or apply node-specific settings. You can run the CLI either in the interactive mode or execute commands without entering it."}),"\n",(0,r.jsx)(n.h3,{id:"interactive-cli-mode",children:"Interactive CLI Mode"}),"\n",(0,r.jsxs)(n.p,{children:["To use the CLI in the interactive mode, first ",(0,r.jsx)(n.a,{href:"/3.1.0/getting-started/quick-start#start-the-ignite-cli",children:"run"})," it, then configure the ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes",children:"cluster"})," or ",(0,r.jsx)(n.a,{href:"/3.1.0/configure-and-operate/reference/node-configuration",children:"node"})," using the ",(0,r.jsx)(n.code,{children:"update"})," command."]}),"\n",(0,r.jsx)(n.p,{children:"For example, to add a new user to the cluster:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'cluster config update ignite.security.authentication.providers.default.users=[{username=newuser,displayName=newuser,password="newpassword",passwordEncoding=PLAIN,roles=[system]}]\n'})}),"\n",(0,r.jsx)(n.h3,{id:"non-interactive-cli-mode",children:"Non-Interactive CLI Mode"}),"\n",(0,r.jsx)(n.p,{children:"Non-interactive mode is useful for quick updates or when running commands in scripts."}),"\n",(0,r.jsxs)(n.p,{children:["When running commands non-interactively, enclose arguments in quotation marks to ensure that special POSIX characters (such as ",(0,r.jsx)(n.code,{children:"{"})," and ",(0,r.jsx)(n.code,{children:"}"}),") are interpreted correctly:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Linux"',children:'bin/ignite3 cluster config update "ignite.schemaSync={delayDurationMillis=500,maxClockSkewMillis=500}"\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Windows"',children:'bin/ignite3.bat cluster config update "ignite.schemaSync={delayDurationMillis=500,maxClockSkewMillis=500}"\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, you can use the backslash (",(0,r.jsx)(n.code,{children:"\\"}),") to escape all special characters in your command. For example:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Linux"',children:'bin/ignite3 cluster config update ignite.security.authentication.providers.default.users=\\[\\{username\\=newuser,displayName\\=newuser,password\\=\\"newpassword\\",passwordEncoding\\=PLAIN,roles\\=\\[system\\]\\}\\]\n'})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Windows"',children:'bin/ignite3.bat cluster config update ignite.security.authentication.providers.default.users=\\[\\{username\\=newuser,displayName\\=newuser,password\\=\\"newpassword\\",passwordEncoding\\=PLAIN,roles\\=\\[system\\]\\}\\]\n'})}),"\n",(0,r.jsx)(n.p,{children:"Non-interactive mode is also useful in automation scripts. For example, you can set configuration items in a Bash script as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'#!/bin/bash\r\n\r\n...\r\n\r\nbin/ignite3 cluster config update "ignite.schemaSync={delayDurationMillis=500,maxClockSkewMillis=500}"\r\n\r\nbin/ignite3 cluster config update "ignite.security.authentication.providers.default.users=[{username=newuser,displayName=newuser,password=\\"newpassword\\",passwordEncoding=PLAIN,roles=[system]}]"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"verbose-output",children:"Verbose Output"}),"\n",(0,r.jsxs)(n.p,{children:["All CLI commands can provide additional output that can be helpful in debugging. You can specify the ",(0,r.jsx)(n.code,{children:"-v"})," option multiple times to increase output verbosity. Single option shows REST request and response, second option (-vv) shows request headers, third one (-vvv) shows request body."]}),"\n",(0,r.jsx)(n.h3,{id:"cli-tool-logs",children:"CLI Tool Logs"}),"\n",(0,r.jsx)(n.p,{children:"CLI tool stores extended logs for your operations. These logs contain additional information not displayed during normal operation. You can configure the directory in the following ways:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["By setting the ",(0,r.jsx)(n.code,{children:"IGNITE_CLI_LOGS_DIR"})," environment variable to the directory where logs will be stored."]}),"\n",(0,r.jsxs)(n.li,{children:["By setting the ",(0,r.jsx)(n.code,{children:"$XDG_STATE_HOME"})," environment variable to set the CLI home folder. This configuration variable follows the ",(0,r.jsx)(n.a,{href:"https://specifications.freedesktop.org/basedir-spec/latest/",children:"XDG Base Directory Specification"})," and does not override the ",(0,r.jsx)(n.code,{children:"IGNITE_CLI_LOGS_DIR"}),". If ",(0,r.jsx)(n.code,{children:"$XDG_STATE_HOME"})," is set and ",(0,r.jsx)(n.code,{children:"IGNITE_CLI_LOGS_DIR"})," is not, logs will be stored in ",(0,r.jsx)(n.code,{children:"$XDG_STATE_HOME/ignitecli/logs"})," directory."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If neither of the above properties are set, the logs are stored in the following locations:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["On Unix systems and MacOS, in the ",(0,r.jsx)(n.code,{children:"~/.local/state/ignitecli/logs"})," directory."]}),"\n",(0,r.jsxs)(n.li,{children:["On Windows, in the ",(0,r.jsx)(n.code,{children:"%USERPROFILE%\\.local\\state\\ignitecli\\logs"})," folder."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"sql-commands",children:"SQL Commands"}),"\n",(0,r.jsx)(n.p,{children:"These commands help you execute SQL queries against the cluster."}),"\n",(0,r.jsx)(n.h3,{id:"sql",children:"sql"}),"\n",(0,r.jsx)(n.p,{children:"Executes SQL query or enters the interactive SQL editor mode if no SQL query is specified."}),"\n",(0,r.jsx)(n.h4,{id:"syntax",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sql [--jdbc-url=] [--plain] [--file=] [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--jdbc-url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"JDBC url to ignite cluster (e.g., 'jdbc:ignite:thin://127.0.0.1:10800')."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--plain"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--file"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Path to file with SQL commands to execute."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"SQL query to execute."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'sql "SELECT * FROM PUBLIC.PERSON"\n'})}),"\n",(0,r.jsx)(n.h3,{id:"sql-planner-invalidate-cache",children:"sql planner invalidate-cache"}),"\n",(0,r.jsx)(n.p,{children:"Invalidates SQL planner cache."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-1",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sql planner invalidate-cache [--tables=] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-1",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--tables"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Comma-separated list of tables."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint. It can be any node URL. If not set, the default URL from the profile settings will be used."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-1",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"sql planner invalidate-cache --tables=PUBLIC.PERSON,PUBLIC.ORDERS\n"})}),"\n",(0,r.jsx)(n.h2,{id:"cli-configuration-commands",children:"CLI Configuration Commands"}),"\n",(0,r.jsx)(n.p,{children:"These commands help you configure Apache Ignite CLI tool profiles and settings."}),"\n",(0,r.jsx)(n.h3,{id:"cli-config-profile-create",children:"cli config profile create"}),"\n",(0,r.jsx)(n.p,{children:"Creates a profile with the given name."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-2",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cli config profile create [--activate] [--copy-from=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-2",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--activate"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Activate new profile as current."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--copy-from"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Profile whose content will be copied to new one."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Name of new profile."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-2",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cli config profile create --activate --copy-from=default myprofile\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cli-config-profile-activate",children:"cli config profile activate"}),"\n",(0,r.jsx)(n.p,{children:"Activates the profile identified by name."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-3",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cli config profile activate [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-3",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Name of profile to activate."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-3",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cli config profile activate myprofile\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cli-config-profile-list",children:"cli config profile list"}),"\n",(0,r.jsx)(n.p,{children:"Lists configuration profiles."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-4",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cli config profile list [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-4",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"example-4",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cli config profile list\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cli-config-profile-show",children:"cli config profile show"}),"\n",(0,r.jsx)(n.p,{children:"Gets the current profile details."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-5",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cli config profile show [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-5",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"example-5",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cli config profile show\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cli-config-get",children:"cli config get"}),"\n",(0,r.jsx)(n.p,{children:"Gets the value for the specified configuration key."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-6",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cli config get [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-6",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Property name."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-6",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cli config get ignite.jdbc-url\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cli-config-set",children:"cli config set"}),"\n",(0,r.jsx)(n.p,{children:"Sets configuration parameters using comma-separated input key-value pairs."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-7",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cli config set [--profile=] [--verbose] ...\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-7",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"..."})}),(0,r.jsx)(n.td,{children:"Arguments"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"CLI configuration parameters."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-7",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cli config set ignite.jdbc-url=http://localhost:10300\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cli-config-show",children:"cli config show"}),"\n",(0,r.jsx)(n.p,{children:"Shows the currently active configuration."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-8",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cli config show [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-8",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-8",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cli config show\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cli-config-remove",children:"cli config remove"}),"\n",(0,r.jsx)(n.p,{children:"Removes the specified configuration key."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-9",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cli config remove [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-9",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Property name."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-9",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cli config remove ignite.jdbc-url\n"})}),"\n",(0,r.jsx)(n.h2,{id:"cluster-commands",children:"Cluster Commands"}),"\n",(0,r.jsx)(n.p,{children:"These commands help you manage your cluster."}),"\n",(0,r.jsx)(n.h3,{id:"cluster-config-show",children:"cluster config show"}),"\n",(0,r.jsx)(n.p,{children:"Shows configuration of the cluster indicated by the endpoint URL and, optionally, by a configuration path selector."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-10",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster config show [--url=] [--format=] [--profile=] [--verbose] []\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-10",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--format"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Output format. Valid values: JSON, HOCON (Default: HOCON)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Configuration path selector."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-10",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster config show\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-config-update",children:"cluster config update"}),"\n",(0,r.jsx)(n.p,{children:"Updates configuration of the cluster indicated by the endpoint URL with the provided argument values."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-11",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster config update [--url=] [--file=] [--profile=] [--verbose] [...]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-11",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--file"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Path to file with config update commands to execute."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"..."})}),(0,r.jsx)(n.td,{children:"Arguments"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Configuration arguments and values to update."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-11",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster config update ignite.system.idleSafeTimeSyncIntervalMillis=250\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-init",children:"cluster init"}),"\n",(0,r.jsx)(n.p,{children:"Initializes an Ignite cluster."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-12",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster init --name= [--metastorage-group=] [--cluster-management-group=] [--config=] [--config-files=] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-12",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--name"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Human-readable name of the cluster."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--metastorage-group"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Metastorage group nodes (comma-separated list)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--cluster-management-group"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Names of nodes that will host the Cluster Management Group (comma-separated list)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--config"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Cluster configuration that will be applied during initialization."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--config-files"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Path to cluster configuration files (comma-separated list)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-12",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster init --name=myCluster\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-status",children:"cluster status"}),"\n",(0,r.jsx)(n.p,{children:"Prints status of the cluster."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-13",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster status [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-13",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-13",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster status --url http://localhost:10300\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-topology-physical",children:"cluster topology physical"}),"\n",(0,r.jsx)(n.p,{children:"Shows physical topology of the specified cluster."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-14",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster topology physical [--plain] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-14",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--plain"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-14",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster topology physical --url http://localhost:10300\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-topology-logical",children:"cluster topology logical"}),"\n",(0,r.jsx)(n.p,{children:"Shows logical topology of the specified cluster."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-15",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster topology logical [--plain] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-15",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--plain"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-15",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster topology logical --url http://localhost:10300\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-unit-deploy",children:"cluster unit deploy"}),"\n",(0,r.jsx)(n.p,{children:"Deploys a unit from a file or a directory (non-recursively)."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-16",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster unit deploy --version= --path= [--nodes=] [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-16",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--version"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Unit version (x.y.z)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--path"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Path to deployment unit file or directory."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--nodes"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Initial set of nodes where the unit will be deployed (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Deployment unit identifier."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-16",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster unit deploy --version=1.0.0 --path=/path/to/unit.jar myunit\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-unit-undeploy",children:"cluster unit undeploy"}),"\n",(0,r.jsx)(n.p,{children:"Undeploys a unit."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-17",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster unit undeploy --version= [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-17",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--version"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Unit version (x.y.z)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Unit id."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-17",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster unit undeploy --version=1.0.0 --url http://localhost:10300 myunit\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-unit-list",children:"cluster unit list"}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of deployed units for specified deployment unit."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-18",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster unit list [--version=] [--status=] [--plain] [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-18",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--version"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Filters out deployment unit by version (exact match assumed)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--status"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Filters out deployment unit by status (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--plain"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Deployment unit id."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-18",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster unit list --status=DEPLOYED,STARTING myunit\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-metric-source-enable",children:"cluster metric source enable"}),"\n",(0,r.jsx)(n.p,{children:"Enables cluster metric source."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-19",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster metric source enable [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-19",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Metric source name."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-19",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster metric source enable jvm\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-metric-source-disable",children:"cluster metric source disable"}),"\n",(0,r.jsx)(n.p,{children:"Disables cluster metric source."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-20",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster metric source disable [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-20",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Metric source name."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-20",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster metric source disable jvm\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cluster-metric-source-list",children:"cluster metric source list"}),"\n",(0,r.jsx)(n.p,{children:"Lists cluster metric sources."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-21",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cluster metric source list [--plain] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-21",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--plain"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-21",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cluster metric source list\n"})}),"\n",(0,r.jsx)(n.h2,{id:"node-commands",children:"Node Commands"}),"\n",(0,r.jsx)(n.p,{children:"These commands help you manage individual nodes."}),"\n",(0,r.jsx)(n.h3,{id:"node-config-show",children:"node config show"}),"\n",(0,r.jsx)(n.p,{children:"Shows node configuration."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-22",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node config show [--url=] [--format=] [--profile=] [--verbose] []\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-22",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--format"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Output format. Valid values: JSON, HOCON (Default: HOCON)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Configuration path selector."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-22",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"node config show ignite.clientConnector\n"})}),"\n",(0,r.jsx)(n.h3,{id:"node-config-update",children:"node config update"}),"\n",(0,r.jsx)(n.p,{children:"Updates node configuration."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-23",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node config update [--url=] [--file=] [--profile=] [--verbose] [...]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-23",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--file"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Path to file with config update commands to execute."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"..."})}),(0,r.jsx)(n.td,{children:"Arguments"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Configuration arguments and values to update."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-23",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"node config update --url http://localhost:10300 ignite.clientConnector.connectTimeoutMillis=5000\n"})}),"\n",(0,r.jsx)(n.h3,{id:"node-status",children:"node status"}),"\n",(0,r.jsx)(n.p,{children:"Prints status of the node."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-24",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node status [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-24",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-24",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"node status\n"})}),"\n",(0,r.jsx)(n.h3,{id:"node-version",children:"node version"}),"\n",(0,r.jsx)(n.p,{children:"Prints the node build version."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-25",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node version [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-25",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-25",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"node version\n"})}),"\n",(0,r.jsx)(n.h3,{id:"node-metric-list",children:"node metric list"}),"\n",(0,r.jsx)(n.p,{children:"Lists node metrics."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-26",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node metric list [--url=] [--plain] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-26",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--plain"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-26",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"node metric list\n"})}),"\n",(0,r.jsx)(n.h3,{id:"node-metric-source-enable",children:"node metric source enable"}),"\n",(0,r.jsx)(n.p,{children:"Enables node metric source."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-27",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node metric source enable [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-27",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Metric source name."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-27",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"node metric source enable jvm\n"})}),"\n",(0,r.jsx)(n.h3,{id:"node-metric-source-disable",children:"node metric source disable"}),"\n",(0,r.jsx)(n.p,{children:"Disables node metric source."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-28",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node metric source disable [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-28",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Metric source name."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-28",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"node metric source disable jvm\n"})}),"\n",(0,r.jsx)(n.h3,{id:"node-metric-source-list",children:"node metric source list"}),"\n",(0,r.jsx)(n.p,{children:"Lists node metric sources."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-29",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node metric source list [--url=] [--plain] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-29",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--plain"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-29",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"node metric source list --plain\n"})}),"\n",(0,r.jsx)(n.h3,{id:"node-unit-list",children:"node unit list"}),"\n",(0,r.jsx)(n.p,{children:"Shows a list of deployed units."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-30",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"node unit list [--version=] [--status=] [--url=] [--plain] [--profile=] [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-30",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--version"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Filters out deployment unit by version (exact match assumed)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--status"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Filters out deployment unit by status (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--plain"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Deployment unit id."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-30",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"node unit list --status=DEPLOYED myunit\n"})}),"\n",(0,r.jsx)(n.h2,{id:"disaster-recovery-commands",children:"Disaster Recovery Commands"}),"\n",(0,r.jsx)(n.p,{children:"These commands let you recover data partitions in disaster scenarios and recover system RAFT groups."}),"\n",(0,r.jsx)(n.h3,{id:"recovery-partitions-restart",children:"recovery partitions restart"}),"\n",(0,r.jsx)(n.p,{children:"Restarts partitions."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-31",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"recovery partitions restart --zone= --table= [--partitions=] [--nodes=] [--with-cleanup] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-31",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--zone"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Name of the zone to reset partitions of. Case-sensitive, without quotes."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--table"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Fully-qualified name of the table to reset partitions of. Case-sensitive, without quotes."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--partitions"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"IDs of partitions to get states. All partitions if not set (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--nodes"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Names specifying nodes to get partition states from. Case-sensitive, without quotes, all nodes if not set (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--with-cleanup"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Restarts partitions, preceded by a storage cleanup. This will remove all data from the partition storages before restart."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-31",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"recovery partitions restart --zone=default --table=PUBLIC.PERSON --with-cleanup\n"})}),"\n",(0,r.jsx)(n.h3,{id:"recovery-partitions-reset",children:"recovery partitions reset"}),"\n",(0,r.jsx)(n.p,{children:"Resets partitions."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-32",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"recovery partitions reset --zone= [--table=] [--partitions=] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-32",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--zone"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Name of the zone to reset partitions of. Case-sensitive, without quotes."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--table"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Fully-qualified name of the table to reset partitions of. Case-sensitive, without quotes."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--partitions"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"IDs of partitions to get states. All partitions if not set (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-32",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"recovery partitions reset --zone=default --table=PUBLIC.PERSON\n"})}),"\n",(0,r.jsx)(n.h3,{id:"recovery-partitions-states",children:"recovery partitions states"}),"\n",(0,r.jsx)(n.p,{children:"Returns partition states."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-33",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"recovery partitions states (--global | --local) [--nodes=] [--partitions=] [--zones=] [--plain] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-33",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--global"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"Yes*"}),(0,r.jsx)(n.td,{children:"Gets global partition states. One of global or local is required."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--local"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"Yes*"}),(0,r.jsx)(n.td,{children:"Gets local partition states. One of global or local is required."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--nodes"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Names specifying nodes to get partition states from. Case-sensitive, without quotes, all nodes if not set (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--partitions"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"IDs of partitions to get states. All partitions if not set (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--zones"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Names specifying zones to get partition states from. Case-sensitive, without quotes, all zones if not set (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--plain"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-33",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"recovery partitions states --local --zones=default\n"})}),"\n",(0,r.jsx)(n.h3,{id:"recovery-cluster-reset",children:"recovery cluster reset"}),"\n",(0,r.jsx)(n.p,{children:"Resets cluster."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-34",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"recovery cluster reset [--cluster-management-group=] [--metastorage-replication-factor=] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-34",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--cluster-management-group"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Names of nodes that will host the Cluster Management Group (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--metastorage-replication-factor"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Number of nodes in the voting member set of the Metastorage RAFT group."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-34",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"recovery cluster reset\n"})}),"\n",(0,r.jsx)(n.h3,{id:"recovery-cluster-migrate",children:"recovery cluster migrate"}),"\n",(0,r.jsx)(n.p,{children:"Migrates nodes missed during repair to repaired cluster."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-35",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"recovery cluster migrate --old-cluster-url= --new-cluster-url= [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-35",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--old-cluster-url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"URL of old cluster endpoint (nodes of this cluster will be migrated to a new cluster)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--new-cluster-url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"URL of new cluster endpoint (nodes of old cluster will be migrated to this cluster)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-35",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"recovery cluster migrate --old-cluster-url=http://old-cluster:10300 --new-cluster-url=http://new-cluster:10300\n"})}),"\n",(0,r.jsx)(n.h2,{id:"distribution-commands",children:"Distribution Commands"}),"\n",(0,r.jsx)(n.p,{children:"These commands help you manage table partition distribution."}),"\n",(0,r.jsx)(n.h3,{id:"distribution-reset",children:"distribution reset"}),"\n",(0,r.jsx)(n.p,{children:"Resets distribution of partitions."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-36",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"distribution reset --zones= [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-36",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--zones"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Names specifying zones to reset the distribution state in (comma-separated)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--url"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--profile"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-36",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"distribution reset --zones=default\n"})}),"\n",(0,r.jsx)(n.h2,{id:"zone-commands",children:"Zone Commands"}),"\n",(0,r.jsx)(n.p,{children:"These commands manage zone-level configuration and data-node assignments."}),"\n",(0,r.jsx)(n.h3,{id:"zone-datanodes-reset",children:"zone datanodes reset"}),"\n",(0,r.jsx)(n.p,{children:"Resets data nodes for the specified zones."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-37",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"zone datanodes reset --zone-names=\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-37",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--zone-names"})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Comma-separated list of zone names to reset data nodes for. If not specified, all zones are reset."})]})})]}),"\n",(0,r.jsx)(n.h2,{id:"miscellaneous-commands",children:"Miscellaneous Commands"}),"\n",(0,r.jsx)(n.p,{children:"These are general-purpose commands."}),"\n",(0,r.jsx)(n.h3,{id:"connect",children:"connect"}),"\n",(0,r.jsx)(n.p,{children:"Connects to an Ignite 3 node."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-38",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"connect --username= --password= [--verbose] \n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-38",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--username"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Username to connect to cluster."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--password"})}),(0,r.jsx)(n.td,{children:"Option"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"Password to connect to cluster."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:""})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"Yes"}),(0,r.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"example-37",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"connect --username=admin --password=password http://localhost:10300\n"})}),"\n",(0,r.jsx)(n.h3,{id:"disconnect",children:"disconnect"}),"\n",(0,r.jsx)(n.p,{children:"Disconnects from an Ignite 3 node."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-39",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"disconnect [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-39",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"example-38",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"disconnect\n"})}),"\n",(0,r.jsx)(n.h3,{id:"clear",children:"clear"}),"\n",(0,r.jsx)(n.p,{children:"Clears the screen."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-40",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"clear\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-40",children:"Parameters"}),"\n",(0,r.jsx)(n.p,{children:"This command takes no parameters."}),"\n",(0,r.jsx)(n.h4,{id:"example-39",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"clear\n"})}),"\n",(0,r.jsx)(n.h3,{id:"cls",children:"cls"}),"\n",(0,r.jsx)(n.p,{children:"Clears the screen."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-41",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"cls [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-41",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"example-40",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cls\n"})}),"\n",(0,r.jsx)(n.h3,{id:"exit",children:"exit"}),"\n",(0,r.jsx)(n.p,{children:"Exits the CLI."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-42",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"exit [--verbose]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-42",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"--verbose"})}),(0,r.jsx)(n.td,{children:"Flag"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"example-41",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"exit\n"})}),"\n",(0,r.jsx)(n.h3,{id:"help",children:"help"}),"\n",(0,r.jsx)(n.p,{children:"Display help information about the specified command."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-43",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"help [COMMAND]\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-43",children:"Parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Required"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"[COMMAND]"})}),(0,r.jsx)(n.td,{children:"Argument"}),(0,r.jsx)(n.td,{children:"No"}),(0,r.jsx)(n.td,{children:"The COMMAND to display the usage help message for."})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"example-42",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"help cluster config show\n"})}),"\n",(0,r.jsx)(n.h3,{id:"version",children:"version"}),"\n",(0,r.jsx)(n.p,{children:"Displays the current CLI tool version."}),"\n",(0,r.jsx)(n.h4,{id:"syntax-44",children:"Syntax"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"version\n"})}),"\n",(0,r.jsx)(n.h4,{id:"parameters-44",children:"Parameters"}),"\n",(0,r.jsx)(n.p,{children:"This command takes no parameters."}),"\n",(0,r.jsx)(n.h4,{id:"example-43",children:"Example"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"version\n"})})]})}function o(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/f2461985.d7dd98dc.js b/docs/ignite3/assets/js/f2461985.d7dd98dc.js deleted file mode 100644 index c57b55fd09..0000000000 --- a/docs/ignite3/assets/js/f2461985.d7dd98dc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[2418],{4679:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"understand/core-concepts/compute-and-events","title":"Compute and Events","description":"Ignite 3 provides distributed compute for executing jobs across cluster nodes and an event system for monitoring cluster activity. The compute API uses an asynchronous, priority-based execution model built on CompletableFuture.","source":"@site/docs/understand/core-concepts/compute-and-events.md","sourceDirName":"understand/core-concepts","slug":"/understand/core-concepts/compute-and-events","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"id":"compute-and-events","title":"Compute and Events","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Data Partitioning","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning"},"next":{"title":"Architecture","permalink":"/docs/ignite3/3.1.0/understand/architecture/"}}');var s=r(74848),i=r(28453);const o={id:"compute-and-events",title:"Compute and Events",sidebar_position:5},c=void 0,d={},l=[{value:"Distributed Compute Architecture",id:"distributed-compute-architecture",level:2},{value:"Job Execution Model",id:"job-execution-model",level:2},{value:"ComputeJob Interface",id:"computejob-interface",level:3},{value:"Job Targets",id:"job-targets",level:3},{value:"Any Node Execution",id:"any-node-execution",level:4},{value:"Colocated Execution",id:"colocated-execution",level:4},{value:"Broadcast Execution",id:"broadcast-execution",level:4},{value:"Job Scheduling",id:"job-scheduling",level:2},{value:"Job Priority",id:"job-priority",level:3},{value:"Job Failover",id:"job-failover",level:2},{value:"Job State Management",id:"job-state-management",level:2},{value:"Map-Reduce Tasks",id:"map-reduce-tasks",level:2},{value:"Event System",id:"event-system",level:2},{value:"Event Architecture",id:"event-architecture",level:3},{value:"Compute Events",id:"compute-events",level:3},{value:"Event Listeners",id:"event-listeners",level:3},{value:"Code Deployment",id:"code-deployment",level:2},{value:"Design Constraints",id:"design-constraints",level:2},{value:"Related Topics",id:"related-topics",level:2}];function a(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Ignite 3 provides distributed compute for executing jobs across cluster nodes and an event system for monitoring cluster activity. The compute API uses an asynchronous, priority-based execution model built on ",(0,s.jsx)(n.code,{children:"CompletableFuture"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"distributed-compute-architecture",children:"Distributed Compute Architecture"}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Client"\r\n Submit[Submit Job]\r\n end\r\n\r\n subgraph "Job Routing"\r\n Target{Job Target}\r\n Any[Any Node]\r\n Coloc[Colocated]\r\n Bcast[Broadcast]\r\n end\r\n\r\n subgraph "Cluster Nodes"\r\n N1[Node 1
                                                              Executor]\r\n N2[Node 2
                                                              Executor]\r\n N3[Node 3
                                                              Executor]\r\n end\r\n\r\n Submit --\x3e Target\r\n Target --\x3e|AnyNode| Any\r\n Target --\x3e|Colocated| Coloc\r\n Target --\x3e|Broadcast| Bcast\r\n Any --\x3e N1\r\n Coloc --\x3e N2\r\n Bcast --\x3e N1 & N2 & N3'}),"\n",(0,s.jsx)(n.p,{children:"Key characteristics:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Asynchronous execution returning ",(0,s.jsx)(n.code,{children:"CompletableFuture"})]}),"\n",(0,s.jsx)(n.li,{children:"Job placement based on target type (any node, colocated, broadcast)"}),"\n",(0,s.jsx)(n.li,{children:"Priority-based queue with configurable thread pool"}),"\n",(0,s.jsx)(n.li,{children:"Automatic failover on node departure"}),"\n",(0,s.jsx)(n.li,{children:"Map-reduce support for split/aggregate patterns"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"job-execution-model",children:"Job Execution Model"}),"\n",(0,s.jsx)(n.h3,{id:"computejob-interface",children:"ComputeJob Interface"}),"\n",(0,s.jsxs)(n.p,{children:["Jobs implement the ",(0,s.jsx)(n.code,{children:"ComputeJob"})," interface:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"public interface ComputeJob {\r\n CompletableFuture executeAsync(\r\n JobExecutionContext context,\r\n T arg\r\n );\r\n}\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"JobExecutionContext"})," provides:"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Property"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ignite()"})}),(0,s.jsx)(n.td,{children:"Ignite instance for cluster operations"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"isCancelled()"})}),(0,s.jsx)(n.td,{children:"Check if cancellation requested"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"partition()"})}),(0,s.jsx)(n.td,{children:"Partition info for colocated jobs"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"Example job implementation:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'public class AccountBalanceJob implements ComputeJob {\r\n @Override\r\n public CompletableFuture executeAsync(\r\n JobExecutionContext context,\r\n Long accountId) {\r\n\r\n Table accounts = context.ignite().tables().table("accounts");\r\n RecordView view = accounts.recordView();\r\n\r\n Tuple key = Tuple.create().set("id", accountId);\r\n Tuple record = view.get(null, key);\r\n\r\n return CompletableFuture.completedFuture(\r\n record.doubleValue("balance")\r\n );\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"job-targets",children:"Job Targets"}),"\n",(0,s.jsx)(n.p,{children:"Job targets determine where jobs execute:"}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Target Types"\r\n ANY["AnyNode
                                                              Single node from set"]\r\n COLOC["Colocated
                                                              Node with key\'s partition"]\r\n BCAST["Broadcast
                                                              All nodes in set"]\r\n end'}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Target"}),(0,s.jsx)(n.th,{children:"Use Case"}),(0,s.jsx)(n.th,{children:"Return Type"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"AnyNode"})}),(0,s.jsx)(n.td,{children:"Stateless computation"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"JobExecution"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Colocated"})}),(0,s.jsx)(n.td,{children:"Data-local processing"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"JobExecution"})})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.strong,{children:"Broadcast"})}),(0,s.jsx)(n.td,{children:"Cluster-wide operations"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"BroadcastExecution"})})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"any-node-execution",children:"Any Node Execution"}),"\n",(0,s.jsx)(n.p,{children:"Execute on any available node:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"JobDescriptor descriptor = JobDescriptor\r\n .builder(AccountBalanceJob.class)\r\n .build();\r\n\r\nJobExecution execution = client.compute()\r\n .submit(JobTarget.anyNode(client.clusterNodes()), descriptor, accountId);\r\n\r\nDouble balance = execution.resultAsync().join();\n"})}),"\n",(0,s.jsx)(n.h4,{id:"colocated-execution",children:"Colocated Execution"}),"\n",(0,s.jsx)(n.p,{children:"Execute on the node holding specific data:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'// Execute where account 42\'s data lives\r\nJobExecution execution = client.compute().submit(\r\n JobTarget.colocated("accounts", Tuple.create().set("id", 42L)),\r\n descriptor,\r\n 42L\r\n);\n'})}),"\n",(0,s.jsx)(n.p,{children:"This eliminates network transfer for data-intensive operations."}),"\n",(0,s.jsx)(n.h4,{id:"broadcast-execution",children:"Broadcast Execution"}),"\n",(0,s.jsx)(n.p,{children:"Execute on all specified nodes:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"BroadcastExecution execution = client.compute().submitBroadcast(\r\n client.clusterNodes(),\r\n JobDescriptor.builder(NodeInfoJob.class).build(),\r\n null\r\n);\r\n\r\n// Get results from all nodes\r\nMap results = execution.resultsAsync().join();\n"})}),"\n",(0,s.jsx)(n.h2,{id:"job-scheduling",children:"Job Scheduling"}),"\n",(0,s.jsx)(n.p,{children:"Jobs execute through a priority-based queue system:"}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Priority Queue"\r\n P0["Priority 0
                                                              (highest)"]\r\n P1["Priority 1"]\r\n P2["Priority 2"]\r\n PN["Priority N
                                                              (lowest)"]\r\n end\r\n\r\n subgraph "Thread Pool"\r\n T1[Worker 1]\r\n T2[Worker 2]\r\n TN[Worker N]\r\n end\r\n\r\n P0 --\x3e T1\r\n P1 --\x3e T2\r\n P2 --\x3e TN'}),"\n",(0,s.jsx)(n.p,{children:"Configuration options:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Setting"}),(0,s.jsx)(n.th,{children:"Default"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"threadPoolSize"})}),(0,s.jsx)(n.td,{children:"max(CPU cores, 8)"}),(0,s.jsx)(n.td,{children:"Worker thread count"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"queueMaxSize"})}),(0,s.jsx)(n.td,{children:"Integer.MAX_VALUE"}),(0,s.jsx)(n.td,{children:"Maximum queued jobs"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"statesLifetimeMillis"})}),(0,s.jsx)(n.td,{children:"60,000"}),(0,s.jsx)(n.td,{children:"Job state retention"})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"job-priority",children:"Job Priority"}),"\n",(0,s.jsx)(n.p,{children:"Set priority when submitting:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"JobDescriptor descriptor = JobDescriptor\r\n .builder(MyJob.class)\r\n .priority(5) // Higher number = lower priority\r\n .build();\n"})}),"\n",(0,s.jsx)(n.p,{children:"Change priority during execution:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"JobExecution execution = client.compute().submit(target, descriptor, arg);\r\nexecution.changePriorityAsync(1); // Move to higher priority\n"})}),"\n",(0,s.jsx)(n.p,{children:"Jobs with the same priority execute in FIFO order."}),"\n",(0,s.jsx)(n.h2,{id:"job-failover",children:"Job Failover"}),"\n",(0,s.jsx)(n.p,{children:"Ignite automatically handles node failures during job execution:"}),"\n",(0,s.jsx)(n.mermaid,{value:"sequenceDiagram\r\n participant C as Client\r\n participant N1 as Node A\r\n participant N2 as Node B\r\n\r\n C->>N1: Submit job\r\n Note over N1: Executing...\r\n Note over N1: Node fails\r\n Note over C: Detects topology change\r\n C->>N2: Re-submit job\r\n N2--\x3e>C: Result"}),"\n",(0,s.jsx)(n.p,{children:"Failover behavior:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Triggered only on node departure (not job exceptions)"}),"\n",(0,s.jsx)(n.li,{children:"Selects next worker from remaining candidates"}),"\n",(0,s.jsx)(n.li,{children:"Continues until candidates exhausted"}),"\n",(0,s.jsx)(n.li,{children:"Application exceptions propagate to caller without retry"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For application-level retries:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"JobDescriptor descriptor = JobDescriptor\r\n .builder(MyJob.class)\r\n .maxRetries(3) // Retry on job failure\r\n .build();\n"})}),"\n",(0,s.jsx)(n.h2,{id:"job-state-management",children:"Job State Management"}),"\n",(0,s.jsx)(n.p,{children:"Track job execution through states:"}),"\n",(0,s.jsx)(n.mermaid,{value:"stateDiagram-v2\r\n [*] --\x3e QUEUED: submit()\r\n QUEUED --\x3e EXECUTING: worker picks up\r\n EXECUTING --\x3e COMPLETED: success\r\n EXECUTING --\x3e FAILED: exception\r\n QUEUED --\x3e CANCELING: cancel()\r\n EXECUTING --\x3e CANCELING: cancel()\r\n CANCELING --\x3e CANCELED: acknowledged"}),"\n",(0,s.jsx)(n.p,{children:"Query job state:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'JobExecution execution = client.compute().submit(target, descriptor, arg);\r\n\r\nJobState state = execution.stateAsync().join();\r\nSystem.out.println("Status: " + state.status());\r\nSystem.out.println("Created: " + state.createTime());\r\nSystem.out.println("Started: " + state.startTime());\n'})}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"State"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"QUEUED"}),(0,s.jsx)(n.td,{children:"Waiting in priority queue"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"EXECUTING"}),(0,s.jsx)(n.td,{children:"Running on worker thread"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"COMPLETED"}),(0,s.jsx)(n.td,{children:"Finished successfully"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"FAILED"}),(0,s.jsx)(n.td,{children:"Terminated with exception"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"CANCELING"}),(0,s.jsx)(n.td,{children:"Cancellation in progress"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"CANCELED"}),(0,s.jsx)(n.td,{children:"Cancelled by request"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"map-reduce-tasks",children:"Map-Reduce Tasks"}),"\n",(0,s.jsxs)(n.p,{children:["For split/aggregate computation patterns, use ",(0,s.jsx)(n.code,{children:"MapReduceTask"}),":"]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Split Phase"\r\n Input[Input Data]\r\n S1[Job 1]\r\n S2[Job 2]\r\n S3[Job 3]\r\n end\r\n\r\n subgraph "Map Phase"\r\n N1[Node 1
                                                              Execute Job 1]\r\n N2[Node 2
                                                              Execute Job 2]\r\n N3[Node 3
                                                              Execute Job 3]\r\n end\r\n\r\n subgraph "Reduce Phase"\r\n Agg[Aggregate Results]\r\n Output[Final Result]\r\n end\r\n\r\n Input --\x3e S1 & S2 & S3\r\n S1 --\x3e N1\r\n S2 --\x3e N2\r\n S3 --\x3e N3\r\n N1 & N2 & N3 --\x3e Agg\r\n Agg --\x3e Output'}),"\n",(0,s.jsx)(n.p,{children:"Implement the task interface:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'public class WordCountTask implements MapReduceTask, Map> {\r\n\r\n @Override\r\n public CompletableFuture>>> splitAsync(\r\n TaskExecutionContext context,\r\n String input) {\r\n\r\n // Split input into chunks for parallel processing\r\n List>> jobs = Arrays.stream(input.split("\\n\\n"))\r\n .map(chunk -> MapReduceJob.>builder()\r\n .jobDescriptor(JobDescriptor.builder(CountWordsJob.class).build())\r\n .args(chunk)\r\n .build())\r\n .toList();\r\n\r\n return CompletableFuture.completedFuture(jobs);\r\n }\r\n\r\n @Override\r\n public CompletableFuture> reduceAsync(\r\n TaskExecutionContext context,\r\n Map> results) {\r\n\r\n // Aggregate word counts from all jobs\r\n Map totals = new HashMap<>();\r\n for (Map partial : results.values()) {\r\n partial.forEach((word, count) ->\r\n totals.merge(word, count, Long::sum));\r\n }\r\n return CompletableFuture.completedFuture(totals);\r\n }\r\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Submit the task:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"TaskDescriptor> descriptor = TaskDescriptor\r\n .>builder(WordCountTask.class)\r\n .build();\r\n\r\nTaskExecution> execution = client.compute()\r\n .submitMapReduce(descriptor, document);\r\n\r\nMap wordCounts = execution.resultAsync().join();\n"})}),"\n",(0,s.jsx)(n.h2,{id:"event-system",children:"Event System"}),"\n",(0,s.jsx)(n.p,{children:"Ignite provides an event system for monitoring cluster and compute activity."}),"\n",(0,s.jsx)(n.h3,{id:"event-architecture",children:"Event Architecture"}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Event Sources"\r\n Compute[Compute Events]\r\n Cluster[Cluster Events]\r\n end\r\n\r\n subgraph "Event Producer"\r\n Fire[fireEvent]\r\n Listeners[Listener Registry]\r\n end\r\n\r\n subgraph "Handlers"\r\n L1[Listener 1]\r\n L2[Listener 2]\r\n L3[Listener 3]\r\n end\r\n\r\n Compute --\x3e Fire\r\n Cluster --\x3e Fire\r\n Fire --\x3e Listeners\r\n Listeners --\x3e L1 & L2 & L3'}),"\n",(0,s.jsx)(n.h3,{id:"compute-events",children:"Compute Events"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Event"}),(0,s.jsx)(n.th,{children:"Trigger"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"COMPUTE_JOB_QUEUED"}),(0,s.jsx)(n.td,{children:"Job added to queue"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"COMPUTE_JOB_EXECUTING"}),(0,s.jsx)(n.td,{children:"Job started execution"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"COMPUTE_JOB_COMPLETED"}),(0,s.jsx)(n.td,{children:"Job finished successfully"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"COMPUTE_JOB_FAILED"}),(0,s.jsx)(n.td,{children:"Job terminated with error"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"COMPUTE_JOB_CANCELING"}),(0,s.jsx)(n.td,{children:"Cancellation requested"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"COMPUTE_JOB_CANCELED"}),(0,s.jsx)(n.td,{children:"Job cancelled"})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"event-listeners",children:"Event Listeners"}),"\n",(0,s.jsx)(n.p,{children:"Register listeners for specific events:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'EventListener listener = params -> {\r\n System.out.println("Job " + params.jobId() + " status: " + params.status());\r\n return CompletableFuture.completedFuture(false); // Keep listening\r\n};\r\n\r\nclient.compute().listen(IgniteEventType.COMPUTE_JOB_COMPLETED, listener);\n'})}),"\n",(0,s.jsx)(n.p,{children:"Listener return values:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Return"}),(0,s.jsx)(n.th,{children:"Behavior"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"false"})}),(0,s.jsx)(n.td,{children:"Keep listener active"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"true"})}),(0,s.jsx)(n.td,{children:"Remove listener after this event"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"For synchronous handlers:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'EventListener listener = EventListener.fromConsumer(params -> {\r\n log.info("Job completed: {}", params.jobId());\r\n});\n'})}),"\n",(0,s.jsx)(n.h2,{id:"code-deployment",children:"Code Deployment"}),"\n",(0,s.jsx)(n.p,{children:"Jobs require their classes to be available on executing nodes. Deploy code using deployment units:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'// Create deployment unit from JAR\r\nDeploymentUnit unit = DeploymentUnit.fromPath(\r\n "my-jobs",\r\n "1.0.0",\r\n Path.of("my-jobs.jar")\r\n);\r\n\r\n// Deploy to cluster\r\nclient.deployment().deployAsync(unit).join();\r\n\r\n// Reference in job descriptor\r\nJobDescriptor descriptor = JobDescriptor\r\n .builder("com.example.MyJob")\r\n .deploymentUnits(List.of(new DeploymentUnit("my-jobs", "1.0.0")))\r\n .build();\n'})}),"\n",(0,s.jsx)(n.h2,{id:"design-constraints",children:"Design Constraints"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Stateless jobs"}),": Jobs should not maintain state between executions. Store state in tables if needed."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Serializable arguments"}),": Job arguments and results must be serializable for network transfer."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Failover scope"}),": Automatic failover handles infrastructure failures only. Application exceptions propagate without retry unless ",(0,s.jsx)(n.code,{children:"maxRetries"})," is configured."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Event ordering"}),": Listeners execute in registration order per event, but no global ordering across nodes."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"One-shot listeners"}),": Return ",(0,s.jsx)(n.code,{children:"true"})," to auto-unsubscribe. Useful for waiting on specific events."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Thread pool bounds"}),": The executor thread pool is bounded. Long-running jobs can block other jobs."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"related-topics",children:"Related Topics"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/compute",children:"Compute API"})," for detailed API usage"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/code-deployment",children:"Code Deployment"})," for deployment patterns"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/3.1.0/develop/work-with-data/events",children:"Events"})," for event handling details"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>c});var t=r(96540);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/f522cffe.aa74041b.js b/docs/ignite3/assets/js/f522cffe.aa74041b.js deleted file mode 100644 index 65e00d3297..0000000000 --- a/docs/ignite3/assets/js/f522cffe.aa74041b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[180],{11470:(e,n,r)=>{r.d(n,{A:()=>A});var t=r(96540),a=r(34164),s=r(17559),i=r(23104),l=r(56347),o=r(205),c=r(57485),d=r(31682),u=r(70679);function L(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function S(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return L(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function h({queryString:e=!1,groupId:n}){const r=(0,l.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function g(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,s=S(e),[i,l]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:s})),[c,d]=h({queryString:r,groupId:a}),[L,g]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,u.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),p=(()=>{const e=c??L;return m({value:e,tabValues:s})?e:null})();(0,o.A)(()=>{p&&l(p)},[p]);return{selectedValue:i,selectValue:(0,t.useCallback)(e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),g(e)},[d,g,s]),tabValues:s}}var p=r(92303);const Q={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=r(74848);function b({className:e,block:n,selectedValue:r,selectValue:t,tabValues:s}){const l=[],{blockElementScrollPositionUntilNextRender:o}=(0,i.a_)(),c=e=>{const n=e.currentTarget,a=l.indexOf(n),i=s[a].value;i!==r&&(o(n),t(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=l.indexOf(e.currentTarget)+1;n=l[r]??l[0];break}case"ArrowLeft":{const r=l.indexOf(e.currentTarget)-1;n=l[r]??l[l.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:t})=>(0,f.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...t,className:(0,a.A)("tabs__item",Q.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:r}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function _(e){const n=g(e);return(0,f.jsxs)("div",{className:(0,a.A)(s.G.tabs.container,"tabs-container",Q.tabList),children:[(0,f.jsx)(b,{...n,...e}),(0,f.jsx)(y,{...n,...e})]})}function A(e){const n=(0,p.A)();return(0,f.jsx)(_,{...e,children:L(e.children)},String(n))}},19365:(e,n,r)=>{r.d(n,{A:()=>i});r(96540);var t=r(34164);const a={tabItem:"tabItem_Ymn6"};var s=r(74848);function i({children:e,hidden:n,className:r}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},28453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>l});var t=r(96540);const a={},s=t.createContext(a);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),t.createElement(s.Provider,{value:n},e.children)}},33496:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>S,frontMatter:()=>o,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"developers-guide/sql/odbc/querying-modifying-data","title":"Querying and Modifying Data","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/sql/odbc/querying-modifying-data.md","sourceDirName":"developers-guide/sql/odbc","slug":"/developers-guide/sql/odbc/querying-modifying-data","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Querying and Modifying Data","sidebar_label":"Querying and Modifying Data"},"sidebar":"tutorialSidebar","previous":{"title":"Connection String","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string"},"next":{"title":"ODBC Standard Conformance","permalink":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification"}}');var a=r(74848),s=r(28453),i=r(11470),l=r(19365);const o={title:"Querying and Modifying Data",sidebar_label:"Querying and Modifying Data"},c=void 0,d={},u=[{value:"Overview",id:"overview",level:2},{value:"Creating Tables",id:"creating-tables",level:2},{value:"Handling Errors",id:"handling-errors",level:2},{value:"Querying Data",id:"querying-data",level:2},{value:"Columns binding",id:"columns-binding",level:3},{value:"Inserting Data",id:"inserting-data",level:2},{value:"Error Checking",id:"error-checking",level:3},{value:"Updating Data",id:"updating-data",level:2},{value:"Deleting Data",id:"deleting-data",level:2}];function L(e){const n={admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:["\n","\n",(0,a.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,a.jsx)(n.p,{children:"This page describes how to connect to a cluster and execute a variety of SQL queries by using the ODBC driver."}),"\n",(0,a.jsx)(n.p,{children:"The ODBC driver supports DML (Data Modification Layer), which means that you can modify your data using an ODBC connection."}),"\n",(0,a.jsx)(n.h2,{id:"creating-tables",children:"Creating Tables"}),"\n",(0,a.jsx)(n.p,{children:"The simplest way to create tables by using ODBC Driver is to use DDL statements:"}),"\n",(0,a.jsx)(i.A,{children:(0,a.jsx)(l.A,{value:"ddl",label:"DDL",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-cpp",children:'SQLHENV env;\r\n\r\n// Allocate an environment handle\r\nSQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);\r\n\r\n// Use ODBC ver 3.8\r\nSQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, reinterpret_cast(SQL_OV_ODBC3_80), 0);\r\n\r\nSQLHDBC dbc;\r\n\r\n// Allocate a connection handle\r\nSQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);\r\n\r\n// Prepare the connection string\r\nSQLCHAR connectStr[] = "Driver={Apache Ignite 3};ADDRESS=localhost:10800;SCHEMA=PUBLIC;";\r\n\r\n// Connecting to the Cluster.\r\nSQLDriverConnect(dbc, NULL, connectStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);\r\n\r\nSQLHSTMT stmt;\r\n\r\n// Allocate a statement handle\r\nSQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\nSQLCHAR query1[] = "CREATE TABLE Person ( "\r\n "id LONG PRIMARY KEY, "\r\n "firstName VARCHAR, "\r\n "lastName VARCHAR, "\r\n "salary FLOAT) "";\r\n\r\nSQLExecDirect(stmt, query1, SQL_NTS);\r\n\r\nSQLCHAR query2[] = "CREATE TABLE Organization ( "\r\n "id LONG PRIMARY KEY, "\r\n "name VARCHAR) "";\r\n\r\nSQLExecDirect(stmt, query2, SQL_NTS);\r\n\r\nSQLCHAR query3[] = "CREATE INDEX idx_organization_name ON Organization (name)";\r\n\r\nSQLExecDirect(stmt, query3, SQL_NTS);\n'})})})}),"\n",(0,a.jsxs)(n.p,{children:["As you can see, we defined two tables that will contain the data of ",(0,a.jsx)(n.code,{children:"Person"})," and ",(0,a.jsx)(n.code,{children:"Organization"})," types.\r\nFor both types, we listed specific fields and indexes that will be read or updated using SQL."]}),"\n",(0,a.jsx)(n.h2,{id:"handling-errors",children:"Handling Errors"}),"\n",(0,a.jsx)(n.p,{children:"The section below covers how you can handle possible errors when working with ODBC. In this example we handle an issue with connecting to the cluster"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-cpp",children:'// Connecting to Ignite Cluster.\r\nSQLRETURN ret = SQLDriverConnect(dbc, NULL, connectStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);\r\n\r\nif (!SQL_SUCCEEDED(ret))\r\n{\r\n SQLCHAR sqlstate[7] = { 0 };\r\n SQLINTEGER nativeCode;\r\n\r\n SQLCHAR errMsg[BUFFER_SIZE] = { 0 };\r\n SQLSMALLINT errMsgLen = static_cast(sizeof(errMsg));\r\n\r\n SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, sqlstate, &nativeCode, errMsg, errMsgLen, &errMsgLen);\r\n\r\n std::cerr << "Failed to connect to Ignite: "\r\n << reinterpret_cast(sqlstate) << ": "\r\n << reinterpret_cast(errMsg) << ", "\r\n << "Native error code: " << nativeCode\r\n << std::endl;\r\n\r\n // Releasing allocated handles.\r\n SQLFreeHandle(SQL_HANDLE_DBC, dbc);\r\n SQLFreeHandle(SQL_HANDLE_ENV, env);\r\n\r\n return;\r\n}\n'})}),"\n",(0,a.jsx)(n.h2,{id:"querying-data",children:"Querying Data"}),"\n",(0,a.jsxs)(n.p,{children:["After everything is up and running, we're ready to execute ",(0,a.jsx)(n.code,{children:"SQL SELECT"})," queries using the ",(0,a.jsx)(n.code,{children:"ODBC API"}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-cpp",children:'SQLHSTMT stmt;\r\n\r\n// Allocate a statement handle\r\nSQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\nSQLCHAR query[] = "SELECT firstName, lastName, salary, Organization.name FROM Person "\r\n "INNER JOIN Organization ON Person.orgId = Organization.id"\r\nSQLSMALLINT queryLen = static_cast(sizeof(queryLen));\r\n\r\nSQLRETURN ret = SQLExecDirect(stmt, query, queryLen);\r\n\r\nif (!SQL_SUCCEEDED(ret))\r\n{\r\n SQLCHAR sqlstate[7] = { 0 };\r\n SQLINTEGER nativeCode;\r\n\r\n SQLCHAR errMsg[BUFFER_SIZE] = { 0 };\r\n SQLSMALLINT errMsgLen = static_cast(sizeof(errMsg));\r\n\r\n SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, sqlstate, &nativeCode, errMsg, errMsgLen, &errMsgLen);\r\n\r\n std::cerr << "Failed to perform SQL query: "\r\n << reinterpret_cast(sqlstate) << ": "\r\n << reinterpret_cast(errMsg) << ", "\r\n << "Native error code: " << nativeCode\r\n << std::endl;\r\n}\r\nelse\r\n{\r\n // Printing the result set.\r\n struct OdbcStringBuffer\r\n {\r\n SQLCHAR buffer[BUFFER_SIZE];\r\n SQLLEN resLen;\r\n };\r\n\r\n // Getting a number of columns in the result set.\r\n SQLSMALLINT columnsCnt = 0;\r\n SQLNumResultCols(stmt, &columnsCnt);\r\n\r\n // Allocating buffers for columns.\r\n std::vector columns(columnsCnt);\r\n\r\n // Binding columns. For simplicity we are going to use only\r\n // string buffers here.\r\n for (SQLSMALLINT i = 0; i < columnsCnt; ++i)\r\n SQLBindCol(stmt, i + 1, SQL_C_CHAR, columns[i].buffer, BUFFER_SIZE, &columns[i].resLen);\r\n\r\n // Fetching and printing data in a loop.\r\n ret = SQLFetch(stmt);\r\n while (SQL_SUCCEEDED(ret))\r\n {\r\n for (size_t i = 0; i < columns.size(); ++i)\r\n std::cout << std::setw(16) << std::left << columns[i].buffer << " ";\r\n\r\n std::cout << std::endl;\r\n\r\n ret = SQLFetch(stmt);\r\n }\r\n}\r\n\r\n// Releasing statement handle.\r\nSQLFreeHandle(SQL_HANDLE_STMT, stmt);\n'})}),"\n",(0,a.jsxs)(n.admonition,{type:"note",children:[(0,a.jsx)(n.h3,{id:"columns-binding",children:"Columns binding"}),(0,a.jsx)(n.p,{children:"In the example above, we bind all columns to the SQL_C_CHAR columns. This means that all values are going to be converted to strings upon fetching. This is done for the sake of simplicity. Value conversion upon fetching can be pretty slow; so your default decision should be to fetch the value the same way as it is stored."})]}),"\n",(0,a.jsx)(n.h2,{id:"inserting-data",children:"Inserting Data"}),"\n",(0,a.jsxs)(n.p,{children:["To insert new data into the cluster, ",(0,a.jsx)(n.code,{children:"SQL INSERT"})," statements can be used from the ODBC side."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-cpp",children:'SQLHSTMT stmt;\r\n\r\n// Allocate a statement handle\r\nSQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\nSQLCHAR query[] =\r\n\t"INSERT INTO Person (id, orgId, firstName, lastName, resume, salary) "\r\n\t"VALUES (?, ?, ?, ?, ?, ?)";\r\n\r\nSQLPrepare(stmt, query, static_cast(sizeof(query)));\r\n\r\n// Binding columns.\r\nint64_t key = 0;\r\nint64_t orgId = 0;\r\nchar name[1024] = { 0 };\r\nSQLLEN nameLen = SQL_NTS;\r\ndouble salary = 0.0;\r\n\r\nSQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_BIGINT, 0, 0, &key, 0, 0);\r\nSQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_BIGINT, 0, 0, &orgId, 0, 0);\r\nSQLBindParameter(stmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR,\tsizeof(name), sizeof(name), name, 0, &nameLen);\r\nSQLBindParameter(stmt, 4, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &salary, 0, 0);\r\n\r\n// Filling cache.\r\nkey = 1;\r\norgId = 1;\r\nstrncpy(name, "John", sizeof(name));\r\nsalary = 2200.0;\r\n\r\nSQLExecute(stmt);\r\nSQLMoreResults(stmt);\r\n\r\n++key;\r\norgId = 1;\r\nstrncpy(name, "Jane", sizeof(name));\r\nsalary = 1300.0;\r\n\r\nSQLExecute(stmt);\r\nSQLMoreResults(stmt);\r\n\r\n++key;\r\norgId = 2;\r\nstrncpy(name, "Richard", sizeof(name));\r\nsalary = 900.0;\r\n\r\nSQLExecute(stmt);\r\nSQLMoreResults(stmt);\r\n\r\n++key;\r\norgId = 2;\r\nstrncpy(name, "Mary", sizeof(name));\r\nsalary = 2400.0;\r\n\r\nSQLExecute(stmt);\r\n\r\n// Releasing statement handle.\r\nSQLFreeHandle(SQL_HANDLE_STMT, stmt);\n'})}),"\n",(0,a.jsx)(n.p,{children:"Next, we are going to insert additional organizations without the usage of prepared statements."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-cpp",children:"SQLHSTMT stmt;\r\n\r\n// Allocate a statement handle\r\nSQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\nSQLCHAR query1[] = \"INSERT INTO Organization (id, name) VALUES (1L, 'Some company')\";\r\n\r\nSQLExecDirect(stmt, query1, static_cast(sizeof(query1)));\r\n\r\nSQLFreeStmt(stmt, SQL_CLOSE);\r\n\r\nSQLCHAR query2[] = \"INSERT INTO Organization (id, name) VALUES (2L, 'Some other company')\";\r\n\r\n SQLExecDirect(stmt, query2, static_cast(sizeof(query2)));\r\n\r\n// Releasing statement handle.\r\nSQLFreeHandle(SQL_HANDLE_STMT, stmt);\n"})}),"\n",(0,a.jsxs)(n.admonition,{type:"warning",children:[(0,a.jsx)(n.h3,{id:"error-checking",children:"Error Checking"}),(0,a.jsx)(n.p,{children:"For simplicity the example code above does not check for an error return code. You will want to do error checking in production."})]}),"\n",(0,a.jsx)(n.h2,{id:"updating-data",children:"Updating Data"}),"\n",(0,a.jsxs)(n.p,{children:["Let's now update the salary for some of the persons stored in the cluster using SQL ",(0,a.jsx)(n.code,{children:"UPDATE"})," statement."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-cpp",children:'void AdjustSalary(SQLHDBC dbc, int64_t key, double salary)\r\n{\r\n SQLHSTMT stmt;\r\n\r\n // Allocate a statement handle\r\n SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\n SQLCHAR query[] = "UPDATE Person SET salary=? WHERE id=?";\r\n\r\n SQLBindParameter(stmt, 1, SQL_PARAM_INPUT,\r\n SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &salary, 0, 0);\r\n\r\n SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG,\r\n SQL_BIGINT, 0, 0, &key, 0, 0);\r\n\r\n SQLExecDirect(stmt, query, static_cast(sizeof(query)));\r\n\r\n // Releasing statement handle.\r\n SQLFreeHandle(SQL_HANDLE_STMT, stmt);\r\n}\r\n\r\n...\r\nAdjustSalary(dbc, 3, 1200.0);\r\nAdjustSalary(dbc, 1, 2500.0);\n'})}),"\n",(0,a.jsx)(n.h2,{id:"deleting-data",children:"Deleting Data"}),"\n",(0,a.jsxs)(n.p,{children:["Finally, let's remove a few records with the help of SQL ",(0,a.jsx)(n.code,{children:"DELETE"})," statement."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-cpp",children:'void DeletePerson(SQLHDBC dbc, int64_t key)\r\n{\r\n SQLHSTMT stmt;\r\n\r\n // Allocate a statement handle\r\n SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);\r\n\r\n SQLCHAR query[] = "DELETE FROM Person WHERE id=?";\r\n\r\n SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_BIGINT,\r\n 0, 0, &key, 0, 0);\r\n\r\n SQLExecDirect(stmt, query, static_cast(sizeof(query)));\r\n\r\n // Releasing statement handle.\r\n SQLFreeHandle(SQL_HANDLE_STMT, stmt);\r\n}\r\n\r\n...\r\nDeletePerson(dbc, 1);\r\nDeletePerson(dbc, 4);\n'})})]})}function S(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(L,{...e})}):L(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/f6ab33a6.cb490e08.js b/docs/ignite3/assets/js/f6ab33a6.cb490e08.js deleted file mode 100644 index c285182f62..0000000000 --- a/docs/ignite3/assets/js/f6ab33a6.cb490e08.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3837],{26768:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>c,default:()=>h,frontMatter:()=>d,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"sql/index","title":"SQL","description":"Complete SQL reference for Apache Ignite 3, including fundamentals, syntax, and performance tuning.","source":"@site/docs/sql/index.mdx","sourceDirName":"sql","slug":"/sql/","permalink":"/docs/ignite3/3.1.0/sql/","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"index","title":"SQL"},"sidebar":"tutorialSidebar","previous":{"title":"Spring Data Integration","permalink":"/docs/ignite3/3.1.0/develop/integrate/spring-data"},"next":{"title":"SQL Fundamentals","permalink":"/docs/ignite3/3.1.0/sql/fundamentals/"}}');var i=n(74848),a=n(28453);const d={id:"index",title:"SQL"},c="SQL",t={},l=[{value:"In This Section",id:"in-this-section",level:2},{value:"Next Steps",id:"next-steps",level:2}];function o(e){const s={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components},{IIcon:n}=s;return n||function(e,s){throw new Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("IIcon",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"sql",children:"SQL"})}),"\n",(0,i.jsx)(s.p,{children:"Complete SQL reference for Apache Ignite 3, including fundamentals, syntax, and performance tuning."}),"\n",(0,i.jsx)(s.h2,{id:"in-this-section",children:"In This Section"}),"\n",(0,i.jsxs)("div",{className:"card-container",children:[(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:engine-outline",height:"24"})," SQL Engine Architecture"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Understanding the SQL engine, query processing pipeline, and distributed query execution."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/fundamentals/engine-architecture",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:play-circle-outline",height:"24"})," Execute Queries"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Run SQL from applications using prepared statements, parameter binding, and result processing."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/working-with-sql/execute-queries",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:view-list-outline",height:"24"})," Work with System Views"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Query cluster metadata, metrics, and system information through SQL views."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/working-with-sql/system-views",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:file-document-outline",height:"24"})," DDL Commands"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Data definition language including CREATE, ALTER, and DROP statements for schema management."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/reference/language-definition/ddl",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:database-edit-outline",height:"24"})," DML Commands"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Data manipulation language including SELECT, INSERT, UPDATE, and DELETE operations."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/reference/language-definition/dml",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:variable",height:"24"})," Data Types"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Supported SQL data types including numeric, string, temporal, and binary types."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/reference/data-types-and-functions/data-types",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:function-variant",height:"24"})," Operators and Functions"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Built-in SQL functions and operators for arithmetic, string manipulation, date operations, and aggregations."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/reference/data-types-and-functions/operators-and-functions",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:code-tags",height:"24"})," Grammar Reference"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Complete SQL syntax with railroad diagrams showing valid statement structures."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/reference/language-definition/grammar-reference",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:key",height:"24"})," Keywords"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Reserved SQL keywords and naming restrictions for identifiers."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/reference/sql-conformance/keywords",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:check-decagram-outline",height:"24"})," SQL Conformance"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"SQL standards compliance and supported ANSI SQL features."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/reference/sql-conformance/overview",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:view-grid-outline",height:"24"})," Distribution Zones"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Control data distribution across cluster nodes for performance optimization."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/reference/language-definition/distribution-zones",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:chart-timeline-variant",height:"24"})," EXPLAIN Statement"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Analyze query execution plans to understand performance characteristics."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/advanced/explain-statement",children:"Learn more \u2192"})})]}),(0,i.jsxs)("div",{className:"card",children:[(0,i.jsx)("div",{className:"card__header",children:(0,i.jsxs)("h3",{children:[(0,i.jsx)(n,{icon:"mdi:speedometer",height:"24"})," Performance Tuning"]})}),(0,i.jsx)("div",{className:"card__body",children:(0,i.jsx)("p",{children:"Best practices for SQL query optimization and performance improvement."})}),(0,i.jsx)("div",{className:"card__footer",children:(0,i.jsx)("a",{href:"./sql/advanced/performance-tuning",children:"Learn more \u2192"})})]})]}),"\n",(0,i.jsx)(s.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"develop",children:"Develop"})," - Build applications with SQL"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"configure-and-operate",children:"Configure and Operate"})," - Production deployment"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"api-reference/sql-only-apis/jdbc/",children:"API Reference"})," - SQL driver documentation"]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},28453:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>c});var r=n(96540);const i={},a=r.createContext(i);function d(e){const s=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),r.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/f7a2bd99.c60ac965.js b/docs/ignite3/assets/js/f7a2bd99.c60ac965.js deleted file mode 100644 index 34b18de479..0000000000 --- a/docs/ignite3/assets/js/f7a2bd99.c60ac965.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[67],{28453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>s});var l=i(96540);const r={},a=l.createContext(r);function o(e){const n=l.useContext(a);return l.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),l.createElement(a.Provider,{value:n},e.children)}},55498:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>t,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});const l=JSON.parse('{"id":"api-reference/native-clients/java/catalog-api","title":"Catalog API","description":"The Catalog API manages table schemas, indexes, and distribution zones. Applications define schemas using Java annotations or fluent builders, enabling programmatic DDL without writing SQL statements. This approach provides compile-time validation and type safety.","source":"@site/docs/api-reference/native-clients/java/catalog-api.md","sourceDirName":"api-reference/native-clients/java","slug":"/api-reference/native-clients/java/catalog-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"title":"Catalog API","id":"catalog-api","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"Compute API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api"},"next":{"title":"Criteria API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api"}}');var r=i(74848),a=i(28453);const o={title:"Catalog API",id:"catalog-api",sidebar_position:8},s="Catalog API",t={},c=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Annotation-Based Tables",id:"annotation-based-tables",level:2},{value:"Key-Value Table Definitions",id:"key-value-table-definitions",level:2},{value:"Column Configuration",id:"column-configuration",level:2},{value:"Composite Primary Keys",id:"composite-primary-keys",level:2},{value:"Primary Key Ordering",id:"primary-key-ordering",level:2},{value:"Index Definitions",id:"index-definitions",level:2},{value:"Colocation Configuration",id:"colocation-configuration",level:2},{value:"Zone Configuration",id:"zone-configuration",level:2},{value:"Fluent Table Definitions",id:"fluent-table-definitions",level:2},{value:"Index Definitions with Builders",id:"index-definitions-with-builders",level:2},{value:"Conditional Table Creation",id:"conditional-table-creation",level:2},{value:"Table Deletion",id:"table-deletion",level:2},{value:"Distribution Zone Management",id:"distribution-zone-management",level:2},{value:"Zone Deletion",id:"zone-deletion",level:2},{value:"Schema Names",id:"schema-names",level:2},{value:"Complex Zone Configuration",id:"complex-zone-configuration",level:2},{value:"Reference",id:"reference",level:2},{value:"Annotations",id:"annotations",level:3},{value:"IgniteCatalog Methods",id:"ignitecatalog-methods",level:3},{value:"TableDefinition Builder Methods",id:"tabledefinition-builder-methods",level:3},{value:"ZoneDefinition Builder Methods",id:"zonedefinition-builder-methods",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"catalog-api",children:"Catalog API"})}),"\n",(0,r.jsx)(n.p,{children:"The Catalog API manages table schemas, indexes, and distribution zones. Applications define schemas using Java annotations or fluent builders, enabling programmatic DDL without writing SQL statements. This approach provides compile-time validation and type safety."}),"\n",(0,r.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,r.jsx)(n.p,{children:"The catalog facade creates, modifies, and drops database objects. Table definitions specify columns, primary keys, indexes, and colocation strategies. Distribution zones control data placement across cluster nodes."}),"\n",(0,r.jsx)(n.p,{children:"Annotations provide declarative schema definitions. Classes annotated with @Table become table definitions. The catalog creates tables from these classes automatically. Fluent builders offer programmatic alternatives when annotations are impractical."}),"\n",(0,r.jsx)(n.h2,{id:"annotation-based-tables",children:"Annotation-Based Tables"}),"\n",(0,r.jsx)(n.p,{children:"Define tables using annotations:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table("users")\r\npublic class User {\r\n @Id\r\n public Integer id;\r\n\r\n @Column\r\n public String name;\r\n\r\n @Column(nullable = false)\r\n public Integer age;\r\n\r\n @Column(length = 100)\r\n public String email;\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Create the table from the annotated class:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"CompletableFuture
                                                              tableFuture =\r\n ignite.catalog().createTableAsync(User.class);\r\n\r\nTable table = tableFuture.join();\n"})}),"\n",(0,r.jsx)(n.p,{children:"The catalog generates DDL from annotations."}),"\n",(0,r.jsx)(n.h2,{id:"key-value-table-definitions",children:"Key-Value Table Definitions"}),"\n",(0,r.jsx)(n.p,{children:"Define tables with separate key and value classes:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table("products")\r\npublic class ProductKey {\r\n @Id\r\n public Integer productId;\r\n}\r\n\r\npublic class ProductValue {\r\n @Column\r\n public String name;\r\n\r\n @Column\r\n public Double price;\r\n\r\n @Column\r\n public String category;\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Create the table:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"CompletableFuture
                                                              tableFuture =\r\n ignite.catalog().createTableAsync(\r\n ProductKey.class,\r\n ProductValue.class\r\n );\n"})}),"\n",(0,r.jsx)(n.h2,{id:"column-configuration",children:"Column Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Configure column properties:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table("items")\r\npublic class Item {\r\n @Id\r\n public Integer id;\r\n\r\n @Column(value = "item_name", nullable = false, length = 50)\r\n public String name;\r\n\r\n @Column(precision = 10, scale = 2)\r\n public BigDecimal price;\r\n\r\n @Column(columnDefinition = "VARCHAR(255) DEFAULT \'N/A\'")\r\n public String description;\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Column annotations support:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"value"})," - Column name (defaults to field name)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"nullable"})," - Allow null values (default true)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"length"})," - Maximum length for strings"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"precision"})," - Numeric precision"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"scale"})," - Numeric scale"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"columnDefinition"})," - Full SQL type definition"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"composite-primary-keys",children:"Composite Primary Keys"}),"\n",(0,r.jsx)(n.p,{children:"Define multi-column primary keys:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table("orders")\r\npublic class Order {\r\n @Id\r\n public Integer customerId;\r\n\r\n @Id\r\n public Integer orderId;\r\n\r\n @Column\r\n public LocalDateTime orderDate;\r\n\r\n @Column\r\n public String status;\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Fields with @Id annotations form the composite primary key."}),"\n",(0,r.jsx)(n.h2,{id:"primary-key-ordering",children:"Primary Key Ordering"}),"\n",(0,r.jsx)(n.p,{children:"Specify sort order for primary keys:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table("events")\r\npublic class Event {\r\n @Id(SortOrder.ASC)\r\n public Integer categoryId;\r\n\r\n @Id(SortOrder.DESC)\r\n public Long timestamp;\r\n\r\n @Column\r\n public String message;\r\n}\n'})}),"\n",(0,r.jsx)(n.h2,{id:"index-definitions",children:"Index Definitions"}),"\n",(0,r.jsx)(n.p,{children:"Add indexes through table annotations:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table(\r\n value = "users",\r\n indexes = {\r\n @Index(\r\n value = "idx_email",\r\n columns = @ColumnRef("email")\r\n ),\r\n @Index(\r\n value = "idx_name_age",\r\n columns = {\r\n @ColumnRef("name"),\r\n @ColumnRef(value = "age", sort = SortOrder.DESC)\r\n }\r\n )\r\n }\r\n)\r\npublic class User {\r\n @Id\r\n public Integer id;\r\n\r\n @Column\r\n public String name;\r\n\r\n @Column\r\n public Integer age;\r\n\r\n @Column\r\n public String email;\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Index annotations support single and composite indexes with sort orders."}),"\n",(0,r.jsx)(n.h2,{id:"colocation-configuration",children:"Colocation Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Configure data colocation:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table(\r\n value = "orders",\r\n colocateBy = {\r\n @ColumnRef("customerId")\r\n }\r\n)\r\npublic class Order {\r\n @Id\r\n public Integer customerId;\r\n\r\n @Id\r\n public Integer orderId;\r\n\r\n @Column\r\n public String product;\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Colocation ensures rows with the same colocation key values reside on the same node."}),"\n",(0,r.jsx)(n.h2,{id:"zone-configuration",children:"Zone Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Define distribution zones:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table(\r\n value = "cache_data",\r\n zone = @Zone(\r\n value = "cache_zone",\r\n partitions = 64,\r\n replicas = 3,\r\n storageProfiles = "default"\r\n )\r\n)\r\npublic class CacheRecord {\r\n @Id\r\n public String key;\r\n\r\n @Column\r\n public String value;\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Zone annotations configure partitioning, replication, and storage."}),"\n",(0,r.jsx)(n.h2,{id:"fluent-table-definitions",children:"Fluent Table Definitions"}),"\n",(0,r.jsx)(n.p,{children:"Build tables programmatically:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'TableDefinition definition = TableDefinition.builder("products")\r\n .columns(\r\n ColumnDefinition.column("id", ColumnType.INT32),\r\n ColumnDefinition.column("name", ColumnType.VARCHAR),\r\n ColumnDefinition.column("price", ColumnType.decimal(10, 2)),\r\n ColumnDefinition.column("category", ColumnType.varchar(50))\r\n )\r\n .primaryKey("id")\r\n .build();\r\n\r\nignite.catalog().createTableAsync(definition).join();\n'})}),"\n",(0,r.jsx)(n.h2,{id:"index-definitions-with-builders",children:"Index Definitions with Builders"}),"\n",(0,r.jsx)(n.p,{children:"Add indexes to table definitions:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'TableDefinition definition = TableDefinition.builder("users")\r\n .columns(\r\n ColumnDefinition.column("id", ColumnType.INT32),\r\n ColumnDefinition.column("email", ColumnType.VARCHAR),\r\n ColumnDefinition.column("name", ColumnType.VARCHAR)\r\n )\r\n .primaryKey("id")\r\n .index("idx_email", IndexType.SORTED, ColumnSorted.column("email"))\r\n .index("idx_name", IndexType.SORTED, ColumnSorted.column("name"))\r\n .build();\r\n\r\nignite.catalog().createTableAsync(definition).join();\n'})}),"\n",(0,r.jsx)(n.h2,{id:"conditional-table-creation",children:"Conditional Table Creation"}),"\n",(0,r.jsx)(n.p,{children:"Create tables only if they do not exist:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'TableDefinition definition = TableDefinition.builder("cache_data")\r\n .columns(\r\n ColumnDefinition.column("key", ColumnType.VARCHAR),\r\n ColumnDefinition.column("value", ColumnType.VARCHAR)\r\n )\r\n .primaryKey("key")\r\n .ifNotExists()\r\n .build();\r\n\r\nignite.catalog().createTableAsync(definition).join();\n'})}),"\n",(0,r.jsx)(n.h2,{id:"table-deletion",children:"Table Deletion"}),"\n",(0,r.jsx)(n.p,{children:"Drop tables by name:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'ignite.catalog().dropTableAsync("products").join();\n'})}),"\n",(0,r.jsx)(n.p,{children:"Drop using qualified names:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'QualifiedName tableName = QualifiedName.of("schema", "products");\r\nignite.catalog().dropTableAsync(tableName).join();\n'})}),"\n",(0,r.jsx)(n.h2,{id:"distribution-zone-management",children:"Distribution Zone Management"}),"\n",(0,r.jsx)(n.p,{children:"Create distribution zones:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'ZoneDefinition zone = ZoneDefinition.builder("fast_zone")\r\n .partitions(128)\r\n .replicas(2)\r\n .storageProfiles("ssd")\r\n .dataNodesAutoAdjustScaleUp(300)\r\n .dataNodesAutoAdjustScaleDown(600)\r\n .build();\r\n\r\nignite.catalog().createZoneAsync(zone).join();\n'})}),"\n",(0,r.jsx)(n.p,{children:"Zone configuration options:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"partitions"})," - Number of partitions"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"replicas"})," - Number of replicas per partition"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"storageProfiles"})," - Storage profile name (comma-separated for multiple)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"dataNodesAutoAdjustScaleUp"})," - Scale-up timeout in seconds"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"dataNodesAutoAdjustScaleDown"})," - Scale-down timeout in seconds"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"filter"})," - Node filter expression"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"consistencyMode"})," - Consistency mode"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"zone-deletion",children:"Zone Deletion"}),"\n",(0,r.jsx)(n.p,{children:"Drop distribution zones:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'ignite.catalog().dropZoneAsync("fast_zone").join();\n'})}),"\n",(0,r.jsx)(n.h2,{id:"schema-names",children:"Schema Names"}),"\n",(0,r.jsx)(n.p,{children:"Specify schemas in table annotations:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Table(value = "users", schemaName = "app_schema")\r\npublic class User {\r\n @Id\r\n public Integer id;\r\n\r\n @Column\r\n public String name;\r\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Tables without explicit schemas default to the PUBLIC schema."}),"\n",(0,r.jsx)(n.h2,{id:"complex-zone-configuration",children:"Complex Zone Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Configure zones with advanced options:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'ZoneDefinition zone = ZoneDefinition.builder("replicated_zone")\r\n .partitions(32)\r\n .replicas(5)\r\n .quorumSize(3)\r\n .storageProfiles("ssd,hdd")\r\n .distributionAlgorithm("rendezvous")\r\n .consistencyMode("strong")\r\n .filter("region == \'us-east\'")\r\n .build();\r\n\r\nignite.catalog().createZoneAsync(zone).join();\n'})}),"\n",(0,r.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Catalog facade: ",(0,r.jsx)(n.code,{children:"org.apache.ignite.catalog.IgniteCatalog"})]}),"\n",(0,r.jsxs)(n.li,{children:["Table definition: ",(0,r.jsx)(n.code,{children:"org.apache.ignite.catalog.definitions.TableDefinition"})]}),"\n",(0,r.jsxs)(n.li,{children:["Column definition: ",(0,r.jsx)(n.code,{children:"org.apache.ignite.catalog.definitions.ColumnDefinition"})]}),"\n",(0,r.jsxs)(n.li,{children:["Index definition: ",(0,r.jsx)(n.code,{children:"org.apache.ignite.catalog.definitions.IndexDefinition"})]}),"\n",(0,r.jsxs)(n.li,{children:["Zone definition: ",(0,r.jsx)(n.code,{children:"org.apache.ignite.catalog.definitions.ZoneDefinition"})]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"annotations",children:"Annotations"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"@Table"})," - Mark class as table definition"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"@Column"})," - Configure column properties"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"@Id"})," - Mark primary key columns"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"@Index"})," - Define table indexes"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"@Zone"})," - Configure distribution zone"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"@ColumnRef"})," - Reference columns in indexes and colocation"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"ignitecatalog-methods",children:"IgniteCatalog Methods"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"CompletableFuture
                                                              createTableAsync(Class)"})," - Create from annotated class"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"CompletableFuture
                                                              createTableAsync(Class, Class)"})," - Create from key-value classes"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"CompletableFuture
                                                              createTableAsync(TableDefinition)"})," - Create from definition"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"CompletableFuture dropTableAsync(String)"})," - Drop table by name"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"CompletableFuture dropTableAsync(QualifiedName)"})," - Drop by qualified name"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"CompletableFuture createZoneAsync(ZoneDefinition)"})," - Create distribution zone"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"CompletableFuture dropZoneAsync(String)"})," - Drop zone"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"tabledefinition-builder-methods",children:"TableDefinition Builder Methods"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"static Builder builder(String)"})," - Create builder"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"columns(ColumnDefinition...)"})," - Add columns"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"primaryKey(String...)"})," - Set primary key"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"index(String...)"})," - Add index on specified columns (uses default index type)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"index(String, IndexType, ColumnSorted...)"})," - Add named index with type and sorted columns"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"colocateBy(String...)"})," - Set colocation columns"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"zone(String)"})," - Set zone name"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"ifNotExists()"})," - Create only if not exists"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"build()"})," - Build definition"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"zonedefinition-builder-methods",children:"ZoneDefinition Builder Methods"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"static Builder builder(String)"})," - Create builder"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"partitions(int)"})," - Set partition count"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"replicas(int)"})," - Set replica count"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"quorumSize(int)"})," - Set quorum size"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"storageProfiles(String)"})," - Set storage profile (single string, comma-separated for multiple)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"distributionAlgorithm(String)"})," - Set distribution algorithm"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"dataNodesAutoAdjustScaleUp(int)"})," - Set scale-up timeout"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"dataNodesAutoAdjustScaleDown(int)"})," - Set scale-down timeout"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"filter(String)"})," - Set node filter expression"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"consistencyMode(String)"})," - Set consistency mode"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"build()"})," - Build definition"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/f838f9b1.e383cfeb.js b/docs/ignite3/assets/js/f838f9b1.e383cfeb.js deleted file mode 100644 index 4e25e4ac2a..0000000000 --- a/docs/ignite3/assets/js/f838f9b1.e383cfeb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8688],{11470:(e,n,r)=>{r.d(n,{A:()=>S});var l=r(96540),i=r(34164),s=r(17559),d=r(23104),t=r(56347),c=r(205),a=r(57485),h=r(31682),o=r(70679);function x(e){return l.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function j(e){const{values:n,children:r}=e;return(0,l.useMemo)(()=>{const e=n??function(e){return x(e).map(({props:{value:e,label:n,attributes:r,default:l}})=>({value:e,label:n,attributes:r,default:l}))}(r);return function(e){const n=(0,h.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function u({queryString:e=!1,groupId:n}){const r=(0,t.W6)(),i=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,a.aZ)(i),(0,l.useCallback)(e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})},[i,r])]}function m(e){const{defaultValue:n,queryString:r=!1,groupId:i}=e,s=j(e),[d,t]=(0,l.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:s})),[a,h]=u({queryString:r,groupId:i}),[x,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,i]=(0,o.Dv)(n);return[r,(0,l.useCallback)(e=>{n&&i.set(e)},[n,i])]}({groupId:i}),v=(()=>{const e=a??x;return p({value:e,tabValues:s})?e:null})();(0,c.A)(()=>{v&&t(v)},[v]);return{selectedValue:d,selectValue:(0,l.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);t(e),h(e),m(e)},[h,m,s]),tabValues:s}}var v=r(92303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=r(74848);function y({className:e,block:n,selectedValue:r,selectValue:l,tabValues:s}){const t=[],{blockElementScrollPositionUntilNextRender:c}=(0,d.a_)(),a=e=>{const n=e.currentTarget,i=t.indexOf(n),d=s[i].value;d!==r&&(c(n),l(d))},h=e=>{let n=null;switch(e.key){case"Enter":a(e);break;case"ArrowRight":{const r=t.indexOf(e.currentTarget)+1;n=t[r]??t[0];break}case"ArrowLeft":{const r=t.indexOf(e.currentTarget)-1;n=t[r]??t[t.length-1];break}}n?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:l})=>(0,g.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{t.push(e)},onKeyDown:h,onClick:a,...l,className:(0,i.A)("tabs__item",f.tabItem,l?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function b({lazy:e,children:n,selectedValue:r}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===r);return e?(0,l.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,l.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function N(e){const n=m(e);return(0,g.jsxs)("div",{className:(0,i.A)(s.G.tabs.container,"tabs-container",f.tabList),children:[(0,g.jsx)(y,{...n,...e}),(0,g.jsx)(b,{...n,...e})]})}function S(e){const n=(0,v.A)();return(0,g.jsx)(N,{...e,children:x(e.children)},String(n))}},19365:(e,n,r)=>{r.d(n,{A:()=>d});r(96540);var l=r(34164);const i={tabItem:"tabItem_Ymn6"};var s=r(74848);function d({children:e,hidden:n,className:r}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,l.A)(i.tabItem,r),hidden:n,children:e})}},28453:(e,n,r)=>{r.d(n,{R:()=>d,x:()=>t});var l=r(96540);const i={},s=l.createContext(i);function d(e){const n=l.useContext(s);return l.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),l.createElement(s.Provider,{value:n},e.children)}},78456:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>h,contentTitle:()=>a,default:()=>j,frontMatter:()=>c,metadata:()=>l,toc:()=>o});const l=JSON.parse('{"id":"ignite-cli-tool","title":"Apache Ignite CLI Tool","description":"{/*","source":"@site/versioned_docs/version-3.0.0/ignite-cli-tool.md","sourceDirName":".","slug":"/ignite-cli-tool","permalink":"/docs/ignite3/3.0.0/ignite-cli-tool","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Apache Ignite CLI Tool","sidebar_label":"Ignite CLI Tool"},"sidebar":"tutorialSidebar","previous":{"title":"Embedded Mode","permalink":"/docs/ignite3/3.0.0/quick-start/embedded-mode"},"next":{"title":"Table API","permalink":"/docs/ignite3/3.0.0/developers-guide/table-api"}}');var i=r(74848),s=r(28453),d=r(11470),t=r(19365);const c={title:"Apache Ignite CLI Tool",sidebar_label:"Ignite CLI Tool"},a=void 0,h={},o=[{value:"Overview",id:"overview",level:2},{value:"Interactive CLI Mode",id:"interactive-cli-mode",level:3},{value:"Non-Interactive CLI Mode",id:"non-interactive-cli-mode",level:3},{value:"Verbose Output",id:"verbose-output",level:3},{value:"CLI Tool Logs",id:"cli-tool-logs",level:3},{value:"SQL Commands",id:"sql-commands",level:2},{value:"sql",id:"sql",level:3},{value:"Syntax",id:"syntax",level:4},{value:"Parameters",id:"parameters",level:4},{value:"Example",id:"example",level:4},{value:"sql planner invalidate-cache",id:"sql-planner-invalidate-cache",level:3},{value:"Syntax",id:"syntax-1",level:4},{value:"Parameters",id:"parameters-1",level:4},{value:"Example",id:"example-1",level:4},{value:"CLI Configuration Commands",id:"cli-configuration-commands",level:2},{value:"cli config profile create",id:"cli-config-profile-create",level:3},{value:"Syntax",id:"syntax-2",level:4},{value:"Parameters",id:"parameters-2",level:4},{value:"Example",id:"example-2",level:4},{value:"cli config profile activate",id:"cli-config-profile-activate",level:3},{value:"Syntax",id:"syntax-3",level:4},{value:"Parameters",id:"parameters-3",level:4},{value:"Example",id:"example-3",level:4},{value:"cli config profile list",id:"cli-config-profile-list",level:3},{value:"Syntax",id:"syntax-4",level:4},{value:"Parameters",id:"parameters-4",level:4},{value:"Example",id:"example-4",level:4},{value:"cli config profile show",id:"cli-config-profile-show",level:3},{value:"Syntax",id:"syntax-5",level:4},{value:"Parameters",id:"parameters-5",level:4},{value:"Example",id:"example-5",level:4},{value:"cli config get",id:"cli-config-get",level:3},{value:"Syntax",id:"syntax-6",level:4},{value:"Parameters",id:"parameters-6",level:4},{value:"Example",id:"example-6",level:4},{value:"cli config set",id:"cli-config-set",level:3},{value:"Syntax",id:"syntax-7",level:4},{value:"Parameters",id:"parameters-7",level:4},{value:"Example",id:"example-7",level:4},{value:"cli config show",id:"cli-config-show",level:3},{value:"Syntax",id:"syntax-8",level:4},{value:"Parameters",id:"parameters-8",level:4},{value:"Example",id:"example-8",level:4},{value:"cli config remove",id:"cli-config-remove",level:3},{value:"Syntax",id:"syntax-9",level:4},{value:"Parameters",id:"parameters-9",level:4},{value:"Example",id:"example-9",level:4},{value:"Cluster Commands",id:"cluster-commands",level:2},{value:"cluster config show",id:"cluster-config-show",level:3},{value:"Syntax",id:"syntax-10",level:4},{value:"Parameters",id:"parameters-10",level:4},{value:"Example",id:"example-10",level:4},{value:"cluster config update",id:"cluster-config-update",level:3},{value:"Syntax",id:"syntax-11",level:4},{value:"Parameters",id:"parameters-11",level:4},{value:"Example",id:"example-11",level:4},{value:"cluster init",id:"cluster-init",level:3},{value:"Syntax",id:"syntax-12",level:4},{value:"Parameters",id:"parameters-12",level:4},{value:"Example",id:"example-12",level:4},{value:"cluster status",id:"cluster-status",level:3},{value:"Syntax",id:"syntax-13",level:4},{value:"Parameters",id:"parameters-13",level:4},{value:"Example",id:"example-13",level:4},{value:"cluster topology physical",id:"cluster-topology-physical",level:3},{value:"Syntax",id:"syntax-14",level:4},{value:"Parameters",id:"parameters-14",level:4},{value:"Example",id:"example-14",level:4},{value:"cluster topology logical",id:"cluster-topology-logical",level:3},{value:"Syntax",id:"syntax-15",level:4},{value:"Parameters",id:"parameters-15",level:4},{value:"Example",id:"example-15",level:4},{value:"cluster unit deploy",id:"cluster-unit-deploy",level:3},{value:"Syntax",id:"syntax-16",level:4},{value:"Parameters",id:"parameters-16",level:4},{value:"Example",id:"example-16",level:4},{value:"cluster unit undeploy",id:"cluster-unit-undeploy",level:3},{value:"Syntax",id:"syntax-17",level:4},{value:"Parameters",id:"parameters-17",level:4},{value:"Example",id:"example-17",level:4},{value:"cluster unit list",id:"cluster-unit-list",level:3},{value:"Syntax",id:"syntax-18",level:4},{value:"Parameters",id:"parameters-18",level:4},{value:"Example",id:"example-18",level:4},{value:"cluster metric source enable",id:"cluster-metric-source-enable",level:3},{value:"Syntax",id:"syntax-19",level:4},{value:"Parameters",id:"parameters-19",level:4},{value:"Example",id:"example-19",level:4},{value:"cluster metric source disable",id:"cluster-metric-source-disable",level:3},{value:"Syntax",id:"syntax-20",level:4},{value:"Parameters",id:"parameters-20",level:4},{value:"Example",id:"example-20",level:4},{value:"cluster metric source list",id:"cluster-metric-source-list",level:3},{value:"Syntax",id:"syntax-21",level:4},{value:"Parameters",id:"parameters-21",level:4},{value:"Example",id:"example-21",level:4},{value:"Node Commands",id:"node-commands",level:2},{value:"node config show",id:"node-config-show",level:3},{value:"Syntax",id:"syntax-22",level:4},{value:"Parameters",id:"parameters-22",level:4},{value:"Example",id:"example-22",level:4},{value:"node config update",id:"node-config-update",level:3},{value:"Syntax",id:"syntax-23",level:4},{value:"Parameters",id:"parameters-23",level:4},{value:"Example",id:"example-23",level:4},{value:"node status",id:"node-status",level:3},{value:"Syntax",id:"syntax-24",level:4},{value:"Parameters",id:"parameters-24",level:4},{value:"Example",id:"example-24",level:4},{value:"node version",id:"node-version",level:3},{value:"Syntax",id:"syntax-25",level:4},{value:"Parameters",id:"parameters-25",level:4},{value:"Example",id:"example-25",level:4},{value:"node metric list",id:"node-metric-list",level:3},{value:"Syntax",id:"syntax-26",level:4},{value:"Parameters",id:"parameters-26",level:4},{value:"Example",id:"example-26",level:4},{value:"node metric source enable",id:"node-metric-source-enable",level:3},{value:"Syntax",id:"syntax-27",level:4},{value:"Parameters",id:"parameters-27",level:4},{value:"Example",id:"example-27",level:4},{value:"node metric source disable",id:"node-metric-source-disable",level:3},{value:"Syntax",id:"syntax-28",level:4},{value:"Parameters",id:"parameters-28",level:4},{value:"Example",id:"example-28",level:4},{value:"node metric source list",id:"node-metric-source-list",level:3},{value:"Syntax",id:"syntax-29",level:4},{value:"Parameters",id:"parameters-29",level:4},{value:"Example",id:"example-29",level:4},{value:"node unit list",id:"node-unit-list",level:3},{value:"Syntax",id:"syntax-30",level:4},{value:"Parameters",id:"parameters-30",level:4},{value:"Example",id:"example-30",level:4},{value:"Disaster Recovery Commands",id:"disaster-recovery-commands",level:2},{value:"recovery partitions restart",id:"recovery-partitions-restart",level:3},{value:"Syntax",id:"syntax-31",level:4},{value:"Parameters",id:"parameters-31",level:4},{value:"Example",id:"example-31",level:4},{value:"recovery partitions reset",id:"recovery-partitions-reset",level:3},{value:"Syntax",id:"syntax-32",level:4},{value:"Parameters",id:"parameters-32",level:4},{value:"Example",id:"example-32",level:4},{value:"recovery partitions states",id:"recovery-partitions-states",level:3},{value:"Syntax",id:"syntax-33",level:4},{value:"Parameters",id:"parameters-33",level:4},{value:"Example",id:"example-33",level:4},{value:"recovery cluster reset",id:"recovery-cluster-reset",level:3},{value:"Syntax",id:"syntax-34",level:4},{value:"Parameters",id:"parameters-34",level:4},{value:"Example",id:"example-34",level:4},{value:"recovery cluster migrate",id:"recovery-cluster-migrate",level:3},{value:"Syntax",id:"syntax-35",level:4},{value:"Parameters",id:"parameters-35",level:4},{value:"Example",id:"example-35",level:4},{value:"Distribution Commands",id:"distribution-commands",level:2},{value:"distribution reset",id:"distribution-reset",level:3},{value:"Syntax",id:"syntax-36",level:4},{value:"Parameters",id:"parameters-36",level:4},{value:"Example",id:"example-36",level:4},{value:"Miscellaneous Commands",id:"miscellaneous-commands",level:2},{value:"connect",id:"connect",level:3},{value:"Syntax",id:"syntax-37",level:4},{value:"Parameters",id:"parameters-37",level:4},{value:"Example",id:"example-37",level:4},{value:"disconnect",id:"disconnect",level:3},{value:"Syntax",id:"syntax-38",level:4},{value:"Parameters",id:"parameters-38",level:4},{value:"Example",id:"example-38",level:4},{value:"clear",id:"clear",level:3},{value:"Syntax",id:"syntax-39",level:4},{value:"Parameters",id:"parameters-39",level:4},{value:"Example",id:"example-39",level:4},{value:"cls",id:"cls",level:3},{value:"Syntax",id:"syntax-40",level:4},{value:"Parameters",id:"parameters-40",level:4},{value:"Example",id:"example-40",level:4},{value:"exit",id:"exit",level:3},{value:"Syntax",id:"syntax-41",level:4},{value:"Parameters",id:"parameters-41",level:4},{value:"Example",id:"example-41",level:4},{value:"help",id:"help",level:3},{value:"Syntax",id:"syntax-42",level:4},{value:"Parameters",id:"parameters-42",level:4},{value:"Example",id:"example-42",level:4},{value:"version",id:"version",level:3},{value:"Syntax",id:"syntax-43",level:4},{value:"Parameters",id:"parameters-43",level:4},{value:"Example",id:"example-43",level:4}];function x(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:["\n",(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(n.p,{children:"The Apache Ignite CLI communicates with the cluster via the REST API, allowing you to configure the entire cluster or apply node-specific settings. You can run the CLI either in the interactive mode or execute commands without entering it."}),"\n",(0,i.jsx)(n.h3,{id:"interactive-cli-mode",children:"Interactive CLI Mode"}),"\n",(0,i.jsxs)(n.p,{children:["To use the CLI in the interactive mode, first ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/quick-start/getting-started-guide#start-the-ignite-cli",children:"run"})," it, then configure the ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config",children:"cluster"})," or ",(0,i.jsx)(n.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config",children:"node"})," using the ",(0,i.jsx)(n.code,{children:"update"})," command."]}),"\n",(0,i.jsx)(n.p,{children:"For example, to add a new user to the cluster:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'cluster config update ignite.security.authentication.providers.default.users=[{username=newuser,displayName=newuser,password="newpassword",passwordEncoding=PLAIN,roles=[system]}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"non-interactive-cli-mode",children:"Non-Interactive CLI Mode"}),"\n",(0,i.jsx)(n.p,{children:"Non-interactive mode is useful for quick updates or when running commands in scripts."}),"\n",(0,i.jsxs)(n.p,{children:["When running commands non-interactively, enclose arguments in quotation marks to ensure that special POSIX characters (such as ",(0,i.jsx)(n.code,{children:"{"})," and ",(0,i.jsx)(n.code,{children:"}"}),") are interpreted correctly:"]}),"\n",(0,i.jsxs)(d.A,{groupId:"operating-systems",children:[(0,i.jsx)(t.A,{value:"linux",label:"Linux",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'bin/ignite3 cluster config update "ignite.schemaSync={delayDurationMillis=500,maxClockSkewMillis=500}"\n'})})}),(0,i.jsx)(t.A,{value:"windows",label:"Windows",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'bin/ignite3.bat cluster config update "ignite.schemaSync={delayDurationMillis=500,maxClockSkewMillis=500}"\n'})})})]}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, you can use the backslash (",(0,i.jsx)(n.code,{children:"\\"}),") to escape all special characters in your command. For example:"]}),"\n",(0,i.jsxs)(d.A,{groupId:"operating-systems",children:[(0,i.jsx)(t.A,{value:"linux",label:"Linux",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'bin/ignite3 cluster config update ignite.security.authentication.providers.default.users=\\[\\{username\\=newuser,displayName\\=newuser,password\\=\\"newpassword\\",passwordEncoding\\=PLAIN,roles\\=\\[system\\]\\}\\]\n'})})}),(0,i.jsx)(t.A,{value:"windows",label:"Windows",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'bin/ignite3.bat cluster config update ignite.security.authentication.providers.default.users=\\[\\{username\\=newuser,displayName\\=newuser,password\\=\\"newpassword\\",passwordEncoding\\=PLAIN,roles\\=\\[system\\]\\}\\]\n'})})})]}),"\n",(0,i.jsx)(n.p,{children:"Non-interactive mode is also useful in automation scripts. For example, you can set configuration items in a Bash script as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'#!/bin/bash\r\n\r\n...\r\n\r\nbin/ignite3 cluster config update "ignite.schemaSync={delayDurationMillis=500,maxClockSkewMillis=500}"\r\n\r\nbin/ignite3 cluster config update "ignite.security.authentication.providers.default.users=[{username=newuser,displayName=newuser,password=\\"newpassword\\",passwordEncoding=PLAIN,roles=[system]}]"\n'})}),"\n",(0,i.jsx)(n.h3,{id:"verbose-output",children:"Verbose Output"}),"\n",(0,i.jsxs)(n.p,{children:["All CLI commands can provide additional output that can be helpful in debugging. You can specify the ",(0,i.jsx)(n.code,{children:"-v"})," option multiple times to increase output verbosity. Single option shows REST request and response, second option (-vv) shows request headers, third one (-vvv) shows request body."]}),"\n",(0,i.jsx)(n.h3,{id:"cli-tool-logs",children:"CLI Tool Logs"}),"\n",(0,i.jsx)(n.p,{children:"CLI tool stores extended logs for your operations. These logs contain additional information not displayed during normal operation. You can configure the directory in the following ways:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["By setting the ",(0,i.jsx)(n.code,{children:"IGNITE_CLI_LOGS_DIR"})," environment variable to the directory where logs will be stored."]}),"\n",(0,i.jsxs)(n.li,{children:["By setting the ",(0,i.jsx)(n.code,{children:"$XDG_STATE_HOME"})," environment variable to set the CLI home folder. This configuration variable follows the ",(0,i.jsx)(n.a,{href:"https://specifications.freedesktop.org/basedir-spec/latest/",children:"XDG Base Directory Specification"})," and does not override the ",(0,i.jsx)(n.code,{children:"IGNITE_CLI_LOGS_DIR"}),". If ",(0,i.jsx)(n.code,{children:"$XDG_STATE_HOME"})," is set and ",(0,i.jsx)(n.code,{children:"IGNITE_CLI_LOGS_DIR"})," is not, logs will be stored in ",(0,i.jsx)(n.code,{children:"$XDG_STATE_HOME/ignitecli/logs"})," directory."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If neither of the above properties are set, the logs are stored in the following locations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["On Unix systems and MacOS, in the ",(0,i.jsx)(n.code,{children:"~/.local/state/ignitecli/logs"})," directory;"]}),"\n",(0,i.jsxs)(n.li,{children:["On Windows, in the ",(0,i.jsx)(n.code,{children:"%USERPROFILE%\\.local\\state\\ignitecli\\logs"})," folder."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"sql-commands",children:"SQL Commands"}),"\n",(0,i.jsx)(n.p,{children:"These commands help you execute SQL queries against the cluster."}),"\n",(0,i.jsx)(n.h3,{id:"sql",children:"sql"}),"\n",(0,i.jsx)(n.p,{children:"Executes SQL query or enters the interactive SQL editor mode if no SQL query is specified."}),"\n",(0,i.jsx)(n.h4,{id:"syntax",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sql [--jdbc-url=] [--plain] [--file=] [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--jdbc-url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"JDBC url to ignite cluster (e.g., 'jdbc:ignite:thin://127.0.0.1:10800')."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--plain"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--file"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Path to file with SQL commands to execute."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"SQL query to execute."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'sql "SELECT * FROM PUBLIC.PERSON"\n'})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"sql-planner-invalidate-cache",children:"sql planner invalidate-cache"}),"\n",(0,i.jsx)(n.p,{children:"Invalidates SQL planner cache."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-1",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sql planner invalidate-cache [--tables=] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-1",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--tables"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Comma-separated list of tables."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint. It can be any node URL. If not set, the default URL from the profile settings will be used."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-1",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sql planner invalidate-cache --tables=PUBLIC.PERSON,PUBLIC.ORDERS\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"cli-configuration-commands",children:"CLI Configuration Commands"}),"\n",(0,i.jsx)(n.p,{children:"These commands help you configure Apache Ignite CLI tool profiles and settings."}),"\n",(0,i.jsx)(n.h3,{id:"cli-config-profile-create",children:"cli config profile create"}),"\n",(0,i.jsx)(n.p,{children:"Creates a profile with the given name."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-2",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cli config profile create [--activate] [--copy-from=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-2",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--activate"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Activate new profile as current."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--copy-from"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Profile whose content will be copied to new one."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Name of new profile."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-2",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"cli config profile create --activate --copy-from=default myprofile\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cli-config-profile-activate",children:"cli config profile activate"}),"\n",(0,i.jsx)(n.p,{children:"Activates the profile identified by name."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-3",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cli config profile activate [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-3",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Name of profile to activate."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-3",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cli config profile activate myprofile\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cli-config-profile-list",children:"cli config profile list"}),"\n",(0,i.jsx)(n.p,{children:"Lists configuration profiles."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-4",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cli config profile list [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-4",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,i.jsx)(n.h4,{id:"example-4",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cli config profile list\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cli-config-profile-show",children:"cli config profile show"}),"\n",(0,i.jsx)(n.p,{children:"Gets the current profile details."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-5",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cli config profile show [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-5",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,i.jsx)(n.h4,{id:"example-5",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cli config profile show\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cli-config-get",children:"cli config get"}),"\n",(0,i.jsx)(n.p,{children:"Gets the value for the specified configuration key."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-6",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cli config get [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-6",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Property name."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-6",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cli config get ignite.jdbc-url\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cli-config-set",children:"cli config set"}),"\n",(0,i.jsx)(n.p,{children:"Sets configuration parameters using comma-separated input key-value pairs."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-7",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cli config set [--profile=] [--verbose] ...\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-7",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"..."})}),(0,i.jsx)(n.td,{children:"Arguments"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"CLI configuration parameters."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-7",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cli config set ignite.jdbc-url=http://localhost:10300\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cli-config-show",children:"cli config show"}),"\n",(0,i.jsx)(n.p,{children:"Shows the currently active configuration."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-8",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cli config show [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-8",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-8",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cli config show\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cli-config-remove",children:"cli config remove"}),"\n",(0,i.jsx)(n.p,{children:"Removes the specified configuration key."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-9",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cli config remove [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-9",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Property name."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-9",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cli config remove ignite.jdbc-url\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"cluster-commands",children:"Cluster Commands"}),"\n",(0,i.jsx)(n.p,{children:"These commands help you manage your cluster."}),"\n",(0,i.jsx)(n.h3,{id:"cluster-config-show",children:"cluster config show"}),"\n",(0,i.jsx)(n.p,{children:"Shows configuration of the cluster indicated by the endpoint URL and, optionally, by a configuration path selector."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-10",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster config show [--url=] [--format=] [--profile=] [--verbose] []\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-10",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--format"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Output format. Valid values: JSON, HOCON (Default: HOCON)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Configuration path selector."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-10",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster config show\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-config-update",children:"cluster config update"}),"\n",(0,i.jsx)(n.p,{children:"Updates configuration of the cluster indicated by the endpoint URL with the provided argument values."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-11",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster config update [--url=] [--file=] [--profile=] [--verbose] [...]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-11",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--file"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Path to file with config update commands to execute."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"..."})}),(0,i.jsx)(n.td,{children:"Arguments"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Configuration arguments and values to update."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-11",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster config update ignite.system.idleSafeTimeSyncIntervalMillis=250\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-init",children:"cluster init"}),"\n",(0,i.jsx)(n.p,{children:"Initializes an Ignite cluster."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-12",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster init --name= [--metastorage-group=] [--cluster-management-group=] [--config=] [--config-files=] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-12",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--name"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Human-readable name of the cluster."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--metastorage-group"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Metastorage group nodes (comma-separated list)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--cluster-management-group"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Names of nodes that will host the Cluster Management Group (comma-separated list)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--config"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Cluster configuration that will be applied during initialization."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--config-files"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Path to cluster configuration files (comma-separated list)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-12",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster init --name=myCluster\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-status",children:"cluster status"}),"\n",(0,i.jsx)(n.p,{children:"Prints status of the cluster."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-13",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster status [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-13",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-13",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster status --url http://localhost:10300\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-topology-physical",children:"cluster topology physical"}),"\n",(0,i.jsx)(n.p,{children:"Shows physical topology of the specified cluster."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-14",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster topology physical [--plain] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-14",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--plain"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-14",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster topology physical --url http://localhost:10300\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-topology-logical",children:"cluster topology logical"}),"\n",(0,i.jsx)(n.p,{children:"Shows logical topology of the specified cluster."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-15",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster topology logical [--plain] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-15",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--plain"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-15",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster topology logical --url http://localhost:10300\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-unit-deploy",children:"cluster unit deploy"}),"\n",(0,i.jsx)(n.p,{children:"Deploys a unit from a file or a directory (non-recursively)."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-16",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster unit deploy --version= --path= [--nodes=] [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-16",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--version"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Unit version (x.y.z)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--path"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Path to deployment unit file or directory."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--nodes"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Initial set of nodes where the unit will be deployed (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Deployment unit identifier."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-16",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster unit deploy --version=1.0.0 --path=/path/to/unit.jar myunit\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-unit-undeploy",children:"cluster unit undeploy"}),"\n",(0,i.jsx)(n.p,{children:"Undeploys a unit."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-17",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster unit undeploy --version= [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-17",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--version"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Unit version (x.y.z)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Unit id."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-17",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster unit undeploy --version=1.0.0 --url http://localhost:10300 myunit\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-unit-list",children:"cluster unit list"}),"\n",(0,i.jsx)(n.p,{children:"Shows a list of deployed units for specified deployment unit."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-18",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster unit list [--version=] [--status=] [--plain] [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-18",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--version"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Filters out deployment unit by version (exact match assumed)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--status"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Filters out deployment unit by status (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--plain"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Deployment unit id."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-18",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster unit list --status=DEPLOYED,STARTING myunit\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-metric-source-enable",children:"cluster metric source enable"}),"\n",(0,i.jsx)(n.p,{children:"Enables cluster metric source."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-19",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster metric source enable [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-19",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Metric source name."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-19",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster metric source enable jvm\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-metric-source-disable",children:"cluster metric source disable"}),"\n",(0,i.jsx)(n.p,{children:"Disables cluster metric source."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-20",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster metric source disable [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-20",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Metric source name."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-20",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster metric source disable jvm\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cluster-metric-source-list",children:"cluster metric source list"}),"\n",(0,i.jsx)(n.p,{children:"Lists cluster metric sources."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-21",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cluster metric source list [--plain] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-21",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--plain"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-21",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cluster metric source list\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"node-commands",children:"Node Commands"}),"\n",(0,i.jsx)(n.p,{children:"These commands help you manage individual nodes."}),"\n",(0,i.jsx)(n.h3,{id:"node-config-show",children:"node config show"}),"\n",(0,i.jsx)(n.p,{children:"Shows node configuration."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-22",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node config show [--url=] [--format=] [--profile=] [--verbose] []\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-22",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--format"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Output format. Valid values: JSON, HOCON (Default: HOCON)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Configuration path selector."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-22",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node config show ignite.clientConnector\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"node-config-update",children:"node config update"}),"\n",(0,i.jsx)(n.p,{children:"Updates node configuration."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-23",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node config update [--url=] [--file=] [--profile=] [--verbose] [...]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-23",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--file"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Path to file with config update commands to execute."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"..."})}),(0,i.jsx)(n.td,{children:"Arguments"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Configuration arguments and values to update."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-23",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node config update --url http://localhost:10300 ignite.clientConnector.connectTimeoutMillis=5000\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"node-status",children:"node status"}),"\n",(0,i.jsx)(n.p,{children:"Prints status of the node."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-24",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node status [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-24",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-24",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node status\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"node-version",children:"node version"}),"\n",(0,i.jsx)(n.p,{children:"Prints the node build version."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-25",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node version [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-25",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-25",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node version\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"node-metric-list",children:"node metric list"}),"\n",(0,i.jsx)(n.p,{children:"Lists node metrics."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-26",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node metric list [--url=] [--plain] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-26",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--plain"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-26",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node metric list\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"node-metric-source-enable",children:"node metric source enable"}),"\n",(0,i.jsx)(n.p,{children:"Enables node metric source."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-27",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node metric source enable [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-27",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Metric source name."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-27",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node metric source enable jvm\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"node-metric-source-disable",children:"node metric source disable"}),"\n",(0,i.jsx)(n.p,{children:"Disables node metric source."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-28",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node metric source disable [--url=] [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-28",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Metric source name."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-28",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node metric source disable jvm\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"node-metric-source-list",children:"node metric source list"}),"\n",(0,i.jsx)(n.p,{children:"Lists node metric sources."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-29",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node metric source list [--url=] [--plain] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-29",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--plain"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-29",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node metric source list --plain\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"node-unit-list",children:"node unit list"}),"\n",(0,i.jsx)(n.p,{children:"Shows a list of deployed units."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-30",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"node unit list [--version=] [--status=] [--url=] [--plain] [--profile=] [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-30",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--version"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Filters out deployment unit by version (exact match assumed)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--status"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Filters out deployment unit by status (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--plain"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Deployment unit id."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-30",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"node unit list --status=DEPLOYED myunit\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"disaster-recovery-commands",children:"Disaster Recovery Commands"}),"\n",(0,i.jsx)(n.p,{children:"These commands let you recover data partitions in disaster scenarios and recover system RAFT groups."}),"\n",(0,i.jsx)(n.h3,{id:"recovery-partitions-restart",children:"recovery partitions restart"}),"\n",(0,i.jsx)(n.p,{children:"Restarts partitions."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-31",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"recovery partitions restart --zone= --table= [--partitions=] [--nodes=] [--with-cleanup] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-31",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--zone"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Name of the zone to reset partitions of. Case-sensitive, without quotes."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--table"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Fully-qualified name of the table to reset partitions of. Case-sensitive, without quotes."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--partitions"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"IDs of partitions to get states. All partitions if not set (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--nodes"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Names specifying nodes to get partition states from. Case-sensitive, without quotes, all nodes if not set (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--with-cleanup"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Restarts partitions, preceded by a storage cleanup. This will remove all data from the partition storages before restart."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-31",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"recovery partitions restart --zone=default --table=PUBLIC.PERSON --with-cleanup\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"recovery-partitions-reset",children:"recovery partitions reset"}),"\n",(0,i.jsx)(n.p,{children:"Resets partitions."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-32",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"recovery partitions reset --zone= [--table=] [--partitions=] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-32",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--zone"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Name of the zone to reset partitions of. Case-sensitive, without quotes."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--table"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Fully-qualified name of the table to reset partitions of. Case-sensitive, without quotes."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--partitions"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"IDs of partitions to get states. All partitions if not set (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-32",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"recovery partitions reset --zone=default --table=PUBLIC.PERSON\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"recovery-partitions-states",children:"recovery partitions states"}),"\n",(0,i.jsx)(n.p,{children:"Returns partition states."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-33",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"recovery partitions states (--global | --local) [--nodes=] [--partitions=] [--zones=] [--plain] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-33",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--global"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Gets global partition states. One of global or local is required."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--local"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Gets local partition states. One of global or local is required."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--nodes"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Names specifying nodes to get partition states from. Case-sensitive, without quotes, all nodes if not set (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--partitions"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"IDs of partitions to get states. All partitions if not set (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--zones"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Names specifying zones to get partition states from. Case-sensitive, without quotes, all zones if not set (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--plain"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Display output with plain formatting."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-33",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"recovery partitions states --local --zones=default\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"recovery-cluster-reset",children:"recovery cluster reset"}),"\n",(0,i.jsx)(n.p,{children:"Resets cluster."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-34",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"recovery cluster reset [--cluster-management-group=] [--metastorage-replication-factor=] [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-34",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--cluster-management-group"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Names of nodes that will host the Cluster Management Group (comma-separated)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--metastorage-replication-factor"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Number of nodes in the voting member set of the Metastorage RAFT group."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-34",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"recovery cluster reset\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"recovery-cluster-migrate",children:"recovery cluster migrate"}),"\n",(0,i.jsx)(n.p,{children:"Migrates nodes missed during repair to repaired cluster."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-35",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"recovery cluster migrate --old-cluster-url= --new-cluster-url= [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-35",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--old-cluster-url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"URL of old cluster endpoint (nodes of this cluster will be migrated to a new cluster)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--new-cluster-url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"URL of new cluster endpoint (nodes of old cluster will be migrated to this cluster)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-35",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"recovery cluster migrate --old-cluster-url=http://old-cluster:10300 --new-cluster-url=http://new-cluster:10300\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"distribution-commands",children:"Distribution Commands"}),"\n",(0,i.jsx)(n.p,{children:"These commands help you manage table partition distribution."}),"\n",(0,i.jsx)(n.h3,{id:"distribution-reset",children:"distribution reset"}),"\n",(0,i.jsx)(n.p,{children:"Resets distribution of partitions."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-36",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"distribution reset --zones= [--url=] [--profile=] [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-36",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--zones"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Names specifying zones to reset the distribution state in (comma-separated)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--url"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"URL of cluster endpoint."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--profile"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Local CLI profile name (only available in non-interactive mode)."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-36",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"distribution reset --zones=default\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"miscellaneous-commands",children:"Miscellaneous Commands"}),"\n",(0,i.jsx)(n.p,{children:"These are general-purpose commands."}),"\n",(0,i.jsx)(n.h3,{id:"connect",children:"connect"}),"\n",(0,i.jsx)(n.p,{children:"Connects to an Ignite 3 node."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-37",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"connect --username= --password= [--verbose] \n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-37",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--username"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Username to connect to cluster."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--password"})}),(0,i.jsx)(n.td,{children:"Option"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"Password to connect to cluster."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:""})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsx)(n.td,{children:"URL of a node that will be used as a communication endpoint."})]})]})]}),"\n",(0,i.jsx)(n.h4,{id:"example-37",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"connect --username=admin --password=password http://localhost:10300\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"disconnect",children:"disconnect"}),"\n",(0,i.jsx)(n.p,{children:"Disconnects from an Ignite 3 node."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-38",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"disconnect [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-38",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,i.jsx)(n.h4,{id:"example-38",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"disconnect\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"clear",children:"clear"}),"\n",(0,i.jsx)(n.p,{children:"Clears the screen."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-39",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"clear\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-39",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:"None"})}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"This command takes no parameters."})]})})]}),"\n",(0,i.jsx)(n.h4,{id:"example-39",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"clear\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cls",children:"cls"}),"\n",(0,i.jsx)(n.p,{children:"Clears the screen."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-40",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"cls [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-40",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,i.jsx)(n.h4,{id:"example-40",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cls\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"exit",children:"exit"}),"\n",(0,i.jsx)(n.p,{children:"Exits the CLI."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-41",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"exit [--verbose]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-41",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--verbose"})}),(0,i.jsx)(n.td,{children:"Flag"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"Show additional information: logs, REST calls."})]})})]}),"\n",(0,i.jsx)(n.h4,{id:"example-41",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"exit\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"help",children:"help"}),"\n",(0,i.jsx)(n.p,{children:"Display help information about the specified command."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-42",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"help [COMMAND]\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-42",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"[COMMAND]"})}),(0,i.jsx)(n.td,{children:"Argument"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"The COMMAND to display the usage help message for."})]})})]}),"\n",(0,i.jsx)(n.h4,{id:"example-42",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"help cluster config show\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"version",children:"version"}),"\n",(0,i.jsx)(n.p,{children:"Displays the current CLI tool version."}),"\n",(0,i.jsx)(n.h4,{id:"syntax-43",children:"Syntax"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"version\n"})}),"\n",(0,i.jsx)(n.h4,{id:"parameters-43",children:"Parameters"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:"None"})}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"This command takes no parameters."})]})})]}),"\n",(0,i.jsx)(n.h4,{id:"example-43",children:"Example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"version\n"})})]})}function j(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/f99b384c.d83d49ad.js b/docs/ignite3/assets/js/f99b384c.d83d49ad.js deleted file mode 100644 index 122eda9e19..0000000000 --- a/docs/ignite3/assets/js/f99b384c.d83d49ad.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[5687],{10577:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>d,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"sql-reference/distribution-zones","title":"Distribution Zones","description":"{/*","source":"@site/versioned_docs/version-3.0.0/sql-reference/distribution-zones.md","sourceDirName":"sql-reference","slug":"/sql-reference/distribution-zones","permalink":"/docs/ignite3/3.0.0/sql-reference/distribution-zones","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Distribution Zones","sidebar_label":"Distribution Zones"},"sidebar":"tutorialSidebar","previous":{"title":"Transactions","permalink":"/docs/ignite3/3.0.0/sql-reference/transactions"},"next":{"title":"Data Types","permalink":"/docs/ignite3/3.0.0/sql-reference/data-types"}}');var t=s(74848),l=s(28453);const d={title:"Distribution Zones",sidebar_label:"Distribution Zones"},r=void 0,a={},o=[{value:"CREATE ZONE",id:"create-zone",level:2},{value:"Keywords and parameters",id:"keywords-and-parameters",level:3},{value:"Examples",id:"examples",level:3},{value:"ALTER ZONE",id:"alter-zone",level:2},{value:"ALTER ZONE RENAME TO new_qualified_zone_name",id:"alter-zone-rename-to-new_qualified_zone_name",level:3},{value:"Keywords and parameters",id:"keywords-and-parameters-1",level:3},{value:"Examples",id:"examples-1",level:3},{value:"ALTER ZONE SET",id:"alter-zone-set",level:3},{value:"Keywords and parameters",id:"keywords-and-parameters-2",level:3},{value:"Examples",id:"examples-2",level:3},{value:"DROP ZONE",id:"drop-zone",level:2},{value:"Keywords and parameters",id:"keywords-and-parameters-3",level:3},{value:"Examples",id:"examples-3",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:["\n",(0,t.jsx)(n.p,{children:"This section describes Apache Ignite 3 distribution zones. In Apache Ignite 3, you can fine-tune distribution of your partitions on nodes for better performance and stability."}),"\n",(0,t.jsx)(n.h2,{id:"create-zone",children:"CREATE ZONE"}),"\n",(0,t.jsx)(n.p,{children:"Creates a new distribution zone."}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["This can also be done via the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/java-to-tables",children:"Java API"}),"."]})}),"\n","\n","\n",(0,t.jsx)(n.h3,{id:"keywords-and-parameters",children:"Keywords and parameters"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"IF NOT EXISTS"})," - create a zone only if a different zone with the same name does not exist."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"qualified_zone_name"})," - a name of the distribution zone. Can be specified as a case-sensitive string or case-insensitive identifier. Does not need to exist at the moment of table creation, and can be created before writing data."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"STORAGE PROFILES"})," - Required. Comma-separated list of the profiles of the storage engines to use."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"PARTITIONS"})," - the number of partition the data is divided into. Partitions are then split between nodes for storage."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"REPLICAS"})," - the number of copies of each partition."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"NODES FILTER"})," - specifies the nodes that can be used to store data in the distribution zone based on node attributes. You can configure node attributes by using cli. Filter uses JSONPath rules. If the attribute is not found, all negative comparisons will be valid. For example, ",(0,t.jsx)(n.code,{children:"$[?(@.storage != 'SSD']}"})," will also include nodes without the ",(0,t.jsx)(n.code,{children:"storage"})," attribute specified."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"AUTO SCALE UP"})," - Configures automatic scaling up of the distribution zone. Possible values:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"OFF"})," - disables the automatic distribution zone adjustment."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"integer"})," - the delay in seconds between the new node joining and the start of distribution zone adjustment. Possible values are between 0 and 2147483647. Default value: 5."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"AUTO SCALE DOWN"})," - Configures automatic scaling down of the distribution zone. Possible values:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"OFF"})," - disables the automatic distribution zone adjustment. Default value."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"integer"})," - the delay in seconds between the new node joining and the start of distribution zone adjustment. Possible values are between 0 and 2147483647."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"CONSISTENCY MODE"})," - how the zone handles partition majority losses. If set to ",(0,t.jsx)(n.code,{children:"STRONG CONSISTENCY"}),", the data will become unavailable until majority is restored (typically, this means nodes leaving and returning to the cluster). ",(0,t.jsx)(n.code,{children:"HIGH AVAILABILITY"})," means that the data will be written and read from remaining nodes, accepting possible data loss. Default value: ",(0,t.jsx)(n.code,{children:"STRONG_CONSISTENCY"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"QUORUM SIZE"})," - the size of the majority of nodes in the consensus of a replication group. Quorum size is determined by the replica count."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Minimal"})," value: ",(0,t.jsx)(n.code,{children:"1"})," if there is only one replica and ",(0,t.jsx)(n.code,{children:"2"})," if there is more than one.\r\n",(0,t.jsx)(n.em,{children:"Maximum"})," value: half the total number of replicas rounded up."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Default values"}),": ",(0,t.jsx)(n.code,{children:"3"})," if there are 5 and more replicas. Otherwise, the smallest of 2 and the total replica count."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Creates an ",(0,t.jsx)(n.code,{children:"exampleZone"})," distribution zone that is specified as a ",(0,t.jsx)(n.em,{children:"case-insensitive"})," identifier:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone STORAGE PROFILES['default'];\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Creates a ",(0,t.jsx)(n.code,{children:'"myExampleZone"'})," distribution zone that is specified as a ",(0,t.jsx)(n.em,{children:"case-sensitive"})," string:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS \"myExampleZone\" STORAGE PROFILES['default'];\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Creates an ",(0,t.jsx)(n.code,{children:"exampleZone"})," distribution zone that will adjust 300 seconds after cluster topology changes before adding nodes:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (AUTO SCALE UP 300) STORAGE PROFILES['default'];\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Creates an ",(0,t.jsx)(n.code,{children:"exampleZone"})," distribution zone that will wait 600 seconds before scaling down any idle nodes once the cluster topology changes:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (AUTO SCALE DOWN 600) STORAGE PROFILES['default'];\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Creates an ",(0,t.jsx)(n.code,{children:"exampleZone"})," distribution zone where data will only be stored on nodes that have SSD attribute:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (NODES FILTER '$[?(@.storage == \"SSD\")]') STORAGE PROFILES['default'];\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The example above assumes that there are nodes that have the attribute set as shown in the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",children:"node filtering"})," example."]})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Creates an ",(0,t.jsx)(n.code,{children:"exampleZone"})," distribution zone with consistency mode set to ",(0,t.jsx)(n.code,{children:"HIGH_AVAILABILITY"}),":"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE IF NOT EXISTS exampleZone (REPLICAS 5, CONSISTENCY MODE 'HIGH_AVAILABILITY') STORAGE PROFILES['default'];\n"})}),"\n",(0,t.jsx)(n.h2,{id:"alter-zone",children:"ALTER ZONE"}),"\n",(0,t.jsx)(n.p,{children:"Modifies a distribution zone."}),"\n",(0,t.jsx)(n.h3,{id:"alter-zone-rename-to-new_qualified_zone_name",children:"ALTER ZONE RENAME TO new_qualified_zone_name"}),"\n","\n",(0,t.jsx)(n.h3,{id:"keywords-and-parameters-1",children:"Keywords and parameters"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a zone with the specified name does not exist."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"qualified_zone_name"})," - the current name of the distribution zone."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"RENAME TO"})," - renames the selected zone to the new name."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"new_qualified_zone_name"})," - the new name of the distribution zone (assigned by ",(0,t.jsx)(n.code,{children:"RENAME"}),")."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"examples-1",children:"Examples"}),"\n",(0,t.jsxs)(n.p,{children:["Renames the ",(0,t.jsx)(n.code,{children:"exampleZone"})," to ",(0,t.jsx)(n.code,{children:"renamedZone"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER ZONE IF EXISTS exampleZone RENAME TO renamedZone;\n"})}),"\n",(0,t.jsx)(n.h3,{id:"alter-zone-set",children:"ALTER ZONE SET"}),"\n","\n",(0,t.jsx)(n.h3,{id:"keywords-and-parameters-2",children:"Keywords and parameters"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a zone with the specified name does not exist."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"qualified_zone_name"})," - a name of the distribution zone."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"SET"})," - assigns values to any or all of the following parameters:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"PARTITIONS"})," - the number of partitions"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"REPLICAS"})," - the number of copies of each partition."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"NODES FILTER"})," - specifies the nodes that can be used to store data in the distribution zone based on node attributes."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"AUTO SCALE"})," - Configures automatic distribution zone adjustment. Possible values:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"OFF"})," - disables the automatic distribution zone adjustment. Default value."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"integer"})," - the delay in seconds between the new node joining and the start of distribution zone adjustment. Possible values are between 0 and 2147483647."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"AUTO SCALE UP"})," - Configures automatic scaling up of the distribution zone. Possible values:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"OFF"})," - disables the automatic distribution zone adjustment. Default value."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"integer"})," - the delay in seconds between the new node joining and the start of distribution zone adjustment. Possible values are between 0 and 2147483647."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"AUTO SCALE DOWN"})," - Configures automatic scaling down of the distribution zone. Possible values:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"OFF"})," - disables the automatic distribution zone adjustment. Default value."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"QUORUM SIZE"})," - the size of the majority of nodes in the consensus of a replication group. Quorum size is determined by the replica count."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Minimal"})," value: ",(0,t.jsx)(n.code,{children:"1"})," if there is only one replica and ",(0,t.jsx)(n.code,{children:"2"})," if there is more than one.\r\n",(0,t.jsx)(n.em,{children:"Maximum"})," value: half the total number of replicas rounded up."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"Default values"}),": ",(0,t.jsx)(n.code,{children:"3"})," if there are 5 and more replicas. Otherwise, the smallest of 2 and the total replica count."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"examples-2",children:"Examples"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Sets the number of data replicas to 10:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER ZONE IF EXISTS exampleZone SET REPLICAS 10;\n"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Sets data nodes filter to match the specific region, set the number of data replicas to 5 and quorum size to 3:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"ALTER ZONE IF EXISTS exampleZone SET (REPLICAS 5, QUORUM SIZE 3, NODES FILTER '$[?(@.region == \"US\")]');\n"})}),"\n",(0,t.jsx)(n.h2,{id:"drop-zone",children:"DROP ZONE"}),"\n",(0,t.jsx)(n.p,{children:"Drops an existing distribution zone."}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["This can also be done via the ",(0,t.jsx)(n.a,{href:"/docs/ignite3/3.0.0/developers-guide/java-to-tables",children:"Java API"}),"."]})}),"\n","\n",(0,t.jsx)(n.h3,{id:"keywords-and-parameters-3",children:"Keywords and parameters"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"IF EXISTS"})," - do not throw an error if a zone with the specified name does not exist."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"qualified_zone_name"})," - the name of the distribution zone."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"examples-3",children:"Examples"}),"\n",(0,t.jsx)(n.p,{children:"Drop Person table if the one exists:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sql",children:"DROP ZONE IF EXISTS exampleZone;\n"})})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>r});var i=s(96540);const t={},l=i.createContext(t);function d(e){const n=i.useContext(l);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/f9e4bc23.d4d62491.js b/docs/ignite3/assets/js/f9e4bc23.d4d62491.js deleted file mode 100644 index 7ebe0f8aa6..0000000000 --- a/docs/ignite3/assets/js/f9e4bc23.d4d62491.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[543],{28453:(e,n,r)=>{r.d(n,{R:()=>t,x:()=>a});var s=r(96540);const i={},l=s.createContext(i);function t(e){const n=s.useContext(l);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(l.Provider,{value:n},e.children)}},83890:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>t,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"api-reference/native-clients/dotnet/tables-api","title":"Tables API","description":"The Tables API provides type-safe data access through record views and key-value views. This API supports both strongly-typed operations using C# classes and schema-free operations using tuples.","source":"@site/docs/api-reference/native-clients/dotnet/tables-api.md","sourceDirName":"api-reference/native-clients/dotnet","slug":"/api-reference/native-clients/dotnet/tables-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Tables API","id":"tables-api","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Client API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api"},"next":{"title":"LINQ API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api"}}');var i=r(74848),l=r(28453);const t={title:"Tables API",id:"tables-api",sidebar_position:2},a="Tables API",c={},o=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"View Types",id:"view-types",level:3},{value:"Transaction Support",id:"transaction-support",level:3},{value:"Usage Examples",id:"usage-examples",level:2},{value:"Getting Tables",id:"getting-tables",level:3},{value:"Record View Operations",id:"record-view-operations",level:3},{value:"Key-Value View Operations",id:"key-value-view-operations",level:3},{value:"Binary View with Tuples",id:"binary-view-with-tuples",level:3},{value:"Batch Operations",id:"batch-operations",level:3},{value:"Conditional Operations",id:"conditional-operations",level:3},{value:"Get-and-Modify Operations",id:"get-and-modify-operations",level:3},{value:"LINQ Queries",id:"linq-queries",level:3},{value:"Reference",id:"reference",level:2},{value:"ITables Interface",id:"itables-interface",level:3},{value:"ITable Interface",id:"itable-interface",level:3},{value:"IRecordView<T> Interface",id:"irecordviewt-interface",level:3},{value:"IKeyValueView<TK, TV> Interface",id:"ikeyvalueviewtk-tv-interface",level:3},{value:"IIgniteTuple Interface",id:"iignitetuple-interface",level:3},{value:"Option<T> Type",id:"optiont-type",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"tables-api",children:"Tables API"})}),"\n",(0,i.jsx)(n.p,{children:"The Tables API provides type-safe data access through record views and key-value views. This API supports both strongly-typed operations using C# classes and schema-free operations using tuples."}),"\n",(0,i.jsx)(n.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,i.jsx)(n.p,{children:"Tables in Ignite 3 are accessed through view interfaces that provide different access patterns. Record views work with complete rows as single objects, while key-value views separate keys and values into distinct objects. Both patterns support typed access (using C# classes) and untyped access (using IIgniteTuple)."}),"\n",(0,i.jsx)(n.h3,{id:"view-types",children:"View Types"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Record View"})," treats each row as a single object containing all columns. Use this when your operations work with complete records."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Key-Value View"})," separates key columns from value columns into distinct objects. Use this when you primarily access data by key or when your schema naturally divides into key and value sections."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Binary View"})," provides untyped access using IIgniteTuple. Use this for dynamic schemas or when working with multiple table types through generic code."]}),"\n",(0,i.jsx)(n.h3,{id:"transaction-support",children:"Transaction Support"}),"\n",(0,i.jsx)(n.p,{children:"All data operations accept an optional transaction parameter. Pass null for auto-commit mode or pass an ITransaction instance to include operations in a transaction scope."}),"\n",(0,i.jsx)(n.h2,{id:"usage-examples",children:"Usage Examples"}),"\n",(0,i.jsx)(n.h3,{id:"getting-tables",children:"Getting Tables"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var tables = client.Tables;\r\n\r\n// Get table by name\r\nvar table = await tables.GetTableAsync("customers");\r\n\r\n// Get table by qualified name (schema.table)\r\nvar qualifiedName = QualifiedName.Of("public", "orders");\r\nvar table = await tables.GetTableAsync(qualifiedName);\r\n\r\n// List all tables\r\nvar allTables = await tables.GetTablesAsync();\n'})}),"\n",(0,i.jsx)(n.h3,{id:"record-view-operations",children:"Record View Operations"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'// Define a POCO class matching table schema\r\npublic class Customer\r\n{\r\n public long Id { get; set; }\r\n public string Name { get; set; }\r\n public string Email { get; set; }\r\n}\r\n\r\nvar table = await tables.GetTableAsync("customers");\r\nvar view = table.GetRecordView();\r\n\r\n// Insert or replace\r\nvar customer = new Customer { Id = 1, Name = "Alice", Email = "alice@example.com" };\r\nawait view.UpsertAsync(null, customer);\r\n\r\n// Get by key (only Id field used)\r\nvar key = new Customer { Id = 1 };\r\nvar result = await view.GetAsync(null, key);\r\nif (result.HasValue)\r\n{\r\n Console.WriteLine($"Found: {result.Value.Name}");\r\n}\r\n\r\n// Delete by key\r\nawait view.DeleteAsync(null, key);\n'})}),"\n",(0,i.jsx)(n.h3,{id:"key-value-view-operations",children:"Key-Value View Operations"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'public class OrderKey\r\n{\r\n public long OrderId { get; set; }\r\n}\r\n\r\npublic class OrderValue\r\n{\r\n public long CustomerId { get; set; }\r\n public DateTime OrderDate { get; set; }\r\n public decimal Amount { get; set; }\r\n}\r\n\r\nvar table = await tables.GetTableAsync("orders");\r\nvar view = table.GetKeyValueView();\r\n\r\n// Put key-value pair\r\nvar key = new OrderKey { OrderId = 100 };\r\nvar value = new OrderValue\r\n{\r\n CustomerId = 1,\r\n OrderDate = DateTime.UtcNow,\r\n Amount = 49.99m\r\n};\r\nawait view.PutAsync(null, key, value);\r\n\r\n// Get value by key\r\nvar result = await view.GetAsync(null, key);\r\nif (result.HasValue)\r\n{\r\n Console.WriteLine($"Amount: {result.Value.Amount}");\r\n}\r\n\r\n// Remove by key\r\nawait view.RemoveAsync(null, key);\n'})}),"\n",(0,i.jsx)(n.h3,{id:"binary-view-with-tuples",children:"Binary View with Tuples"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var table = await tables.GetTableAsync("products");\r\nvar view = table.RecordBinaryView;\r\n\r\n// Create tuple\r\nvar tuple = new IgniteTuple\r\n{\r\n ["id"] = 1L,\r\n ["name"] = "Widget",\r\n ["price"] = 29.99\r\n};\r\n\r\n// Upsert\r\nawait view.UpsertAsync(null, tuple);\r\n\r\n// Get by key tuple\r\nvar keyTuple = new IgniteTuple { ["id"] = 1L };\r\nvar result = await view.GetAsync(null, keyTuple);\r\nif (result.HasValue)\r\n{\r\n Console.WriteLine($"Price: {result.Value["price"]}");\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"batch-operations",children:"Batch Operations"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var view = table.GetRecordView();\r\n\r\n// Upsert multiple records\r\nvar customers = new[]\r\n{\r\n new Customer { Id = 1, Name = "Alice", Email = "alice@example.com" },\r\n new Customer { Id = 2, Name = "Bob", Email = "bob@example.com" },\r\n new Customer { Id = 3, Name = "Carol", Email = "carol@example.com" }\r\n};\r\nawait view.UpsertAllAsync(null, customers);\r\n\r\n// Get multiple records\r\nvar keys = new[]\r\n{\r\n new Customer { Id = 1 },\r\n new Customer { Id = 2 },\r\n new Customer { Id = 3 }\r\n};\r\nvar results = await view.GetAllAsync(null, keys);\n'})}),"\n",(0,i.jsx)(n.h3,{id:"conditional-operations",children:"Conditional Operations"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var view = table.GetRecordView();\r\nvar key = new Customer { Id = 1 };\r\n\r\n// Insert only if not exists\r\nvar inserted = await view.InsertAsync(null, customer);\r\n\r\n// Replace only if exists\r\nvar replaced = await view.ReplaceAsync(null, customer);\r\n\r\n// Replace with compare-and-swap\r\nvar oldRecord = new Customer { Id = 1, Name = "Alice", Email = "alice@example.com" };\r\nvar newRecord = new Customer { Id = 1, Name = "Alice", Email = "alice@newdomain.com" };\r\nvar swapped = await view.ReplaceAsync(null, oldRecord, newRecord);\n'})}),"\n",(0,i.jsx)(n.h3,{id:"get-and-modify-operations",children:"Get-and-Modify Operations"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var view = table.GetRecordView();\r\n\r\n// Upsert and get old value\r\nvar result = await view.GetAndUpsertAsync(null, customer);\r\nif (result.HasValue)\r\n{\r\n Console.WriteLine($"Replaced: {result.Value.Name}");\r\n}\r\n\r\n// Delete and get old value\r\nvar key = new Customer { Id = 1 };\r\nvar deleted = await view.GetAndDeleteAsync(null, key);\r\nif (deleted.HasValue)\r\n{\r\n Console.WriteLine($"Deleted: {deleted.Value.Name}");\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"linq-queries",children:"LINQ Queries"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-csharp",children:'var view = table.GetRecordView();\r\n\r\n// Use LINQ with queryable and ToListAsync\r\nvar results = await view.AsQueryable()\r\n .Where(c => c.Name.StartsWith("A"))\r\n .OrderBy(c => c.Email)\r\n .ToListAsync();\r\n\r\nforeach (var customer in results)\r\n{\r\n Console.WriteLine($"{customer.Name}: {customer.Email}");\r\n}\r\n\r\n// Alternative: use ToResultSetAsync for streaming results\r\nvar resultSet = await view.AsQueryable()\r\n .Where(c => c.Name.StartsWith("A"))\r\n .OrderBy(c => c.Email)\r\n .ToResultSetAsync();\r\n\r\nawait foreach (var customer in resultSet)\r\n{\r\n Console.WriteLine($"{customer.Name}: {customer.Email}");\r\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"reference",children:"Reference"}),"\n",(0,i.jsx)(n.h3,{id:"itables-interface",children:"ITables Interface"}),"\n",(0,i.jsx)(n.p,{children:"Methods for table discovery:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetTableAsync(string name)"})," - Get table by name, returns null if not found"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetTableAsync(QualifiedName name)"})," - Get table by schema-qualified name"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetTablesAsync()"})," - Get all available tables in the cluster"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"itable-interface",children:"ITable Interface"}),"\n",(0,i.jsx)(n.p,{children:"Properties:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Name"})," - Table name without schema qualifier"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"QualifiedName"})," - Full schema-qualified name"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"RecordBinaryView"})," - Untyped record view using IIgniteTuple"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"KeyValueBinaryView"})," - Untyped key-value view using IIgniteTuple"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"PartitionManager"})," - Advanced partition management"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Methods:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetRecordView()"})," - Create typed record view for type T"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetKeyValueView()"})," - Create typed key-value view with key type TK and value type TV"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"irecordviewt-interface",children:"IRecordView Interface"}),"\n",(0,i.jsx)(n.p,{children:"Read operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAsync(ITransaction?, T key)"})," - Get record by key, returns Option"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAllAsync(ITransaction?, IEnumerable keys)"})," - Get multiple records"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"ContainsKeyAsync(ITransaction?, T key)"})," - Check if key exists"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Write operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"UpsertAsync(ITransaction?, T record)"})," - Insert or replace record"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"UpsertAllAsync(ITransaction?, IEnumerable records)"})," - Insert or replace multiple records"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"InsertAsync(ITransaction?, T record)"})," - Insert only if not exists, returns bool"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"InsertAllAsync(ITransaction?, IEnumerable records)"})," - Insert multiple, returns list of skipped keys"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"ReplaceAsync(ITransaction?, T record)"})," - Replace existing record, returns bool"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"ReplaceAsync(ITransaction?, T record, T newRecord)"})," - Conditional replace (compare-and-swap)"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Delete operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"DeleteAsync(ITransaction?, T key)"})," - Delete by key, returns bool"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"DeleteAllAsync(ITransaction?, IEnumerable keys)"})," - Delete multiple, returns list of non-existent keys"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"DeleteExactAsync(ITransaction?, T record)"})," - Delete only if exact match on all columns"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"DeleteAllExactAsync(ITransaction?, IEnumerable records)"})," - Delete exact matches"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Get-and-modify operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAndUpsertAsync(ITransaction?, T record)"})," - Upsert and return old value"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAndReplaceAsync(ITransaction?, T record)"})," - Replace and return old value"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAndDeleteAsync(ITransaction?, T key)"})," - Delete and return old value"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Query operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"AsQueryable(ITransaction?, QueryableOptions?)"})," - Create LINQ queryable interface"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"ikeyvalueviewtk-tv-interface",children:"IKeyValueView Interface"}),"\n",(0,i.jsx)(n.p,{children:"Read operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAsync(ITransaction?, TK key)"})," - Get value by key, returns Option"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAllAsync(ITransaction?, IEnumerable keys)"})," - Get multiple values, returns Dictionary"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"ContainsAsync(ITransaction?, TK key)"})," - Check if key exists"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Write operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"PutAsync(ITransaction?, TK key, TV val)"})," - Put key-value pair"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"PutAllAsync(ITransaction?, IEnumerable> pairs)"})," - Put multiple pairs"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"PutIfAbsentAsync(ITransaction?, TK key, TV val)"})," - Put only if key absent, returns bool"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Replace operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"ReplaceAsync(ITransaction?, TK key, TV val)"})," - Replace value for existing key, returns bool"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"ReplaceAsync(ITransaction?, TK key, TV oldVal, TV newVal)"})," - Conditional replace"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Remove operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"RemoveAsync(ITransaction?, TK key)"})," - Remove by key, returns bool"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"RemoveAsync(ITransaction?, TK key, TV val)"})," - Remove only if value matches"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"RemoveAllAsync(ITransaction?, IEnumerable keys)"})," - Remove multiple by key"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"RemoveAllAsync(ITransaction?, IEnumerable> pairs)"})," - Remove by key-value pairs"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Get-and-modify operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAndPutAsync(ITransaction?, TK key, TV val)"})," - Put and return old value"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAndReplaceAsync(ITransaction?, TK key, TV val)"})," - Replace and return old value"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetAndRemoveAsync(ITransaction?, TK key)"})," - Remove and return value"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Query operations:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"AsQueryable(ITransaction?, QueryableOptions?)"})," - Create LINQ queryable interface"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"iignitetuple-interface",children:"IIgniteTuple Interface"}),"\n",(0,i.jsx)(n.p,{children:"Properties:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"FieldCount"})," - Number of columns in the tuple"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"this[int ordinal]"})," - Get or set column value by ordinal position"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"this[string name]"})," - Get or set column value by name"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Methods:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetName(int ordinal)"})," - Get column name by ordinal"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetOrdinal(string name)"})," - Get column ordinal by name (returns -1 if not found)"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Static methods:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"GetHashCode(IIgniteTuple)"})," - Compute hash considering names and values"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Equals(IIgniteTuple?, IIgniteTuple?)"})," - Compare tuples ignoring column order"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"ToString(IIgniteTuple)"})," - Generate string representation"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"optiont-type",children:"Option Type"}),"\n",(0,i.jsx)(n.p,{children:"The Option type wraps nullable results:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"HasValue"})," - True if value exists"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Value"})," - The actual value (throws if HasValue is false)"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"This pattern avoids null reference issues and makes null handling explicit."})]})}function u(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/f9e65627.4a4cba79.js b/docs/ignite3/assets/js/f9e65627.4a4cba79.js deleted file mode 100644 index 37c2cc4c8c..0000000000 --- a/docs/ignite3/assets/js/f9e65627.4a4cba79.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8125],{12559:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"develop/work-with-data/code-deployment","title":"Code Deployment","description":"When working with Ignite 3, you may need to deploy user code to cluster nodes so that it can be executed across the cluster, as shown in the Distributed Computing section.","source":"@site/docs/develop/work-with-data/code-deployment.md","sourceDirName":"develop/work-with-data","slug":"/develop/work-with-data/code-deployment","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/code-deployment","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"code-deployment","title":"Code Deployment"},"sidebar":"tutorialSidebar","previous":{"title":"Object Serialization","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/serialization"},"next":{"title":"Working with Events","permalink":"/docs/ignite3/3.1.0/develop/work-with-data/events"}}');var s=t(74848),o=t(28453);const r={id:"code-deployment",title:"Code Deployment"},d=void 0,l={},a=[{value:"Deploying Units with Folder Structures",id:"deploying-units-with-folder-structures",level:2},{value:"Deployment Unit Location",id:"deployment-unit-location",level:2},{value:"Deploy New Unit",id:"deploy-new-unit",level:2},{value:"Deploy via CLI",id:"deploy-via-cli",level:3},{value:"Deploy via REST",id:"deploy-via-rest",level:3},{value:"Deploy Manually",id:"deploy-manually",level:3},{value:"Getting Unit Information",id:"getting-unit-information",level:2},{value:"Get Unit Information via CLI",id:"get-unit-information-via-cli",level:3},{value:"Get Unit Information via REST",id:"get-unit-information-via-rest",level:3},{value:"Undeploying Unit",id:"undeploying-unit",level:2},{value:"Undeploy via CLI",id:"undeploy-via-cli",level:3},{value:"Undeploy via REST",id:"undeploy-via-rest",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["When working with Ignite 3, you may need to deploy user code to cluster nodes so that it can be executed across the cluster, as shown in the ",(0,s.jsx)(n.a,{href:"./compute",children:"Distributed Computing"})," section."]}),"\n",(0,s.jsxs)(n.p,{children:["In Ignite 3 the code is deployed as an immutable ",(0,s.jsx)(n.strong,{children:"deployment unit"})," with a unique ID and version."]}),"\n",(0,s.jsx)(n.p,{children:"While there are no strict policies on what a deployment unit can contain, Ignite 3 currently supports compute jobs implemented in Java and .NET."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"You can invoke compute job execution from any client (.NET, Java, C++, etc. ), but the job itself must be written in Java or .NET."})}),"\n",(0,s.jsx)(n.p,{children:"If you want to use any other programming language in a compute job, you must load that file as part of the job's code. A code file deployed on its own will not be loaded by the JVM and thus cannot be used directly."}),"\n",(0,s.jsx)(n.p,{children:"The example below demonstrates how to load a script that is packaged within a JAR's resources:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'public class MyJob implements ComputeJob {\r\n @Override\r\n public CompletableFuture executeAsync(JobExecutionContext ctx, String arg) {\r\n Ignite ignite = ctx.ignite();\r\n\r\n /** Full path to the script we want to run */\r\n final String resPath = "/org/apache/ignite/example/code/deployment/resources/script.sh";\r\n\r\n try (InputStream in = MyJob.class.getResourceAsStream(resPath)) {\r\n if (in == null) {\r\n throw new IllegalStateException("Resource not found: " + resPath);\r\n }\r\n\r\n byte[] script = in.readAllBytes();\r\n\r\n Process p = new ProcessBuilder("sh", "-s", "--", arg)\r\n .redirectErrorStream(true)\r\n .start();\r\n\r\n try (OutputStream os = p.getOutputStream()) {\r\n os.write(script);\r\n }\r\n\r\n String out;\r\n try (InputStream procOut = p.getInputStream()) {\r\n out = new String(procOut.readAllBytes(), StandardCharsets.UTF_8).strip();\r\n }\r\n\r\n int exit = p.waitFor();\r\n if (exit != 0) {\r\n throw new RuntimeException("Script exited with code " + exit + ":\\n" + out);\r\n }\r\n\r\n String result = "Node: " + ignite.name()\r\n + "\\nArg: " + arg\r\n + "\\nScript output:\\n" + out;\r\n\r\n return CompletableFuture.completedFuture(result);\r\n } catch (Exception e) {\r\n throw new RuntimeException("Failed to run script", e);\r\n }\r\n }\r\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["You can manage deployment units using either ",(0,s.jsx)(n.a,{href:"/3.1.0/tools/cli-commands",children:"CLI"})," commands or the ",(0,s.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/openapi.yaml",children:"REST API"}),". Both methods provide the same functionality for deploying, listing, and undeploying code."]}),"\n",(0,s.jsx)(n.h2,{id:"deploying-units-with-folder-structures",children:"Deploying Units with Folder Structures"}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Currently, you can only deploy ZIP archives via REST."})}),"\n",(0,s.jsx)(n.p,{children:"Apache Ignite supports deploying units that contain folder structures using ZIP archives. You can package complex deployment units with multiple files organized in directories, which are automatically extracted and preserved during deployment."}),"\n",(0,s.jsx)(n.p,{children:"To deploy your code this way, package your files into a ZIP archive and deploy it to the cluster. Apache Ignite will preserve the folder structure."}),"\n",(0,s.jsx)(n.h2,{id:"deployment-unit-location",children:"Deployment Unit Location"}),"\n",(0,s.jsxs)(n.p,{children:["By default, nodes store the deployment units in the ",(0,s.jsx)(n.code,{children:"{IGNITE_HOME}/work/deployment"})," directory. This can be changed with the ",(0,s.jsx)(n.a,{href:"/3.1.0/configure-and-operate/reference/node-configuration",children:(0,s.jsx)(n.code,{children:"ignite.deployment.location"})})," node configuration parameter."]}),"\n",(0,s.jsx)(n.p,{children:"The deployment units have the following structure:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"deployment\r\n\u251c\u2500 unit1Id\r\n\u2502 \u251c\u2500 version1\r\n\u2502 \u2514\u2500 version2\r\n\u2514\u2500 unit2Id\r\n \u251c\u2500 version1\r\n \u2514\u2500 version2\n"})}),"\n",(0,s.jsx)(n.p,{children:"Each deployment unit is stored in a separate directory, with each version having its own subdirectory."}),"\n",(0,s.jsx)(n.h2,{id:"deploy-new-unit",children:"Deploy New Unit"}),"\n",(0,s.jsx)(n.p,{children:"Deploying a new unit requires specifying a unique string ID for the code and a version number."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"To update the code, deploy a new unit. The new unit can use the same ID as the existing one, but it must have a different version."})}),"\n",(0,s.jsx)(n.h3,{id:"deploy-via-cli",children:"Deploy via CLI"}),"\n",(0,s.jsxs)(n.p,{children:["When deploying a new unit, use ",(0,s.jsx)(n.code,{children:"cluster unit deploy"})," command with unit's ID and set the following options:"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"version"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," Deployment unit version in ",(0,s.jsx)(n.code,{children:"x.y.z"})," format. If a unit with the same name and version already exists, a ",(0,s.jsx)(n.code,{children:"Unit already exists"})," error will be thrown."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"path"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," Path to the deployment unit file or directory. It is recommended to use an absolute path."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"nodes"}),(0,s.jsxs)(n.td,{children:["Defines the target nodes for deployment. Use ",(0,s.jsx)(n.code,{children:"ALL"})," to deploy to every node immediately, ",(0,s.jsx)(n.code,{children:"MAJORITY"})," to deploy to enough nodes for a management group majority (with remaining nodes updated later), or list specific node names (comma-separated) for immediate deployment to those nodes."]})]})]})]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["You cannot deploy multiple units simultaneously, you need to run ",(0,s.jsx)(n.code,{children:"unit deploy"})," command separately for each file you want to deploy."]})}),"\n",(0,s.jsx)(n.p,{children:"For example, to deploy to the majority of nodes use the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit deploy test-unit --version 1.0.0 --path $ABSOLUTE_PATH_TO_CODE_UNIT --nodes MAJORITY\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Here ",(0,s.jsx)(n.code,{children:"$ABSOLUTE_PATH_TO_CODE_UNIT"})," refers to the absolute path to the code unit file or directory."]}),"\n",(0,s.jsx)(n.h3,{id:"deploy-via-rest",children:"Deploy via REST"}),"\n",(0,s.jsxs)(n.p,{children:["To deploy a new unit via the REST API, send a ",(0,s.jsx)(n.code,{children:"POST"})," request to the ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/units/{unitId}/{unitVersion}"})," endpoint with the following parameters:"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"unitId"}),(0,s.jsx)(n.td,{children:"path"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," Unique unit ID. If a deployment unit with this ID does not exist, it is created."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"unitVersion"}),(0,s.jsx)(n.td,{children:"path"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"}),' Unique version of the deployment unit. If a deployment unit with the specified ID and version already exists, HTTP 409 "Conflict" response is returned.']})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"unitContent"}),(0,s.jsx)(n.td,{children:"file (multipart)"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," JAR file to deploy, provided as a file upload via multipart/form-data."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"deployMode"}),(0,s.jsx)(n.td,{children:"query"}),(0,s.jsxs)(n.td,{children:["Defines how many nodes the unit will be deployed to. If set to ",(0,s.jsx)(n.code,{children:"MAJORITY"}),", the unit will be deployed to enough nodes to form cluster management group majority. If set to ",(0,s.jsx)(n.code,{children:"ALL"}),", the unit will be deployed to all nodes. Cannot be used with the ",(0,s.jsx)(n.code,{children:"initialNodes"})," parameter."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"initialNodes"}),(0,s.jsx)(n.td,{children:"query"}),(0,s.jsxs)(n.td,{children:["The list of names of specific nodes to deploy the unit to. Cannot be used with the ",(0,s.jsx)(n.code,{children:"deployMode"})," parameter."]})]})]})]}),"\n",(0,s.jsx)(n.p,{children:"For example, you can deploy a new unit to specific nodes in your local cluster as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'curl -X POST \'http://localhost:10300/management/v1/deployment/units/unit/1.0.0?initialNodes=node1,node2\' \\\r\n -H "Content-Type: multipart/form-data" \\\r\n -F "unitContent=@/path/to/your/unit.jar"\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["You can target nodes using either the ",(0,s.jsx)(n.code,{children:"deployMode"})," or ",(0,s.jsx)(n.code,{children:"initialNodes"})," parameter. These options serve the same purpose as the similar CLI parameters, ensuring the unit propagates as needed."]}),"\n",(0,s.jsxs)(n.li,{children:["For additional details see the corresponding ",(0,s.jsx)(n.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/openapi.yaml",children:"API documentation"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"deploy-manually",children:"Deploy Manually"}),"\n",(0,s.jsx)(n.p,{children:"If necessary, you can deploy a new unit manually by adding your code to the deployment unit storage on the node. Unlike other deployment options, node restart is required to load new deployment units."}),"\n",(0,s.jsx)(n.p,{children:"To deploy the code:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Find the ",(0,s.jsx)(n.a,{href:"#deployment-unit-location",children:"deployment unit location"})," on the node."]}),"\n",(0,s.jsx)(n.li,{children:"Create a new directory. This directory will be used as the deployment unit ID."}),"\n",(0,s.jsxs)(n.li,{children:["Create a new subdirectory. This directory will be used as the deployment unit version. You must use ",(0,s.jsx)(n.a,{href:"https://semver.org/",children:"semantic version"})," as its name."]}),"\n",(0,s.jsx)(n.li,{children:"Add your code to the subdirectory."}),"\n",(0,s.jsx)(n.li,{children:"Restart the node to load the new code."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"As a result, your directory structure may look like this:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"deployment\r\n\u2514\u2500 myUnit\r\n \u2514\u2500 1.0.0\r\n \u2514\u2500 [code files]\n"})}),"\n",(0,s.jsx)(n.h2,{id:"getting-unit-information",children:"Getting Unit Information"}),"\n",(0,s.jsx)(n.p,{children:"This section explains how get all deployments on the cluster or on a specific node, view unit details such as status and version, and search or filter deployments by these attributes."}),"\n",(0,s.jsx)(n.h3,{id:"get-unit-information-via-cli",children:"Get Unit Information via CLI"}),"\n",(0,s.jsxs)(n.p,{children:["You can list deployment units using ",(0,s.jsx)(n.code,{children:"unit list"})," command."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["When you run the ",(0,s.jsx)(n.code,{children:"unit list"})," command in the CLI, the output shows a list of deployment units. An asterisk (*) indicates the active version, which is always the highest ",(0,s.jsx)(n.a,{href:"https://semver.org/",children:"semantic version"}),", regardless of deployment order."]})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.code,{children:"cluster unit list"})," command to see all deployed units on the cluster."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Use ",(0,s.jsx)(n.code,{children:"node unit list"})," command to view only the units on the node where the command is executed."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Pass the unit's ID to the command to get information for the specific unit:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit list test-unit\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Search units by adding ",(0,s.jsx)(n.code,{children:"version"})," command options:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit list test-unit --version 1.0.0\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Or filter by ",(0,s.jsx)(n.code,{children:"status"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit list test-unit --status deployed\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"statuses"}),(0,s.jsxs)(n.td,{children:["Filter units by status.",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"UPLOADING"})," - the unit is being deployed to the cluster",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"DEPLOYED"})," - the unit is deployed to the cluster and can be used",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"OBSOLETE"})," - the command to remove unit has been received, but it is still used in some jobs",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"REMOVING"})," - the unit is being removed",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),"If not specified, deployment units in all statuses will be returned."]})]})})]}),"\n",(0,s.jsx)(n.h3,{id:"get-unit-information-via-rest",children:"Get Unit Information via REST"}),"\n",(0,s.jsxs)(n.p,{children:["You can also retrieve deployment unit details via ",(0,s.jsx)(n.code,{children:"GET"})," requests."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["To get information for a specific unit on a node or across the cluster, use ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/node/units/{unitId}"})," and ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/cluster/units/{unitId}"})," respectively."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl -X GET 'http://localhost:10300/management/v1/deployment/cluster/units/test-unit/1.0.0'\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["To list all deployment units for the node or across the cluster, use ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/node/units"})," and ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/cluster/units"})," respectively."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl -X GET 'http://localhost:10300/management/v1/deployment/cluster/units/'\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You can further narrow down the search by looking up only deployments with specific versions or statuses."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"unitId"}),(0,s.jsx)(n.td,{children:"path"}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.strong,{children:"Required"})," Unique unit ID of the deployment unit."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"version"}),(0,s.jsx)(n.td,{children:"query"}),(0,s.jsx)(n.td,{children:"Unique version of the deployment unit. If not specified, all versions of deployment unit will be returned."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"statuses"}),(0,s.jsx)(n.td,{children:"query"}),(0,s.jsxs)(n.td,{children:["Statuses of the deployment units to return. Possible values:",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"UPLOADING"})," - the unit is being deployed to the cluster",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"DEPLOYED"})," - the unit is deployed to the cluster and can be used",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"OBSOLETE"})," - the command to remove unit has been received, but it is still used in some jobs",(0,s.jsx)("br",{}),"- ",(0,s.jsx)(n.code,{children:"REMOVING"})," - the unit is being removed",(0,s.jsx)("br",{}),(0,s.jsx)("br",{}),"If not specified, deployment units in all statuses will be returned."]})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"undeploying-unit",children:"Undeploying Unit"}),"\n",(0,s.jsx)(n.p,{children:"When you no longer need a deployment unit version, you can undeploy it from the cluster."}),"\n",(0,s.jsx)(n.h3,{id:"undeploy-via-cli",children:"Undeploy via CLI"}),"\n",(0,s.jsxs)(n.p,{children:["Use the ",(0,s.jsx)(n.code,{children:"cluster unit undeploy"})," command. Provide unit ID and unit ",(0,s.jsx)(n.code,{children:"version"})," to remove."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cluster unit undeploy test-unit --version 1.0.0\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"You cannot undeploy all units with the same ID at once, you must remove them by version."}),"\n",(0,s.jsx)(n.li,{children:"When you undeploy a unit that has multiple versions, the active code rolls back to the next most recent version, determined by the version number."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"undeploy-via-rest",children:"Undeploy via REST"}),"\n",(0,s.jsxs)(n.p,{children:["To undeploy a unit from specific nodes, use a ",(0,s.jsx)(n.code,{children:"DELETE"})," request to ",(0,s.jsx)(n.code,{children:"/management/v1/deployment/units/{unitId}/{unitVersion}"})," endpoint."]}),"\n",(0,s.jsx)(n.p,{children:"For instance, to undeploy the same unit from nodes node1 and node2, use the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl -X DELETE 'http://localhost:10300/management/v1/deployment/units/test-unit/1.0.0?nodes=node1,node2'\n"})}),"\n",(0,s.jsxs)(n.p,{children:["When the cluster receives the request, it will delete the specified deployment unit version on all nodes.\r\nIf the unit is used in a job, it will instead be moved to the ",(0,s.jsx)(n.code,{children:"OBSOLETE"})," status and removed once it is no longer required."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>d});var i=t(96540);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/fb00ac63.44cf6122.js b/docs/ignite3/assets/js/fb00ac63.44cf6122.js deleted file mode 100644 index 7206b96a76..0000000000 --- a/docs/ignite3/assets/js/fb00ac63.44cf6122.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3574],{28453:(n,e,i)=>{i.d(e,{R:()=>s,x:()=>a});var t=i(96540);const r={},o=t.createContext(r);function s(n){const e=t.useContext(o);return t.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:s(n.components),t.createElement(o.Provider,{value:e},n.children)}},89735:(n,e,i)=>{i.r(e),i.d(e,{assets:()=>c,contentTitle:()=>a,default:()=>g,frontMatter:()=>s,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"installation/migration-from-ai2/index","title":"Migration From Apache Ignite 2","description":"{/*","source":"@site/versioned_docs/version-3.0.0/installation/migration-from-ai2/index.md","sourceDirName":"installation/migration-from-ai2","slug":"/installation/migration-from-ai2/","permalink":"/docs/ignite3/3.0.0/installation/migration-from-ai2/","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Migration From Apache Ignite 2","sidebar_label":"Migration From Apache Ignite 2"},"sidebar":"tutorialSidebar","previous":{"title":"Installing on Kubernetes","permalink":"/docs/ignite3/3.0.0/installation/installing-to-k8s"},"next":{"title":"Getting Started","permalink":"/docs/ignite3/3.0.0/quick-start/getting-started-guide"}}');var r=i(74848),o=i(28453);const s={title:"Migration From Apache Ignite 2",sidebar_label:"Migration From Apache Ignite 2"},a=void 0,c={},l=[{value:"Configuration Migration",id:"configuration-migration",level:2},{value:"Node Configuration",id:"node-configuration",level:3},{value:"Storage Configuration",id:"storage-configuration",level:4},{value:"Client Configuration",id:"client-configuration",level:4},{value:"Network Configuration",id:"network-configuration",level:4},{value:"REST API Configuration",id:"rest-api-configuration",level:4},{value:"Cluster Configuration",id:"cluster-configuration",level:3},{value:"Handling Events",id:"handling-events",level:4},{value:"Metrics Collection",id:"metrics-collection",level:4},{value:"Code Migration",id:"code-migration",level:2}];function d(n){const e={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:["\n",(0,r.jsx)(e.p,{children:"This section describes how to configure an Apache Ignite 3 cluster into which you will migrate all the components of your Apache Ignite 2 cluster."}),"\n",(0,r.jsx)(e.h2,{id:"configuration-migration",children:"Configuration Migration"}),"\n",(0,r.jsx)(e.p,{children:"You need to configure the cluster you have created to match the Apache Ignite 2 cluster you are migrating from."}),"\n",(0,r.jsx)(e.p,{children:"While cluster configurations in Apache Ignite 2 are XML beans, in Apache Ignite 3 they are in HOCON format. Moreover, many configuration structures in version 3 are different from those in version 2."}),"\n",(0,r.jsxs)(e.p,{children:['In Apache Ignite 3, the configuration file has a single root "node," called ',(0,r.jsx)(e.code,{children:"ignite"}),". All configuration sections are children, grandchildren, etc., of that node."]}),"\n",(0,r.jsx)(e.admonition,{type:"note",children:(0,r.jsx)(e.p,{children:"In Apache Ignite 3, you can create and maintain the configuration in either JSON or HOCON format."})}),"\n",(0,r.jsx)(e.p,{children:"For example:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json",children:'{\r\n "ignite" : {\r\n "network" : {\r\n "nodeFinder" : {\r\n "netClusterNodes" : ["localhost:3344"]\r\n },\r\n "port" : 3344\r\n },\r\n "storage" : {\r\n "profiles" : [\r\n {\r\n "name" : "persistent",\r\n "engine" : "aipersist"\r\n }\r\n ]\r\n },\r\n "nodeAttributes.nodeAttributes" : {\r\n "region" : "US",\r\n "storage" : "SSD"\r\n }\r\n }\r\n}\n'})}),"\n",(0,r.jsx)(e.p,{children:"When migrating your environment Apache Ignite 3 configuration is split between Cluster, Node and distribution zone configurations."}),"\n",(0,r.jsx)(e.h3,{id:"node-configuration",children:"Node Configuration"}),"\n",(0,r.jsx)(e.p,{children:"Node configuration stores information about the locally running node."}),"\n",(0,r.jsx)(e.h4,{id:"storage-configuration",children:"Storage Configuration"}),"\n",(0,r.jsx)(e.p,{children:"Apache Ignite 3 storage is configured in a completely different manner from Apache Ignite 2."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["First, you configure ",(0,r.jsx)(e.strong,{children:"storage engine"})," properties, which may include properties like page size or checkpoint frequency."]}),"\n",(0,r.jsxs)(e.li,{children:["Then, you create a ",(0,r.jsx)(e.strong,{children:"storage profile"}),", which defines a specific storage that will be used."]}),"\n",(0,r.jsxs)(e.li,{children:["Then, you create a ",(0,r.jsx)(e.strong,{children:"distribution zone"})," using the storage profile, which can be further used to fine-tune the storage by defining where and how to store data across the cluster."]}),"\n",(0,r.jsxs)(e.li,{children:["Finally, each ",(0,r.jsx)(e.strong,{children:"table"})," can be assigned to the distribution zone, or directly to a storage profile."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Note:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"Only tables and distribution zones can be configured from code. Storage profiles and engines must be configured by updating node configuration and restarting node."}),"\n",(0,r.jsx)(e.li,{children:"Custom affinity functions are replaced by distribution zones."}),"\n",(0,r.jsx)(e.li,{children:"External storage is supported via cache storage that must be configured by using SQL."}),"\n"]}),"\n",(0,r.jsx)(e.h4,{id:"client-configuration",children:"Client Configuration"}),"\n",(0,r.jsxs)(e.p,{children:['All clients in Apache Ignite 3 are "thin", and use a similar ',(0,r.jsx)(e.code,{children:"clientConnector"})," configuration. See ",(0,r.jsx)(e.a,{href:"/docs/ignite3/3.0.0/developers-guide/clients/",children:"Apache Ignite Clients"})," section for more information on configuring client connector."]}),"\n",(0,r.jsx)(e.h4,{id:"network-configuration",children:"Network Configuration"}),"\n",(0,r.jsxs)(e.p,{children:["Node network configuration is now performed in the ",(0,r.jsx)(e.code,{children:"network"})," section of the ",(0,r.jsx)(e.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config",children:"node configuration"}),"."]}),"\n",(0,r.jsx)(e.h4,{id:"rest-api-configuration",children:"REST API Configuration"}),"\n",(0,r.jsx)(e.p,{children:"REST API is a significant part of Apache Ignite 3. It can be used for multiple purposes, including cluster and node configuration and running SQL requests."}),"\n",(0,r.jsxs)(e.p,{children:["You can configure REST properties in ",(0,r.jsx)(e.a,{href:"/docs/ignite3/3.0.0/administrators-guide/config/node-config",children:"node configuration"}),"."]}),"\n",(0,r.jsx)(e.h3,{id:"cluster-configuration",children:"Cluster Configuration"}),"\n",(0,r.jsx)(e.p,{children:"Cluster configuration applies to all nodes in the cluster. It is automatically propagated across the cluster from the node you apply in at."}),"\n",(0,r.jsx)(e.h4,{id:"handling-events",children:"Handling Events"}),"\n",(0,r.jsx)(e.p,{children:"Events configuration is simplified in Apache Ignite 3. It is separated in 2 configurations:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["Event ",(0,r.jsx)(e.strong,{children:"channels"})," define what is collected."]}),"\n",(0,r.jsxs)(e.li,{children:["Event ",(0,r.jsx)(e.strong,{children:"sinks"})," define where the data is sent."]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["In the current release, only ",(0,r.jsx)(e.code,{children:"log"})," sink are supported. You can configure events as described in the ",(0,r.jsx)(e.a,{href:"/docs/ignite3/3.0.0/developers-guide/events/",children:"Events"})," section."]}),"\n",(0,r.jsx)(e.h4,{id:"metrics-collection",children:"Metrics Collection"}),"\n",(0,r.jsx)(e.p,{children:"Apache Ignite 3 has metrics disabled by default."}),"\n",(0,r.jsx)(e.p,{children:"All metrics are grouped according to their metric sources, and are enabled in cluster configuration per metric source."}),"\n",(0,r.jsx)(e.p,{children:"Then, these metrics will be available in Apache Ignite JMX beans."}),"\n",(0,r.jsxs)(e.p,{children:["For instructions on configuring metrics, see ",(0,r.jsx)(e.a,{href:"/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics",children:"Metrics Configuration"}),"."]}),"\n",(0,r.jsx)(e.h2,{id:"code-migration",children:"Code Migration"}),"\n",(0,r.jsx)(e.p,{children:"Code written for Apache Ignite 2 cannot be directly reused, however as most concepts remain similar, code migration should not take too much time."})]})}function g(n={}){const{wrapper:e}={...(0,o.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(d,{...n})}):d(n)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/fcc8bf93.d2ca1d25.js b/docs/ignite3/assets/js/fcc8bf93.d2ca1d25.js deleted file mode 100644 index 4470812964..0000000000 --- a/docs/ignite3/assets/js/fcc8bf93.d2ca1d25.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[675],{28453:(n,e,t)=>{t.d(e,{R:()=>a,x:()=>o});var r=t(96540);const i={},s=r.createContext(i);function a(n){const e=r.useContext(s);return r.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:a(n.components),r.createElement(s.Provider,{value:e},n.children)}},57337:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"api-reference/native-clients/cpp/transactions-api","title":"Transactions API","description":"The Transactions API provides explicit transaction control for operations across tables and SQL statements. Transactions ensure atomic, consistent, isolated, and durable data modifications.","source":"@site/docs/api-reference/native-clients/cpp/transactions-api.md","sourceDirName":"api-reference/native-clients/cpp","slug":"/api-reference/native-clients/cpp/transactions-api","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Transactions API","id":"transactions-api","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"SQL API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api"},"next":{"title":"Compute API","permalink":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api"}}');var i=t(74848),s=t(28453);const a={title:"Transactions API",id:"transactions-api",sidebar_position:4},o="Transactions API",c={},l=[{value:"Key Concepts",id:"key-concepts",level:2},{value:"Transaction Lifecycle",id:"transaction-lifecycle",level:3},{value:"Explicit vs Implicit Transactions",id:"explicit-vs-implicit-transactions",level:3},{value:"Transaction Isolation",id:"transaction-isolation",level:3},{value:"Transaction Options",id:"transaction-options",level:3},{value:"Basic Usage",id:"basic-usage",level:2},{value:"Beginning Transactions",id:"beginning-transactions",level:3},{value:"Committing Transactions",id:"committing-transactions",level:3},{value:"Rolling Back Transactions",id:"rolling-back-transactions",level:3},{value:"Table Operations",id:"table-operations",level:2},{value:"Using Transactions with Record Views",id:"using-transactions-with-record-views",level:3},{value:"Using Transactions with Key-Value Views",id:"using-transactions-with-key-value-views",level:3},{value:"Batch Operations",id:"batch-operations",level:3},{value:"SQL Operations",id:"sql-operations",level:2},{value:"Executing SQL in Transactions",id:"executing-sql-in-transactions",level:3},{value:"Cross-Table Transactions",id:"cross-table-transactions",level:3},{value:"Transaction Options",id:"transaction-options-1",level:2},{value:"Configuring Timeout",id:"configuring-timeout",level:3},{value:"Read-Only Transactions",id:"read-only-transactions",level:3},{value:"Chaining Options",id:"chaining-options",level:3},{value:"Transaction Visibility",id:"transaction-visibility",level:2},{value:"Uncommitted Changes",id:"uncommitted-changes",level:3},{value:"Isolation from Other Transactions",id:"isolation-from-other-transactions",level:3},{value:"Asynchronous Transactions",id:"asynchronous-transactions",level:2},{value:"Async Begin",id:"async-begin",level:3},{value:"Async Begin with Options",id:"async-begin-with-options",level:3},{value:"Error Handling",id:"error-handling",level:2},{value:"Handling Commit Failures",id:"handling-commit-failures",level:3},{value:"Handling Operation Failures",id:"handling-operation-failures",level:3},{value:"Timeout Handling",id:"timeout-handling",level:3},{value:"Best Practices",id:"best-practices",level:2},{value:"Keep Transactions Short",id:"keep-transactions-short",level:3},{value:"Use Read-Only for Queries",id:"use-read-only-for-queries",level:3},{value:"Handle Errors Properly",id:"handle-errors-properly",level:3},{value:"Use RAII for Automatic Cleanup",id:"use-raii-for-automatic-cleanup",level:3},{value:"Reference",id:"reference",level:2}];function d(n){const e={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...n.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.header,{children:(0,i.jsx)(e.h1,{id:"transactions-api",children:"Transactions API"})}),"\n",(0,i.jsx)(e.p,{children:"The Transactions API provides explicit transaction control for operations across tables and SQL statements. Transactions ensure atomic, consistent, isolated, and durable data modifications."}),"\n",(0,i.jsx)(e.h2,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,i.jsx)(e.h3,{id:"transaction-lifecycle",children:"Transaction Lifecycle"}),"\n",(0,i.jsx)(e.p,{children:"Transactions begin through the transactions factory. They remain active until committed or rolled back. Operations within a transaction see uncommitted changes from that transaction. Other transactions see data as it existed before the transaction started."}),"\n",(0,i.jsx)(e.h3,{id:"explicit-vs-implicit-transactions",children:"Explicit vs Implicit Transactions"}),"\n",(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:"Explicit transactions"})," require manual commit or rollback. Pass the transaction pointer to operations. This provides control over transaction boundaries."]}),"\n",(0,i.jsxs)(e.p,{children:[(0,i.jsx)(e.strong,{children:"Implicit transactions"})," commit automatically after each operation. Pass ",(0,i.jsx)(e.code,{children:"nullptr"})," to operations for implicit transactions."]}),"\n",(0,i.jsx)(e.h3,{id:"transaction-isolation",children:"Transaction Isolation"}),"\n",(0,i.jsx)(e.p,{children:"Transactions use snapshot isolation. Each transaction sees a consistent snapshot of data from transaction start time. Changes within a transaction are visible to that transaction but not to others until commit."}),"\n",(0,i.jsx)(e.h3,{id:"transaction-options",children:"Transaction Options"}),"\n",(0,i.jsx)(e.p,{children:"Configure transaction behavior through options:"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"timeout"})," - Maximum transaction duration"]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"read_only"})," - Optimize for read-only workloads"]}),"\n"]}),"\n",(0,i.jsx)(e.h2,{id:"basic-usage",children:"Basic Usage"}),"\n",(0,i.jsx)(e.h3,{id:"beginning-transactions",children:"Beginning Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Start a transaction with default options:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"using namespace ignite;\r\n\r\nauto transactions = client.get_transactions();\r\nauto tx = transactions.begin();\n"})}),"\n",(0,i.jsx)(e.p,{children:"Start with options:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"transaction_options opts;\r\nopts.set_timeout_millis(30000); // 30 seconds\r\nopts.set_read_only(false);\r\n\r\nauto tx = transactions.begin(opts);\n"})}),"\n",(0,i.jsx)(e.p,{children:"Use async begin:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"transactions.begin_async([](ignite_result result) {\r\n if (!result.has_error()) {\r\n auto tx = std::move(result).value();\r\n // Use transaction\r\n }\r\n});\n"})}),"\n",(0,i.jsx)(e.h3,{id:"committing-transactions",children:"Committing Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Commit to persist changes:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"auto tx = transactions.begin();\r\n\r\n// Perform operations\r\ntx.commit();\n"})}),"\n",(0,i.jsx)(e.p,{children:"Use async commit:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:'tx.commit_async([](ignite_result result) {\r\n if (!result.has_error()) {\r\n std::cout << "Transaction committed" << std::endl;\r\n }\r\n});\n'})}),"\n",(0,i.jsx)(e.h3,{id:"rolling-back-transactions",children:"Rolling Back Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Rollback to discard changes:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"auto tx = transactions.begin();\r\n\r\ntry {\r\n // Perform operations\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n tx.rollback();\r\n throw;\r\n}\n"})}),"\n",(0,i.jsx)(e.p,{children:"Use async rollback:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:'tx.rollback_async([](ignite_result result) {\r\n if (!result.has_error()) {\r\n std::cout << "Transaction rolled back" << std::endl;\r\n }\r\n});\n'})}),"\n",(0,i.jsx)(e.h2,{id:"table-operations",children:"Table Operations"}),"\n",(0,i.jsx)(e.h3,{id:"using-transactions-with-record-views",children:"Using Transactions with Record Views"}),"\n",(0,i.jsx)(e.p,{children:"Pass transaction pointer to record view operations:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:'auto tx = client.get_transactions().begin();\r\n\r\nauto table = client.get_tables().get_table("accounts").value();\r\nauto view = table.get_record_binary_view();\r\n\r\ntry {\r\n ignite_tuple record{\r\n {"id", 42},\r\n {"name", "John Doe"},\r\n {"balance", 1000.0}\r\n };\r\n\r\n view.upsert(&tx, record);\r\n\r\n auto retrieved = view.get(&tx, ignite_tuple{{"id", 42}});\r\n\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n tx.rollback();\r\n throw;\r\n}\n'})}),"\n",(0,i.jsx)(e.h3,{id:"using-transactions-with-key-value-views",children:"Using Transactions with Key-Value Views"}),"\n",(0,i.jsx)(e.p,{children:"Pass transaction to key-value operations:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:'auto tx = client.get_transactions().begin();\r\n\r\nauto table = client.get_tables().get_table("accounts").value();\r\nauto view = table.get_key_value_binary_view();\r\n\r\ntry {\r\n ignite_tuple key{{"id", 42}};\r\n ignite_tuple value{{"name", "John Doe"}, {"balance", 1000.0}};\r\n\r\n view.put(&tx, key, value);\r\n auto retrieved = view.get(&tx, key);\r\n\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n tx.rollback();\r\n throw;\r\n}\n'})}),"\n",(0,i.jsx)(e.h3,{id:"batch-operations",children:"Batch Operations"}),"\n",(0,i.jsx)(e.p,{children:"Batch operations execute within a transaction:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:'auto tx = client.get_transactions().begin();\r\n\r\nstd::vector records{\r\n {{"id", 1}, {"name", "Alice"}, {"balance", 1000.0}},\r\n {{"id", 2}, {"name", "Bob"}, {"balance", 2000.0}},\r\n {{"id", 3}, {"name", "Charlie"}, {"balance", 3000.0}}\r\n};\r\n\r\ntry {\r\n view.upsert_all(&tx, records);\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n tx.rollback();\r\n throw;\r\n}\n'})}),"\n",(0,i.jsx)(e.h2,{id:"sql-operations",children:"SQL Operations"}),"\n",(0,i.jsx)(e.h3,{id:"executing-sql-in-transactions",children:"Executing SQL in Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Pass transaction to SQL operations:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:'auto tx = client.get_transactions().begin();\r\n\r\ntry {\r\n auto sql = client.get_sql();\r\n\r\n sql.execute(&tx, nullptr,\r\n sql_statement("INSERT INTO accounts VALUES (?, ?, ?)"),\r\n {42, std::string("John Doe"), 1000.0});\r\n\r\n sql.execute(&tx, nullptr,\r\n sql_statement("UPDATE accounts SET balance = ? WHERE id = ?"),\r\n {1500.0, 42});\r\n\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n tx.rollback();\r\n throw;\r\n}\n'})}),"\n",(0,i.jsx)(e.h3,{id:"cross-table-transactions",children:"Cross-Table Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Execute operations across multiple tables:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:'auto tx = client.get_transactions().begin();\r\n\r\ntry {\r\n auto sql = client.get_sql();\r\n\r\n // Debit from one account\r\n sql.execute(&tx, nullptr,\r\n sql_statement("UPDATE accounts SET balance = balance - ? WHERE id = ?"),\r\n {100.0, 1});\r\n\r\n // Credit to another account\r\n sql.execute(&tx, nullptr,\r\n sql_statement("UPDATE accounts SET balance = balance + ? WHERE id = ?"),\r\n {100.0, 2});\r\n\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n tx.rollback();\r\n throw;\r\n}\n'})}),"\n",(0,i.jsx)(e.h2,{id:"transaction-options-1",children:"Transaction Options"}),"\n",(0,i.jsx)(e.h3,{id:"configuring-timeout",children:"Configuring Timeout"}),"\n",(0,i.jsx)(e.p,{children:"Set maximum transaction duration:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"transaction_options opts;\r\nopts.set_timeout_millis(60000); // 60 seconds\r\n\r\nauto tx = transactions.begin(opts);\n"})}),"\n",(0,i.jsx)(e.p,{children:"Timeout of 0 means no timeout:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"opts.set_timeout_millis(0); // No timeout\n"})}),"\n",(0,i.jsx)(e.h3,{id:"read-only-transactions",children:"Read-Only Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Optimize for read operations:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"transaction_options opts;\r\nopts.set_read_only(true);\r\n\r\nauto tx = transactions.begin(opts);\r\n\r\n// Only read operations allowed\r\nauto result = view.get(&tx, key);\r\n\r\ntx.commit(); // Lightweight commit for read-only\n"})}),"\n",(0,i.jsx)(e.p,{children:"Read-only transactions provide better performance by avoiding write locks and conflict detection."}),"\n",(0,i.jsx)(e.h3,{id:"chaining-options",children:"Chaining Options"}),"\n",(0,i.jsx)(e.p,{children:"Use fluent API to chain option setters:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"transaction_options opts;\r\nopts.set_timeout_millis(30000)\r\n .set_read_only(false);\r\n\r\nauto tx = transactions.begin(opts);\n"})}),"\n",(0,i.jsx)(e.h2,{id:"transaction-visibility",children:"Transaction Visibility"}),"\n",(0,i.jsx)(e.h3,{id:"uncommitted-changes",children:"Uncommitted Changes"}),"\n",(0,i.jsx)(e.p,{children:"Changes are visible within the transaction:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"auto tx = transactions.begin();\r\n\r\nview.upsert(&tx, record);\r\n\r\n// This sees the upserted record\r\nauto result = view.get(&tx, key);\r\n\r\n// Other transactions do not see it yet\n"})}),"\n",(0,i.jsx)(e.h3,{id:"isolation-from-other-transactions",children:"Isolation from Other Transactions"}),"\n",(0,i.jsx)(e.p,{children:"Each transaction sees a consistent snapshot:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"// Transaction 1\r\nauto tx1 = transactions.begin();\r\nview.upsert(&tx1, record1);\r\n\r\n// Transaction 2 (concurrent)\r\nauto tx2 = transactions.begin();\r\nauto result = view.get(&tx2, key); // Does not see record1\r\n\r\ntx1.commit();\r\n\r\n// Transaction 2 still does not see record1 (snapshot isolation)\r\nauto result2 = view.get(&tx2, key); // Still does not see record1\n"})}),"\n",(0,i.jsx)(e.h2,{id:"asynchronous-transactions",children:"Asynchronous Transactions"}),"\n",(0,i.jsx)(e.h3,{id:"async-begin",children:"Async Begin"}),"\n",(0,i.jsx)(e.p,{children:"Start transactions asynchronously:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"transactions.begin_async([&](ignite_result result) {\r\n if (!result.has_error()) {\r\n auto tx = std::move(result).value();\r\n\r\n view.upsert_async(&tx, record, [&](ignite_result upsert_result) {\r\n if (!upsert_result.has_error()) {\r\n tx.commit_async([](ignite_result commit_result) {\r\n // Transaction committed\r\n });\r\n }\r\n });\r\n }\r\n});\n"})}),"\n",(0,i.jsx)(e.h3,{id:"async-begin-with-options",children:"Async Begin with Options"}),"\n",(0,i.jsx)(e.p,{children:"Pass options to async begin:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"transaction_options opts;\r\nopts.set_timeout_millis(30000);\r\n\r\ntransactions.begin_async(opts, [](ignite_result result) {\r\n // Use transaction\r\n});\n"})}),"\n",(0,i.jsx)(e.h2,{id:"error-handling",children:"Error Handling"}),"\n",(0,i.jsx)(e.h3,{id:"handling-commit-failures",children:"Handling Commit Failures"}),"\n",(0,i.jsx)(e.p,{children:"Commit failures indicate conflicts or constraints:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:'auto tx = transactions.begin();\r\n\r\ntry {\r\n view.upsert(&tx, record);\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n std::cerr << "Commit failed: " << e.what_str() << std::endl;\r\n // Transaction already rolled back on commit failure\r\n throw;\r\n}\n'})}),"\n",(0,i.jsx)(e.h3,{id:"handling-operation-failures",children:"Handling Operation Failures"}),"\n",(0,i.jsx)(e.p,{children:"Roll back on operation errors:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:'auto tx = transactions.begin();\r\n\r\ntry {\r\n view.upsert(&tx, record1);\r\n view.upsert(&tx, record2); // May throw\r\n tx.commit();\r\n} catch (const ignite_error& e) {\r\n tx.rollback();\r\n std::cerr << "Operation failed: " << e.what_str() << std::endl;\r\n throw;\r\n}\n'})}),"\n",(0,i.jsx)(e.h3,{id:"timeout-handling",children:"Timeout Handling"}),"\n",(0,i.jsx)(e.p,{children:"Transactions time out after configured duration:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"transaction_options opts;\r\nopts.set_timeout_millis(1000); // 1 second\r\n\r\nauto tx = transactions.begin(opts);\r\n\r\ntry {\r\n // Long-running operation\r\n std::this_thread::sleep_for(std::chrono::seconds(2));\r\n tx.commit(); // Will fail due to timeout\r\n} catch (const ignite_error& e) {\r\n // Handle timeout error\r\n}\n"})}),"\n",(0,i.jsx)(e.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,i.jsx)(e.h3,{id:"keep-transactions-short",children:"Keep Transactions Short"}),"\n",(0,i.jsx)(e.p,{children:"Minimize transaction duration to reduce conflicts:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"// Good: Short transaction\r\nauto tx = transactions.begin();\r\nview.upsert(&tx, record);\r\ntx.commit();\r\n\r\n// Avoid: Long-running transaction\r\nauto tx2 = transactions.begin();\r\nperform_expensive_calculation(); // Do outside transaction\r\nview.upsert(&tx2, result);\r\ntx2.commit();\n"})}),"\n",(0,i.jsx)(e.h3,{id:"use-read-only-for-queries",children:"Use Read-Only for Queries"}),"\n",(0,i.jsx)(e.p,{children:"Enable read-only optimization:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"transaction_options opts;\r\nopts.set_read_only(true);\r\n\r\nauto tx = transactions.begin(opts);\r\nauto results = view.get_all(&tx, keys);\r\ntx.commit();\n"})}),"\n",(0,i.jsx)(e.h3,{id:"handle-errors-properly",children:"Handle Errors Properly"}),"\n",(0,i.jsx)(e.p,{children:"Always rollback on errors:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"auto tx = transactions.begin();\r\nbool committed = false;\r\n\r\ntry {\r\n // Operations\r\n tx.commit();\r\n committed = true;\r\n} catch (const ignite_error& e) {\r\n if (!committed) {\r\n tx.rollback();\r\n }\r\n throw;\r\n}\n"})}),"\n",(0,i.jsx)(e.h3,{id:"use-raii-for-automatic-cleanup",children:"Use RAII for Automatic Cleanup"}),"\n",(0,i.jsx)(e.p,{children:"Wrap transactions in RAII helpers:"}),"\n",(0,i.jsx)(e.pre,{children:(0,i.jsx)(e.code,{className:"language-cpp",children:"class transaction_guard {\r\n transaction& tx_;\r\n bool committed_ = false;\r\n\r\npublic:\r\n explicit transaction_guard(transaction& tx) : tx_(tx) {}\r\n\r\n ~transaction_guard() {\r\n if (!committed_) {\r\n try {\r\n tx_.rollback();\r\n } catch (...) {\r\n // Log error\r\n }\r\n }\r\n }\r\n\r\n void commit() {\r\n tx_.commit();\r\n committed_ = true;\r\n }\r\n};\r\n\r\n// Usage\r\nauto tx = transactions.begin();\r\ntransaction_guard guard(tx);\r\n\r\nview.upsert(&tx, record);\r\nguard.commit(); // Automatic rollback if not committed\n"})}),"\n",(0,i.jsx)(e.h2,{id:"reference",children:"Reference"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsx)(e.li,{children:(0,i.jsx)(e.a,{href:"https://ignite.apache.org/releases/ignite3/3.1.0/cppdoc/",children:"C++ API Documentation"})}),"\n",(0,i.jsx)(e.li,{children:(0,i.jsx)(e.a,{href:"../../../develop/work-with-data/transactions",children:"Transactions Concept"})}),"\n",(0,i.jsx)(e.li,{children:(0,i.jsx)(e.a,{href:"./client-api",children:"Client API"})}),"\n",(0,i.jsx)(e.li,{children:(0,i.jsx)(e.a,{href:"./tables-api",children:"Tables API"})}),"\n",(0,i.jsx)(e.li,{children:(0,i.jsx)(e.a,{href:"./sql-api",children:"SQL API"})}),"\n"]})]})}function p(n={}){const{wrapper:e}={...(0,s.R)(),...n.components};return e?(0,i.jsx)(e,{...n,children:(0,i.jsx)(d,{...n})}):d(n)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/fe1d83c2.de3189ac.js b/docs/ignite3/assets/js/fe1d83c2.de3189ac.js deleted file mode 100644 index cdd9e1c688..0000000000 --- a/docs/ignite3/assets/js/fe1d83c2.de3189ac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[9435],{11470:(n,e,a)=>{a.d(e,{A:()=>A});var t=a(96540),r=a(34164),s=a(17559),c=a(23104),o=a(56347),i=a(205),l=a(57485),u=a(31682),d=a(70679);function h(n){return t.Children.toArray(n).filter(n=>"\n"!==n).map(n=>{if(!n||(0,t.isValidElement)(n)&&function(n){const{props:e}=n;return!!e&&"object"==typeof e&&"value"in e}(n))return n;throw new Error(`Docusaurus error: Bad child <${"string"==typeof n.type?n.type:n.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(n){const{values:e,children:a}=n;return(0,t.useMemo)(()=>{const n=e??function(n){return h(n).map(({props:{value:n,label:e,attributes:a,default:t}})=>({value:n,label:e,attributes:a,default:t}))}(a);return function(n){const e=(0,u.XI)(n,(n,e)=>n.value===e.value);if(e.length>0)throw new Error(`Docusaurus error: Duplicate values "${e.map(n=>n.value).join(", ")}" found in . Every value needs to be unique.`)}(n),n},[e,a])}function m({value:n,tabValues:e}){return e.some(e=>e.value===n)}function g({queryString:n=!1,groupId:e}){const a=(0,o.W6)(),r=function({queryString:n=!1,groupId:e}){if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!e)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return e??null}({queryString:n,groupId:e});return[(0,l.aZ)(r),(0,t.useCallback)(n=>{if(!r)return;const e=new URLSearchParams(a.location.search);e.set(r,n),a.replace({...a.location,search:e.toString()})},[r,a])]}function x(n){const{defaultValue:e,queryString:a=!1,groupId:r}=n,s=p(n),[c,o]=(0,t.useState)(()=>function({defaultValue:n,tabValues:e}){if(0===e.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:e}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${e.map(n=>n.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=e.find(n=>n.default)??e[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:e,tabValues:s})),[l,u]=g({queryString:a,groupId:r}),[h,x]=function({groupId:n}){const e=function(n){return n?`docusaurus.tab.${n}`:null}(n),[a,r]=(0,d.Dv)(e);return[a,(0,t.useCallback)(n=>{e&&r.set(n)},[e,r])]}({groupId:r}),b=(()=>{const n=l??h;return m({value:n,tabValues:s})?n:null})();(0,i.A)(()=>{b&&o(b)},[b]);return{selectedValue:c,selectValue:(0,t.useCallback)(n=>{if(!m({value:n,tabValues:s}))throw new Error(`Can't select invalid tab value=${n}`);o(n),u(n),x(n)},[u,x,s]),tabValues:s}}var b=a(92303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=a(74848);function y({className:n,block:e,selectedValue:a,selectValue:t,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:i}=(0,c.a_)(),l=n=>{const e=n.currentTarget,r=o.indexOf(e),c=s[r].value;c!==a&&(i(e),t(c))},u=n=>{let e=null;switch(n.key){case"Enter":l(n);break;case"ArrowRight":{const a=o.indexOf(n.currentTarget)+1;e=o[a]??o[0];break}case"ArrowLeft":{const a=o.indexOf(n.currentTarget)-1;e=o[a]??o[o.length-1];break}}e?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":e},n),children:s.map(({value:n,label:e,attributes:t})=>(0,f.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:n=>{o.push(n)},onKeyDown:u,onClick:l,...t,className:(0,r.A)("tabs__item",v.tabItem,t?.className,{"tabs__item--active":a===n}),children:e??n},n))})}function j({lazy:n,children:e,selectedValue:a}){const s=(Array.isArray(e)?e:[e]).filter(Boolean);if(n){const n=s.find(n=>n.props.value===a);return n?(0,t.cloneElement)(n,{className:(0,r.A)("margin-top--md",n.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:s.map((n,e)=>(0,t.cloneElement)(n,{key:e,hidden:n.props.value!==a}))})}function w(n){const e=x(n);return(0,f.jsxs)("div",{className:(0,r.A)(s.G.tabs.container,"tabs-container",v.tabList),children:[(0,f.jsx)(y,{...e,...n}),(0,f.jsx)(j,{...e,...n})]})}function A(n){const e=(0,b.A)();return(0,f.jsx)(w,{...n,children:h(n.children)},String(e))}},18041:(n,e,a)=>{a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"developers-guide/transactions","title":"Performing Transactions","description":"{/*","source":"@site/versioned_docs/version-3.0.0/developers-guide/transactions.md","sourceDirName":"developers-guide","slug":"/developers-guide/transactions","permalink":"/docs/ignite3/3.0.0/developers-guide/transactions","draft":false,"unlisted":false,"tags":[],"version":"3.0.0","frontMatter":{"title":"Performing Transactions","sidebar_label":"Performing Transactions"},"sidebar":"tutorialSidebar","previous":{"title":"Object Serialization","permalink":"/docs/ignite3/3.0.0/developers-guide/compute/serialization"},"next":{"title":"Streaming Data","permalink":"/docs/ignite3/3.0.0/developers-guide/data-streamer"}}');var r=a(74848),s=a(28453),c=a(11470),o=a(19365);const i={title:"Performing Transactions",sidebar_label:"Performing Transactions"},l=void 0,u={},d=[{value:"Transaction Lifecycle",id:"transaction-lifecycle",level:2},{value:"Transaction Isolation and Concurrency",id:"transaction-isolation-and-concurrency",level:2},{value:"Deadlock Prevention",id:"deadlock-prevention",level:3},{value:"Executing Transactions",id:"executing-transactions",level:2},{value:"Transaction Management",id:"transaction-management",level:2},{value:"Read-Only Transactions",id:"read-only-transactions",level:2},{value:"Transaction Timeout",id:"transaction-timeout",level:2}];function h(n){const e={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:["\n","\n",(0,r.jsx)(e.p,{children:"All queries in Apache Ignite are transactional. You can provide an explicit transaction as a first argument of any Table and SQL API call. If you do not provide an explicit transaction, an implicit one will be created for every call."}),"\n",(0,r.jsx)(e.h2,{id:"transaction-lifecycle",children:"Transaction Lifecycle"}),"\n",(0,r.jsxs)(e.p,{children:["When the transaction is created, the node that the transaction was started from is chosen as ",(0,r.jsx)(e.strong,{children:"transaction coordinator"}),". The coordinator finds the required partitions and sends the read or write requests to the nodes holding primary partitions. For correct transaction operation, all nodes in cluster must have similar time, that can be different by no more than ",(0,r.jsx)(e.code,{children:"schemaSync.maxClockSkewMillis"}),"."]}),"\n",(0,r.jsxs)(e.p,{children:["If the key is not locked by a different transaction, the node gets the locks on the involved keys, and attempts to apply the changes in the transaction. When the operation finishes, the lock is removed. This way, several transactions can work on the same partition, while changing separate keys. Additionally, some operations may perform ",(0,r.jsx)(e.strong,{children:"short-term"})," locks on the keys in advance, to ensure operations proceed correctly."]}),"\n",(0,r.jsxs)(e.p,{children:["If the node with the primary replica of a partition involved in the transaction fails, the transaction is eventually automatically rolled back. Apache Ignite will return ",(0,r.jsx)(e.code,{children:"TransactionException"})," on commit attempt."]}),"\n",(0,r.jsx)(e.h2,{id:"transaction-isolation-and-concurrency",children:"Transaction Isolation and Concurrency"}),"\n",(0,r.jsxs)(e.p,{children:["All read-write transactions in Apache Ignite acquire locks during the first read or write access, and hold the lock until the transaction is committed or rolled back. All read-write transactions are ",(0,r.jsx)(e.code,{children:"SERIALIZABLE"}),", so as long as the lock persists, no other transaction can make changes to locked data, however data can still be read by ",(0,r.jsx)(e.a,{href:"#read-only-transactions",children:"Read-Only Transactions"}),"."]}),"\n",(0,r.jsx)(e.h3,{id:"deadlock-prevention",children:"Deadlock Prevention"}),"\n",(0,r.jsxs)(e.p,{children:["Apache Ignite uses the ",(0,r.jsx)(e.code,{children:"WAIT_DIE"})," deadlock prevention algorithm. When a newer transaction requests data that is already locked by a different transaction, it is cancelled and the transaction operation is retried with the same timestamp. If the transaction is older, it is not cancelled and is allowed to wait for the lock to be freed."]}),"\n",(0,r.jsx)(e.h2,{id:"executing-transactions",children:"Executing Transactions"}),"\n",(0,r.jsx)(e.p,{children:"Here is how you can provide a transaction explicitly:"}),"\n",(0,r.jsxs)(c.A,{groupId:"programming-languages",children:[(0,r.jsx)(o.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"KeyValueView accounts =\r\n table.keyValueView(Mapper.of(Long.class), Mapper.of(Account.class));\r\n\r\naccounts.put(null, 42, new Account(16_000));\r\n\r\nvar tx = client.transactions().begin();\r\n\r\nAccount account = accounts.get(tx, 42);\r\naccount.balance += 500;\r\naccounts.put(tx, 42, account);\r\n\r\nassert accounts.get(tx, 42).balance == 16_500;\r\n\r\ntx.rollback();\r\n\r\nassert accounts.get(tx, 42).balance == 16_000;\n"})})}),(0,r.jsx)(o.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:"var accounts = table.GetKeyValueView();\r\nawait accounts.PutAsync(transaction: null, 42, new Account(16_000));\r\n\r\nawait using ITransaction tx = await client.Transactions.BeginAsync();\r\n\r\n(Account account, bool hasValue) = await accounts.GetAsync(tx, 42);\r\naccount = account with { Balance = account.Balance + 500 };\r\n\r\nawait accounts.PutAsync(tx, 42, account);\r\n\r\nDebug.Assert((await accounts.GetAsync(tx, 42)).Value.Balance == 16_500);\r\n\r\nawait tx.RollbackAsync();\r\n\r\nDebug.Assert((await accounts.GetAsync(null, 42)).Value.Balance == 16_000);\r\n\r\npublic record Account(decimal Balance);\n"})})}),(0,r.jsx)(o.A,{value:"cpp",label:"C++",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-cpp",children:"auto accounts = table.get_key_value_view();\r\n\r\naccount init_value(42, 16'000);\r\naccounts.put(nullptr, {42}, init_value);\r\n\r\nauto tx = client.get_transactions().begin();\r\n\r\nstd::optional res_account = accounts.get(&tx, {42});\r\nres_account->balance += 500;\r\naccounts.put(&tx, {42}, res_account);\r\n\r\nassert(accounts.get(&tx, {42})->balance == 16'500);\r\n\r\ntx.rollback();\r\n\r\nassert(accounts.get(&tx, {42})->balance == 16'000);\n"})})})]}),"\n",(0,r.jsx)(e.h2,{id:"transaction-management",children:"Transaction Management"}),"\n",(0,r.jsxs)(e.p,{children:["You can also manage transactions by using the ",(0,r.jsx)(e.code,{children:"runInTransaction"})," method. When using it, the following will be done automatically:"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"The transaction is started and substituted to the closure."}),"\n",(0,r.jsx)(e.li,{children:"The transaction is committed if no exceptions were thrown during the closure."}),"\n",(0,r.jsx)(e.li,{children:"The transaction will be retried in case of recoverable error. Closure must be purely functional, not causing side effects."}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"You can run transactions both synchronously and asynchronously."}),"\n",(0,r.jsx)(e.p,{children:"This example shows how to update an account's balance synchronously:"}),"\n",(0,r.jsx)(c.A,{groupId:"programming-languages",children:(0,r.jsx)(o.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"client.transactions().runInTransaction(tx -> {\r\n Account acct = accounts.get(tx, key);\r\n if (acct != null) {\r\n acct.balance += 200.0d;\r\n }\r\n accounts.put(tx, key, acct);\r\n});\r\n\n"})})})}),"\n",(0,r.jsx)(e.p,{children:"And this example performs the same logic in an asynchronous manner:"}),"\n",(0,r.jsx)(c.A,{groupId:"programming-languages",children:(0,r.jsx)(o.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"CompletableFuture future = client.transactions().runInTransactionAsync(tx ->\r\n accounts.getAsync(tx, key)\r\n .thenCompose(acct -> {\r\n acct.balance += 300.0d;\r\n return accounts.putAsync(tx, key, acct);\r\n })\r\n);\r\nfuture.join();\n"})})})}),"\n",(0,r.jsx)(e.h2,{id:"read-only-transactions",children:"Read-Only Transactions"}),"\n",(0,r.jsxs)(e.p,{children:["When starting a transaction, you can configure the transaction as a ",(0,r.jsx)(e.strong,{children:"read-only"})," transaction. In these transactions, no data modification can be performed, but they also do not secure locks and can be performed on non-primary partitions, further improving their performance. Read-only transactions always check the data for the moment they were started, even if new data was written to the database."]}),"\n",(0,r.jsx)(e.p,{children:"Here is how you can make a read-only transaction:"}),"\n",(0,r.jsxs)(c.A,{groupId:"programming-languages",children:[(0,r.jsx)(o.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"var tx = client.transactions().begin(new TransactionOptions().readOnly(true));\r\nint balance = accounts.get(tx, 42).balance;\r\ntx.commit();\n"})})}),(0,r.jsx)(o.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:"await using var tx = await client.Transactions.BeginAsync(\r\n new TransactionOptions { ReadOnly = true });\r\nvar account = await accounts.GetAsync(tx, 42);\r\nint balance = account.Value.Balance;\r\nawait tx.CommitAsync();\n"})})}),(0,r.jsx)(o.A,{value:"cpp",label:"C++",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-cpp",children:"auto tx_opts = transaction_options()\r\n .set_read_only(true);\r\n\r\nauto tx = m_client.get_transactions().begin(tx_opts);\r\n\r\nrecord_view.get(&tx, 42);\r\n\r\ntx.commit();\n"})})})]}),"\n",(0,r.jsx)(e.admonition,{type:"note",children:(0,r.jsx)(e.p,{children:"Read-only transactions read data at a specific time. If new data was written since, old data will still be stored in Version Storage and will be available until low watermark. If low watermark is reached during the transaction, data will be kept available until it is over."})}),"\n",(0,r.jsx)(e.h2,{id:"transaction-timeout",children:"Transaction Timeout"}),"\n",(0,r.jsx)(e.p,{children:"In certain scenarios, it is preferable to drop the transaction if it is taking too long. When the timeout is reached, the transaction is automatically rolled back."}),"\n",(0,r.jsx)(e.p,{children:"Here is how you can configure transaction timeout:"}),"\n",(0,r.jsxs)(c.A,{groupId:"programming-languages",children:[(0,r.jsx)(o.A,{value:"java",label:"Java",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-java",children:"KeyValueView accounts =\r\n table.keyValueView(Mapper.of(Long.class), Mapper.of(Account.class));\r\n\r\nvar tx = client.transactions().begin(new TransactionOptions().timeoutMillis(10000));\r\naccounts.put(tx, 42, account);\r\ntx.commit();\n"})})}),(0,r.jsx)(o.A,{value:"dotnet",label:".NET",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-csharp",children:"await using var tx = await Client.Transactions.BeginAsync(\r\n new TransactionOptions { TimeoutMillis = 10_000 });\r\nawait accounts.PutAsync(tx, 42, account);\r\nawait tx.CommitAsync();\n"})})}),(0,r.jsx)(o.A,{value:"cpp",label:"C++",children:(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-cpp",children:"auto accounts = table.get_key_value_view();\r\n\r\nauto tx_opts = transaction_options()\r\n .set_timeout_millis(10000);\r\n\r\nauto tx = m_client.get_transactions().begin(tx_opts);\r\n\r\nrecord_view.insert(&tx, 42);\r\n\r\ntx.commit();\n"})})})]})]})}function p(n={}){const{wrapper:e}={...(0,s.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(h,{...n})}):h(n)}},19365:(n,e,a)=>{a.d(e,{A:()=>c});a(96540);var t=a(34164);const r={tabItem:"tabItem_Ymn6"};var s=a(74848);function c({children:n,hidden:e,className:a}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,t.A)(r.tabItem,a),hidden:e,children:n})}},28453:(n,e,a)=>{a.d(e,{R:()=>c,x:()=>o});var t=a(96540);const r={},s=t.createContext(r);function c(n){const e=t.useContext(s);return t.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:c(n.components),t.createElement(s.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/ffa03752.f27940fe.js b/docs/ignite3/assets/js/ffa03752.f27940fe.js deleted file mode 100644 index 8cdd9a2ce0..0000000000 --- a/docs/ignite3/assets/js/ffa03752.f27940fe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[6299],{28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var r=t(96540);const i={},s=r.createContext(i);function a(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(s.Provider,{value:n},e.children)}},36304:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"understand/core-concepts/what-is-ignite","title":"What is Apache Ignite 3?","description":"Apache Ignite is a distributed database designed for high-performance transactional and analytical workloads. It combines in-memory speed with disk persistence, providing both SQL and key-value access to the same data with full ACID transaction support.","source":"@site/docs/understand/core-concepts/what-is-ignite.md","sourceDirName":"understand/core-concepts","slug":"/understand/core-concepts/what-is-ignite","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"id":"what-is-ignite","title":"What is Apache Ignite 3?","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Core Concepts","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/"},"next":{"title":"Tables and Schemas","permalink":"/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas"}}');var i=t(74848),s=t(28453);const a={id:"what-is-ignite",title:"What is Apache Ignite 3?",sidebar_position:1},o=void 0,c={},d=[{value:"When to Use Ignite",id:"when-to-use-ignite",level:2},{value:"Architecture",id:"architecture",level:2},{value:"Component Layers",id:"component-layers",level:3},{value:"Core Features",id:"core-features",level:2},{value:"Unified Data Model",id:"unified-data-model",level:3},{value:"ACID Transactions",id:"acid-transactions",level:3},{value:"Distribution Zones",id:"distribution-zones",level:3},{value:"Distributed Compute",id:"distributed-compute",level:3},{value:"Distributed SQL",id:"distributed-sql",level:3},{value:"Storage Options",id:"storage-options",level:3},{value:"Clients and Connectivity",id:"clients-and-connectivity",level:2},{value:"Management",id:"management",level:2},{value:"Changes from Ignite 2",id:"changes-from-ignite-2",level:2},{value:"Data Model",id:"data-model",level:3},{value:"Transactions",id:"transactions",level:3},{value:"Distribution Configuration",id:"distribution-configuration",level:3},{value:"Client Model",id:"client-model",level:3},{value:"Compute API",id:"compute-api",level:3},{value:"Management Tools",id:"management-tools",level:3},{value:"Next Steps",id:"next-steps",level:2}];function l(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",mermaid:"mermaid",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Apache Ignite is a distributed database designed for high-performance transactional and analytical workloads. It combines in-memory speed with disk persistence, providing both SQL and key-value access to the same data with full ACID transaction support."}),"\n",(0,i.jsx)(n.h2,{id:"when-to-use-ignite",children:"When to Use Ignite"}),"\n",(0,i.jsx)(n.p,{children:"Ignite fits workloads that require low-latency data access at scale:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Workload"}),(0,i.jsx)(n.th,{children:"How Ignite Helps"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"High-throughput OLTP"})}),(0,i.jsx)(n.td,{children:"In-memory processing with persistent storage handles millions of transactions per second"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Real-time analytics"})}),(0,i.jsx)(n.td,{children:"Distributed SQL queries execute across partitioned data without ETL"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Caching layer"})}),(0,i.jsx)(n.td,{children:"Replace external caches with a transactional, SQL-queryable data layer"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Microservices data"})}),(0,i.jsx)(n.td,{children:"Shared distributed state with strong consistency guarantees"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Event processing"})}),(0,i.jsx)(n.td,{children:"Colocated compute executes business logic where data resides"})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"architecture",children:"Architecture"}),"\n",(0,i.jsx)(n.p,{children:"Ignite clusters consist of server nodes that store partitioned data and execute distributed queries and compute jobs. Clients connect through a lightweight protocol without joining the cluster topology."}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Applications"\r\n App1[Java App]\r\n App2[.NET App]\r\n App3[C++ App]\r\n SQL[SQL Tools]\r\n end\r\n\r\n subgraph "Apache Ignite Cluster"\r\n subgraph "Node 1"\r\n P1[Partitions]\r\n C1[Compute]\r\n end\r\n subgraph "Node 2"\r\n P2[Partitions]\r\n C2[Compute]\r\n end\r\n subgraph "Node 3"\r\n P3[Partitions]\r\n C3[Compute]\r\n end\r\n end\r\n\r\n App1 & App2 & App3 --\x3e|"Thin Client"| P1 & P2 & P3\r\n SQL --\x3e|"JDBC/ODBC"| P1 & P2 & P3'}),"\n",(0,i.jsx)(n.h3,{id:"component-layers",children:"Component Layers"}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Client Layer"\r\n Clients[Thin Clients]\r\n JDBC[JDBC/ODBC]\r\n end\r\n\r\n subgraph "API Layer"\r\n SQLEngine[SQL Engine]\r\n TableAPI[Table API]\r\n ComputeAPI[Compute API]\r\n end\r\n\r\n subgraph "Transaction Layer"\r\n TX[Transaction Manager]\r\n MVCCStore[MVCC Storage]\r\n Locks[Lock Manager]\r\n end\r\n\r\n subgraph "Distribution Layer"\r\n Zones[Distribution Zones]\r\n Placement[Placement Driver]\r\n Raft[Raft Consensus]\r\n end\r\n\r\n subgraph "Storage Layer"\r\n Memory[In-Memory]\r\n Disk[Persistent]\r\n end\r\n\r\n Clients --\x3e SQLEngine & TableAPI & ComputeAPI\r\n JDBC --\x3e SQLEngine\r\n SQLEngine & TableAPI --\x3e TX\r\n TX --\x3e MVCCStore & Locks\r\n MVCCStore --\x3e Zones\r\n Zones --\x3e Placement\r\n Placement --\x3e Raft\r\n Raft --\x3e Memory & Disk'}),"\n",(0,i.jsx)(n.h2,{id:"core-features",children:"Core Features"}),"\n",(0,i.jsx)(n.h3,{id:"unified-data-model",children:"Unified Data Model"}),"\n",(0,i.jsx)(n.p,{children:"Tables provide a single data structure for both SQL and key-value operations. The same schema serves distributed queries and low-latency key lookups."}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Table"\r\n Schema[Schema Definition]\r\n end\r\n\r\n subgraph "Access Patterns"\r\n SQL[SQL Queries]\r\n KV[Key-Value API]\r\n Compute[Colocated Compute]\r\n end\r\n\r\n Schema --\x3e SQL & KV & Compute'}),"\n",(0,i.jsx)(n.p,{children:"Create tables with SQL, then access them through any API:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE TABLE accounts (\r\n id INT PRIMARY KEY,\r\n name VARCHAR(100),\r\n balance DECIMAL(10,2)\r\n) WITH PRIMARY_ZONE = 'default';\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'// Key-value access to the same table\r\nKeyValueView kv = table.keyValueView(\r\n Mapper.of(Long.class), Mapper.of(Account.class));\r\nAccount account = kv.get(null, 42L);\r\n\r\n// SQL access\r\nResultSet rs = client.sql().execute(null,\r\n "SELECT * FROM accounts WHERE balance > ?", 1000);\n'})}),"\n",(0,i.jsx)(n.h3,{id:"acid-transactions",children:"ACID Transactions"}),"\n",(0,i.jsx)(n.p,{children:"All tables support transactions by default using Multi-Version Concurrency Control (MVCC). Read-write transactions execute with serializable isolation. Read-only transactions provide snapshot isolation without acquiring locks."}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Transaction Model"\r\n MVCC["MVCC Engine"]\r\n\r\n subgraph "Read-Write"\r\n Serial["Serializable Isolation"]\r\n Locks2["Lock-based"]\r\n TwoPC["2PC Commit"]\r\n end\r\n\r\n subgraph "Read-Only"\r\n Snapshot["Snapshot Isolation"]\r\n LockFree["Lock-free"]\r\n AnyReplica["Any Replica"]\r\n end\r\n end\r\n\r\n MVCC --\x3e Serial & Snapshot\r\n Serial --\x3e Locks2 --\x3e TwoPC\r\n Snapshot --\x3e LockFree --\x3e AnyReplica'}),"\n",(0,i.jsx)(n.p,{children:"Transactions work across SQL and key-value operations:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'var tx = client.transactions().begin();\r\ntry {\r\n // Mix SQL and key-value in same transaction\r\n client.sql().execute(tx, "UPDATE accounts SET balance = balance - 100 WHERE id = ?", 1);\r\n kv.put(tx, 2L, new Account("Jane", 100.00));\r\n tx.commit();\r\n} catch (Exception e) {\r\n tx.rollback();\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"distribution-zones",children:"Distribution Zones"}),"\n",(0,i.jsx)(n.p,{children:"Distribution zones control how data is partitioned and replicated across the cluster. Each zone defines partition count, replication factor, and node placement rules."}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Distribution Zone"\r\n Config["Zone: transactions_zone"]\r\n\r\n subgraph "Configuration"\r\n Part["Partitions: 64"]\r\n Repl["Replicas: 3"]\r\n Filter["Filter: region=us-east"]\r\n end\r\n\r\n subgraph "Assigned Tables"\r\n T1[orders]\r\n T2[payments]\r\n T3[audit_log]\r\n end\r\n end\r\n\r\n Config --\x3e Part & Repl & Filter\r\n Part --\x3e T1 & T2 & T3'}),"\n",(0,i.jsx)(n.p,{children:"Tables in the same zone with matching colocation keys store related data on the same partitions, enabling efficient joins without network transfers."}),"\n",(0,i.jsx)(n.h3,{id:"distributed-compute",children:"Distributed Compute"}),"\n",(0,i.jsx)(n.p,{children:"Execute code where data resides to minimize network overhead. Jobs can target specific nodes, colocate with data partitions, or broadcast across the cluster."}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Job Placement"\r\n Any["Any Node"]\r\n Coloc["Colocated"]\r\n Bcast["Broadcast"]\r\n end\r\n\r\n subgraph "Execution"\r\n N1[Node 1]\r\n N2[Node 2]\r\n N3[Node 3]\r\n end\r\n\r\n Any --\x3e N1\r\n Coloc --\x3e|"Data-local"| N2\r\n Bcast --\x3e N1 & N2 & N3'}),"\n",(0,i.jsx)(n.p,{children:"Colocated execution processes data without network transfer:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'// Execute on node holding account 42\'s partition\r\nJobExecution execution = client.compute().submit(\r\n JobTarget.colocated("accounts", Tuple.create().set("id", 42L)),\r\n JobDescriptor.builder(CalculateInterestJob.class).build(),\r\n 42L\r\n);\r\nDouble interest = execution.resultAsync().join();\n'})}),"\n",(0,i.jsx)(n.h3,{id:"distributed-sql",children:"Distributed SQL"}),"\n",(0,i.jsx)(n.p,{children:"The SQL engine executes ANSI SQL queries across partitioned data. Query plans push predicates to partitions, aggregate results, and handle distributed joins."}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart TB\r\n subgraph "Query Execution"\r\n Query["SELECT * FROM orders o
                                                              JOIN customers c ON o.cust_id = c.id
                                                              WHERE c.region = \'US\'"]\r\n end\r\n\r\n subgraph "Distributed Plan"\r\n Parse[Parse & Optimize]\r\n Frag1[Fragment: customers scan]\r\n Frag2[Fragment: orders scan]\r\n Join[Colocated Join]\r\n Agg[Aggregate Results]\r\n end\r\n\r\n Query --\x3e Parse\r\n Parse --\x3e Frag1 & Frag2\r\n Frag1 & Frag2 --\x3e Join\r\n Join --\x3e Agg'}),"\n",(0,i.jsx)(n.p,{children:"Standard JDBC connectivity works with existing SQL tools:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://localhost:10800")) {\r\n PreparedStatement stmt = conn.prepareStatement(\r\n "SELECT region, SUM(amount) FROM orders GROUP BY region");\r\n ResultSet rs = stmt.executeQuery();\r\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"storage-options",children:"Storage Options"}),"\n",(0,i.jsx)(n.p,{children:"Ignite supports multiple storage engines optimized for different workloads:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Engine"}),(0,i.jsx)(n.th,{children:"Characteristics"}),(0,i.jsx)(n.th,{children:"Use Case"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"aimem"})}),(0,i.jsx)(n.td,{children:"In-memory only, volatile"}),(0,i.jsx)(n.td,{children:"Caching, session data"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"aipersist"})}),(0,i.jsx)(n.td,{children:"In-memory with disk persistence"}),(0,i.jsx)(n.td,{children:"Primary data storage"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"rocksdb"})}),(0,i.jsx)(n.td,{children:"Disk-based with memory cache"}),(0,i.jsx)(n.td,{children:"Large datasets exceeding RAM"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"Storage profiles assign engines to distribution zones:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sql",children:"CREATE ZONE large_data WITH\r\n STORAGE_PROFILES = 'rocksdb_profile',\r\n PARTITIONS = 128,\r\n REPLICAS = 3;\n"})}),"\n",(0,i.jsx)(n.h2,{id:"clients-and-connectivity",children:"Clients and Connectivity"}),"\n",(0,i.jsx)(n.p,{children:"Ignite provides native thin clients and standard database connectivity:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Client"}),(0,i.jsx)(n.th,{children:"Language"}),(0,i.jsx)(n.th,{children:"Protocol"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Java Client"}),(0,i.jsx)(n.td,{children:"Java 11+"}),(0,i.jsx)(n.td,{children:"Binary"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:".NET Client"}),(0,i.jsx)(n.td,{children:".NET 6+"}),(0,i.jsx)(n.td,{children:"Binary"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"C++ Client"}),(0,i.jsx)(n.td,{children:"C++17"}),(0,i.jsx)(n.td,{children:"Binary"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"JDBC Driver"}),(0,i.jsx)(n.td,{children:"Any JVM"}),(0,i.jsx)(n.td,{children:"JDBC"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ODBC Driver"}),(0,i.jsx)(n.td,{children:"Any"}),(0,i.jsx)(n.td,{children:"ODBC"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"Thin clients connect directly to cluster nodes without joining the topology:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-java",children:'IgniteClient client = IgniteClient.builder()\r\n .addresses("node1:10800", "node2:10800", "node3:10800")\r\n .build();\n'})}),"\n",(0,i.jsx)(n.h2,{id:"management",children:"Management"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"ignite3"})," CLI provides cluster administration, configuration, and disaster recovery operations. Configuration uses HOCON format split between cluster-wide and node-specific settings."]}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "CLI"\r\n Tool[ignite3]\r\n end\r\n\r\n subgraph "Operations"\r\n Init[Cluster Init]\r\n Config[Configuration]\r\n Status[Health/Status]\r\n Recovery[Disaster Recovery]\r\n end\r\n\r\n Tool --\x3e Init & Config & Status & Recovery'}),"\n",(0,i.jsx)(n.h2,{id:"changes-from-ignite-2",children:"Changes from Ignite 2"}),"\n",(0,i.jsx)(n.p,{children:"For teams migrating from Ignite 2, the following section summarizes architectural changes."}),"\n",(0,i.jsx)(n.h3,{id:"data-model",children:"Data Model"}),"\n",(0,i.jsx)(n.p,{children:"Ignite 2 stored data in caches using Binary Object format. SQL and key-value APIs operated on different representations. Ignite 3 replaces caches with tables that provide a unified schema for all access patterns."}),"\n",(0,i.jsx)(n.mermaid,{value:'flowchart LR\r\n subgraph "Ignite 2"\r\n direction TB\r\n C[Cache]\r\n BO[Binary Objects]\r\n SQL2[SQL Schema]\r\n KV2[Key-Value API]\r\n C --\x3e BO\r\n BO --\x3e SQL2\r\n BO --\x3e KV2\r\n end\r\n\r\n subgraph "Ignite 3"\r\n direction TB\r\n T[Table]\r\n Schema2[Single Schema]\r\n SQL3[SQL API]\r\n KV3[Key-Value API]\r\n T --\x3e Schema2\r\n Schema2 --\x3e SQL3\r\n Schema2 --\x3e KV3\r\n end'}),"\n",(0,i.jsx)(n.h3,{id:"transactions",children:"Transactions"}),"\n",(0,i.jsx)(n.p,{children:"Ignite 2 transactions required cache atomicity configuration and had performance implications. Ignite 3 makes all tables transactional by default with MVCC-based concurrency control. The WAIT_DIE algorithm prevents deadlocks without detection overhead."}),"\n",(0,i.jsx)(n.h3,{id:"distribution-configuration",children:"Distribution Configuration"}),"\n",(0,i.jsx)(n.p,{children:"Ignite 2 spread distribution settings across affinity functions, backup configuration, and baseline topology. Ignite 3 consolidates these into distribution zones with explicit partition counts, replica factors, and node filters. Custom affinity functions are replaced by deterministic rendezvous hashing."}),"\n",(0,i.jsx)(n.h3,{id:"client-model",children:"Client Model"}),"\n",(0,i.jsx)(n.p,{children:"Ignite 2 thick clients joined the cluster as nodes, requiring full protocol participation. Ignite 3 uses thin clients exclusively for standard operations. Embedded mode remains available for specialized use cases."}),"\n",(0,i.jsx)(n.h3,{id:"compute-api",children:"Compute API"}),"\n",(0,i.jsxs)(n.p,{children:["Ignite 3 extends Ignite 2's compute capabilities with job state tracking, priority-based queuing, and automatic failover on node departure. All compute operations return ",(0,i.jsx)(n.code,{children:"CompletableFuture"})," for non-blocking execution."]}),"\n",(0,i.jsx)(n.h3,{id:"management-tools",children:"Management Tools"}),"\n",(0,i.jsxs)(n.p,{children:["Ignite 2 used multiple CLI scripts with overlapping functionality. Ignite 3 provides a single ",(0,i.jsx)(n.code,{children:"ignite3"})," CLI with interactive mode and command autocomplete. Configuration moved from XML to HOCON format."]}),"\n",(0,i.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"./tables-and-schemas",children:"Tables and Schemas"})," for data modeling"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"./distribution-and-colocation",children:"Distribution and Colocation"})," for partitioning"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"./transactions-and-mvcc",children:"Transactions and MVCC"})," for concurrency control"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"./compute-and-events",children:"Compute and Events"})," for distributed processing"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/3.1.0/getting-started/",children:"Getting Started"})," to deploy your first cluster"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/main.189970e9.js b/docs/ignite3/assets/js/main.189970e9.js deleted file mode 100644 index faf8ce34be..0000000000 --- a/docs/ignite3/assets/js/main.189970e9.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.189970e9.js.LICENSE.txt */ -(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[8792],{205:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(96540);const i=n(38193).A.canUseDOM?r.useLayoutEffect:r.useEffect},689:function(e){e.exports=function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=a}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(a){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,a=null,o=function o(){if(!i){i=!0,clearTimeout(a);try{r.isIframeBlank(e)||(e.removeEventListener("load",o),r.getIframeContents(e,t,n))}catch(s){n()}}};e.addEventListener("load",o),a=setTimeout(o,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=t.querySelectorAll("iframe"),s=o.length,l=0;o=Array.prototype.slice.call(o);var c=function(){--s<=0&&a(l)};s||c(),o.forEach(function(t){e.matches(t,i.exclude)?c():i.onIframeReady(t,function(e){n(t)&&(l++,r(e)),c()},c)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,a=!1;return r.forEach(function(e,t){e.val===n&&(i=t,a=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||a?!1===i||a||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var a=this,o=this.createIterator(t,e,r),s=[],l=[],c=void 0,u=void 0,d=function(){var e=a.getIteratorNode(o);return u=e.prevNode,c=e.node};d();)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(c,u,e,s)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return l.push(e)},r)}),l.push(c);l.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(s,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=this.getContexts(),o=a.length;o||i(),a.forEach(function(a){var s=function(){r.iterateThroughNodes(e,a,t,n,function(){--o<=0&&i()})};r.iframes?r.waitForIframes(a,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var a=t[i],o="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a);""!==o&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(o)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynomyms(o)+"|"+this.processSynomyms(s)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":"\x01"})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":"\x02"})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,i="string"==typeof r?r:r.value,a="string"==typeof r?[]:r.limiters,o="";switch(a.forEach(function(e){o+="|"+t.escapeStr(e)}),i){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(o="\\s"+(o||this.escapeStr(n)))+"]*"+e+"[^"+o+"]*)";case"exactly":return"(^|\\s"+o+")("+e+")(?=$|\\s"+o+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),a=i.start,o=i.end;i.valid&&(e.start=a,e.length=o-a,n.push(e),r=o)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,a=n.length,o=t-a,s=parseInt(e.start,10)-o;return(r=(s=s>a?a:s)+parseInt(e.length,10))>a&&(r=a,this.log("End range automatically set to the max value of "+a)),s<0||r-s<0||s>a||r>a?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),a=i.splitText(n-t),o=document.createElement(r);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=i.textContent,i.parentNode.replaceChild(o,i),a}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var a=this;e.nodes.every(function(o,s){var l=e.nodes[s+1];if(void 0===l||l.start>t){if(!r(o.node))return!1;var c=t-o.start,u=(n>o.end?o.end:n)-o.start,d=e.value.substr(0,o.start),p=e.value.substr(u+o.start);if(o.node=a.wrapRangeInTextNode(o.node,c,u),e.value=d+p,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=u),e.nodes[n].end-=u)}),n-=u,i(o.node.previousSibling,o.start),!(n>o.end))return!1;t=o.end}return!0})}},{key:"wrapMatches",value:function(e,t,n,r,i){var a=this,o=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[o];)if(n(i[o],t)){var s=i.index;if(0!==o)for(var l=1;l{"use strict";var r=n(6925);function i(){}function a(){}a.resetWarningCache=i,e.exports=function(){function e(e,t,n,i,a,o){if(o!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:i};return n.PropTypes=n,n}},2833:e=>{e.exports=function(e,t,n,r){var i=n?n.call(r,e,t):void 0;if(void 0!==i)return!!i;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),o=Object.keys(t);if(a.length!==o.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l{"use strict";n.d(t,{A:()=>o});n(96540);var r=n(34164);const i={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var a=n(74848);function o({className:e}){return(0,a.jsxs)("div",{className:(0,r.A)(i.loadingRing,e),children:[(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{}),(0,a.jsx)("div",{})]})}},4146:(e,t,n)=>{"use strict";var r=n(44363),i={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},o={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?o:s[e.$$typeof]||i}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=o;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var i=f(n);i&&i!==g&&e(t,i,r)}var o=u(n);d&&(o=o.concat(d(n)));for(var s=l(t),h=l(n),m=0;m{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{$:()=>r})},4477:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0>>1,i=e[r];if(!(0>>1;ra(l,n))ca(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(ca(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(t.unstable_now=void 0,"object"==typeof performance&&"function"==typeof performance.now){var o=performance;t.unstable_now=function(){return o.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,p=null,f=3,g=!1,h=!1,m=!1,b=!1,y="function"==typeof setTimeout?setTimeout:null,v="function"==typeof clearTimeout?clearTimeout:null,w="undefined"!=typeof setImmediate?setImmediate:null;function S(e){for(var t=r(u);null!==t;){if(null===t.callback)i(u);else{if(!(t.startTime<=e))break;i(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function k(e){if(m=!1,S(e),!h)if(null!==r(c))h=!0,_||(_=!0,x());else{var t=r(u);null!==t&&P(k,t.startTime-e)}}var x,_=!1,E=-1,T=5,A=-1;function C(){return!!b||!(t.unstable_now()-Ae&&C());){var o=p.callback;if("function"==typeof o){p.callback=null,f=p.priorityLevel;var s=o(p.expirationTime<=e);if(e=t.unstable_now(),"function"==typeof s){p.callback=s,S(e),n=!0;break t}p===r(c)&&i(c),S(e)}else i(c);p=r(c)}if(null!==p)n=!0;else{var l=r(u);null!==l&&P(k,l.startTime-e),n=!1}}break e}finally{p=null,f=a,g=!1}n=void 0}}finally{n?x():_=!1}}}if("function"==typeof w)x=function(){w(N)};else if("undefined"!=typeof MessageChannel){var O=new MessageChannel,L=O.port2;O.port1.onmessage=N,x=function(){L.postMessage(null)}}else x=function(){y(N,0)};function P(e,n){E=y(function(){e(t.unstable_now())},n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_forceFrameRate=function(e){0>e||125o?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(m?(v(E),E=-1):m=!0,P(k,a-o))):(e.sortIndex=s,n(c,e),h||g||(h=!0,_||(_=!0,x()))),e},t.unstable_shouldYield=C,t.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"Apache Ignite 3 Documentation",tagline:"Distributed Database for High-Performance Computing",favicon:"img/favicon.ico",future:{v4:{removeLegacyPostBuildHeadAttribute:!0,useCssCascadeLayers:!0},experimental_faster:{swcJsLoader:!1,swcJsMinimizer:!1,swcHtmlMinimizer:!1,lightningCssMinimizer:!1,mdxCrossCompilerCache:!1,rspackBundler:!1,rspackPersistentCache:!1,ssgWorkerThreads:!1},experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},url:"https://ignite.apache.org",baseUrl:"/docs/ignite3/",trailingSlash:!1,organizationName:"apache",projectName:"ignite-3",onBrokenLinks:"warn",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{sidebarPath:"./sidebars.ts",routeBasePath:"/",includeCurrentVersion:!0,lastVersion:"current",onlyIncludeVersions:["current","3.0.0"],versions:{current:{label:"3.1.0 (Latest)",path:"3.1.0",banner:"none"},"3.0.0":{label:"3.0.0",path:"3.0.0",banner:"unmaintained",badge:!0}}},blog:!1,theme:{customCss:"./src/css/custom.css"}}]],markdown:{mermaid:!0,format:"mdx",emoji:!0,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1},hooks:{onBrokenMarkdownLinks:"warn",onBrokenMarkdownImages:"throw"}},themes:["@docusaurus/theme-mermaid",["/mnt/d/GitHub/ignite-3/docs/node_modules/@easyops-cn/docusaurus-search-local/dist/server/server/index.js",{hashed:!0,indexDocs:!0,indexBlog:!1,indexPages:!1,docsRouteBasePath:"/",searchResultLimits:10,searchResultContextMaxLength:100,highlightSearchTermsOnTargetPage:!0,searchBarPosition:"right",language:["en"],searchBarShortcut:!0,searchBarShortcutHint:!0}]],themeConfig:{image:"img/logo.svg",colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!0},navbar:{logo:{alt:"Apache Ignite Logo",src:"img/logo.svg",srcDark:"img/logo-dark.svg",href:"/",target:"_self"},items:[{type:"docsVersionDropdown",position:"right",dropdownItemsBefore:[],dropdownItemsAfter:[]},{type:"search",position:"right"},{href:"https://github.com/apache/ignite-3",label:"GitHub",position:"right"}],style:"primary",hideOnScroll:!1},docs:{sidebar:{hideable:!0,autoCollapseCategories:!1},versionPersistence:"localStorage"},footer:{style:"dark",links:[{title:"Documentation",items:[{label:"Apache Ignite 3",to:"/3.1.0/"}]},{title:"Community",items:[{label:"Apache Ignite",href:"https://ignite.apache.org"},{label:"User Mailing List",href:"https://ignite.apache.org/community.html"}]},{title:"Apache Software Foundation",items:[{label:"Apache Software Foundation",href:"https://www.apache.org/"},{label:"License",href:"https://www.apache.org/licenses/"},{label:"GitHub",href:"https://github.com/apache/ignite-3"}]}],copyright:"Copyright \xa9 2026 The Apache Software Foundation. Licensed under the Apache License, Version 2.0."},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},additionalLanguages:["java","csharp","cpp","python","sql","bash","json","yaml"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},mermaid:{theme:{dark:"dark",light:"default"},options:{}},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(96540);var r=n(80545),i=n(74848);function a(e){return(0,i.jsx)(r.mg,{...e})}},5338:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(31247)},5556:(e,t,n)=>{e.exports=n(2694)()},5651:()=>{!function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function n(e,n,r){return RegExp(t(e,n),r||"")}function r(e,t){for(var n=0;n>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var i="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",a="class enum interface record struct",o="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",s="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var c=l(a),u=RegExp(l(i+" "+a+" "+o+" "+s)),d=l(a+" "+o+" "+s),p=l(i+" "+a+" "+s),f=r(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),g=r(/\((?:[^()]|<>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,m=t(/<<0>>(?:\s*<<1>>)?/.source,[h,f]),b=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,m]),y=/\[\s*(?:,\s*)*\]/.source,v=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[b,y]),w=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[f,g,y]),S=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[w]),k=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[S,b,y]),x={keyword:u,punctuation:/[<>()?,.:[\]]/},_=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,E=/"(?:\\.|[^\\"\r\n])*"/.source,T=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[T]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[E]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[b]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,k]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[c,m]),lookbehind:!0,inside:x},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[b]),lookbehind:!0,inside:x},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[v]),lookbehind:!0,inside:x},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[k,p,h]),inside:x}],keyword:u,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[g]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[k,b]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[k]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,f]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(f),alias:"class-name",inside:x}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[c,m,h,k,u.source,g,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[m,g]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:u,"class-name":{pattern:RegExp(k),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var A=E+"|"+_,C=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[A]),N=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[C]),2),O=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,L=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[b,N]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[O,L]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[O]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[N]),inside:e.languages.csharp},"class-name":{pattern:RegExp(b),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var P=/:[^}\r\n]+/.source,j=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[C]),2),R=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[j,P]),I=r(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[A]),2),D=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[I,P]);function F(t,r){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[r,P]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[R]),lookbehind:!0,greedy:!0,inside:F(R,j)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[D]),lookbehind:!0,greedy:!0,inside:F(D,I)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism)},5947:function(e,t,n){var r,i;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
                                                              '};function i(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function o(e,t,n){var i;return(i="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,i}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=i(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s(function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,o(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout(function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout(function(){n.remove(),t()},u)},u)):setTimeout(t,u)}),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout(function(){n.status&&(n.trickle(),e())},r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*i(Math.random()*t,.1,.95)),t=i(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always(function(){0===--t?(e=0,n.done()):n.set((e-t)/e)}),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var i,o=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(o,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(i=t.querySelector(r.spinnerSelector))&&f(i),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(e,t){return t.toUpperCase()})}function r(t){var n=document.body.style;if(t in n)return t;for(var r,i=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);i--;)if((r=e[i]+a)in n)return r;return t}function i(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=i(t),e.style[t]=n}return function(e,t){var n,r,i=arguments;if(2==i.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,i[1],i[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(i="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=i)},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>o});var r=n(96540),i=n(74848);const a=r.createContext(!1);function o({children:e}){const[t,n]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{n(!0)},[]),(0,i.jsx)(a.Provider,{value:t,children:e})}},6221:(e,t,n)=>{"use strict";var r=n(96540);function i(e){var t="https://react.dev/errors/"+e;if(1{"use strict";n.d(t,{p:()=>i});var r=n(44586);function i(){return(0,r.A)().siteConfig.themeConfig}},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},10119:(e,t,n)=>{"use strict";n.r(t)},11088:(e,t,n)=>{"use strict";n.d(t,{CU:()=>i(),UB:()=>d,tb:()=>o,O6:()=>g,I$:()=>p,ZG:()=>u,WW:()=>s,pk:()=>l,tF:()=>c,Hg:()=>f,rG:()=>a,dz:()=>h});var r=n(689),i=n.n(r);const a=100,o=!1,s=!0,l=!0,c="mod+k",u="right",d=void 0,p=!0,f=null,g=!1,h=!1},11561:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,i="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(i);var n="function"==typeof t?t():t,a=n?"".concat(i,": ").concat(n):i;throw new Error(a)}}},12181:(e,t,n)=>{"use strict";n.d(t,{bq:()=>u,MN:()=>c,a2:()=>l,k2:()=>d});var r=n(96540),i=n(21312),a=n(70440);const o={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};var s=n(74848);function l(e){return(0,s.jsx)("button",{type:"button",...e,children:(0,s.jsx)(i.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function c({error:e,tryAgain:t}){return(0,s.jsxs)("div",{className:o.errorBoundaryFallback,children:[(0,s.jsx)("p",{children:e.message}),(0,s.jsx)(l,{onClick:t})]})}function u({error:e}){const t=(0,a.rA)(e).map(e=>e.message).join("\n\nCause:\n");return(0,s.jsx)("p",{className:o.errorBoundaryError,children:t})}class d extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}},12983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=i,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),s="/"===o||o===r?o:(l=o,c=n,c?i(l):a(l));var l,c;return e.replace(o,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(42566);function i(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},13823:(e,t,n)=>{"use strict";n.d(t,{A:()=>hn});var r=n(96540),i=n(34164),a=n(67489),o=n(45500),s=n(56347),l=n(21312),c=n(75062),u=n(74848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)(e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)},[]);return(0,c.$)(({location:n})=>{e.current&&!n.hash&&"PUSH"===t&&p(e.current)}),{containerRef:e,onClick:n}}const g=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??g,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var m=n(17559),b=n(14090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:y.skipToContent})}var w=n(6342),S=n(65041);function k({width:e=21,height:t=21,color:n="currentColor",strokeWidth:r=1.2,className:i,...a}){return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:e,height:t,...a,children:(0,u.jsx)("g",{stroke:n,strokeWidth:r,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const x={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,i.A)("clean-btn close",x.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function T(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,i.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function C(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,S.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,u.jsxs)("div",{className:(0,i.A)(m.G.announcementBar.container,A.announcementBar),style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,u.jsx)("div",{className:A.announcementBarPlaceholder}),(0,u.jsx)(T,{className:A.announcementBarContent}),o&&(0,u.jsx)(_,{onClick:n,className:A.announcementBarClose})]})}var N=n(22069),O=n(23104);var L=n(89532),P=n(75600);const j=r.createContext(null);function R({children:e}){const t=function(){const e=(0,N.M)(),t=(0,P.YL)(),[n,i]=(0,r.useState)(!1),a=null!==t.component,o=(0,L.ZC)(a);return(0,r.useEffect)(()=>{a&&!o&&i(!0)},[a,o]),(0,r.useEffect)(()=>{a?e.shown||i(!0):i(!1)},[e.shown,a]),(0,r.useMemo)(()=>[n,i],[n])}();return(0,u.jsx)(j.Provider,{value:t,children:e})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(j);if(!e)throw new L.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,i=(0,r.useCallback)(()=>n(!1),[n]),a=(0,P.YL)();return(0,r.useMemo)(()=>({shown:t,hide:i,content:I(a)}),[i,a,t])}function F(e){return parseInt(r.version.split(".")[0],10)<19?{inert:e?"":void 0}:{inert:e}}function M({children:e,inert:t}){return(0,u.jsx)("div",{className:(0,i.A)(m.G.layout.navbar.mobileSidebar.panel,"navbar-sidebar__item menu"),...F(t),children:e})}function q({header:e,primaryMenu:t,secondaryMenu:n}){const{shown:r}=D();return(0,u.jsxs)("div",{className:(0,i.A)(m.G.layout.navbar.mobileSidebar.container,"navbar-sidebar"),children:[e,(0,u.jsxs)("div",{className:(0,i.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":r}),children:[(0,u.jsx)(M,{inert:r,children:t}),(0,u.jsx)(M,{inert:!r,children:n})]})]})}var z=n(95293),B=n(92303);function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}function H(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"})})}const V="toggle_vylO",W="toggleButton_gllP",Q="toggleIcon_g3eP",G="systemToggleIcon_QzmC",Y="lightToggleIcon_pyhR",K="darkToggleIcon_wfgR",Z="toggleButtonDisabled_aARS";function X(e){switch(e){case null:return(0,l.T)({message:"system mode",id:"theme.colorToggle.ariaLabel.mode.system",description:"The name for the system color mode"});case"light":return(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"});case"dark":return(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"});default:throw new Error(`unexpected color mode ${e}`)}}function J(e){return(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the color mode toggle"},{mode:X(e)})}function ee(){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)($,{"aria-hidden":!0,className:(0,i.A)(Q,Y)}),(0,u.jsx)(U,{"aria-hidden":!0,className:(0,i.A)(Q,K)}),(0,u.jsx)(H,{"aria-hidden":!0,className:(0,i.A)(Q,G)})]})}function te({className:e,buttonClassName:t,respectPrefersColorScheme:n,value:r,onChange:a}){const o=(0,B.A)();return(0,u.jsx)("div",{className:(0,i.A)(V,e),children:(0,u.jsx)("button",{className:(0,i.A)("clean-btn",W,!o&&Z,t),type:"button",onClick:()=>a(function(e,t){if(!t)return"dark"===e?"light":"dark";switch(e){case null:return"light";case"light":return"dark";case"dark":return null;default:throw new Error(`unexpected color mode ${e}`)}}(r,n)),disabled:!o,title:X(r),"aria-label":J(r),children:(0,u.jsx)(ee,{})})})}const ne=r.memo(te),re={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function ie({className:e}){const t=(0,w.p)().navbar.style,{disableSwitch:n,respectPrefersColorScheme:r}=(0,w.p)().colorMode,{colorModeChoice:i,setColorMode:a}=(0,z.G)();return n?null:(0,u.jsx)(ne,{className:e,buttonClassName:"dark"===t?re.darkNavbarColorModeToggle:void 0,respectPrefersColorScheme:r,value:i,onChange:a})}var ae=n(23465);function oe(){return(0,u.jsx)(ae.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function se(){const e=(0,N.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function le(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(oe,{}),(0,u.jsx)(ie,{className:"margin-right--md"}),(0,u.jsx)(se,{})]})}var ce=n(28774),ue=n(86025),de=n(16654);function pe(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var fe=n(43186);function ge({activeBasePath:e,activeBaseRegex:t,to:n,href:r,label:i,html:a,isDropdownLink:o,prependBaseUrlToHref:s,...l}){const c=(0,ue.Ay)(n),d=(0,ue.Ay)(e),p=(0,ue.Ay)(r,{forcePrependBaseUrl:!0}),f=i&&r&&!(0,de.A)(r),g=a?{dangerouslySetInnerHTML:{__html:a}}:{children:(0,u.jsxs)(u.Fragment,{children:[i,f&&(0,u.jsx)(fe.A,{...o&&{width:12,height:12}})]})};return r?(0,u.jsx)(ce.A,{href:s?p:r,...l,...g}):(0,u.jsx)(ce.A,{to:c,isNavLink:!0,...(e||t)&&{isActive:(e,n)=>t?pe(t,n.pathname):n.pathname.startsWith(d)},...l,...g})}function he({className:e,isDropdownItem:t,...n}){return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ge,{className:(0,i.A)("menu__link",e),...n})})}function me({className:e,isDropdownItem:t=!1,...n}){const r=(0,u.jsx)(ge,{className:(0,i.A)(t?"dropdown__link":"navbar__item navbar__link",e),isDropdownLink:t,...n});return t?(0,u.jsx)("li",{children:r}):r}function be({mobile:e=!1,position:t,...n}){const r=e?he:me;return(0,u.jsx)(r,{...n,activeClassName:n.activeClassName??(e?"menu__link--active":"navbar__link--active")})}var ye=n(41422),ve=n(99169),we=n(44586);const Se="dropdownNavbarItemMobile_J0Sd";function ke(e,t){return e.some(e=>function(e,t){return!!(0,ve.ys)(e.to,t)||!!pe(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t))}function xe({collapsed:e,onClick:t}){return(0,u.jsx)("button",{"aria-label":e?(0,l.T)({id:"theme.navbar.mobileDropdown.collapseButton.expandAriaLabel",message:"Expand the dropdown",description:"The ARIA label of the button to expand the mobile dropdown navbar item"}):(0,l.T)({id:"theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel",message:"Collapse the dropdown",description:"The ARIA label of the button to collapse the mobile dropdown navbar item"}),"aria-expanded":!e,type:"button",className:"clean-btn menu__caret",onClick:t})}function _e({items:e,className:t,position:n,onClick:a,...o}){const l=function(){const{siteConfig:{baseUrl:e}}=(0,we.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),c=(0,ve.ys)(o.to,l),d=ke(e,l),{collapsed:p,toggleCollapsed:f}=function({active:e}){const{collapsed:t,toggleCollapsed:n,setCollapsed:i}=(0,ye.u)({initialState:()=>!e});return(0,r.useEffect)(()=>{e&&i(!1)},[e,i]),{collapsed:t,toggleCollapsed:n}}({active:c||d}),g=o.to?void 0:"#";return(0,u.jsxs)("li",{className:(0,i.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsxs)("div",{className:(0,i.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":c}),children:[(0,u.jsx)(ge,{role:"button",className:(0,i.A)(Se,"menu__link menu__link--sublist",t),href:g,...o,onClick:e=>{"#"===g&&e.preventDefault(),f()},children:o.children??o.label}),(0,u.jsx)(xe,{collapsed:p,onClick:e=>{e.preventDefault(),f()}})]}),(0,u.jsx)(ye.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:e.map((e,t)=>(0,r.createElement)(Ot,{mobile:!0,isDropdownItem:!0,onClick:a,activeClassName:"menu__link--active",...e,key:t}))})]})}function Ee({items:e,position:t,className:n,onClick:a,...o}){const s=(0,r.useRef)(null),[l,c]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&c(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}},[s]),(0,u.jsxs)("div",{ref:s,className:(0,i.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===t,"dropdown--show":l}),children:[(0,u.jsx)(ge,{"aria-haspopup":"true","aria-expanded":l,role:"button",href:o.to?void 0:"#",className:(0,i.A)("navbar__link",n),...o,onClick:o.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),c(!l))},children:o.children??o.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:e.map((e,t)=>(0,r.createElement)(Ot,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t}))})]})}function Te({mobile:e=!1,...t}){const n=e?_e:Ee;return(0,u.jsx)(n,{...t})}var Ae=n(32131),Ce=n(57485);function Ne({width:e=20,height:t=20,...n}){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:e,height:t,"aria-hidden":!0,...n,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const Oe="iconLanguage_nlXk";function Le(){const{siteConfig:e,i18n:{localeConfigs:t}}=(0,we.A)(),n=(0,Ae.o)(),r=(0,Ce.Hl)(e=>e.location.search),i=(0,Ce.Hl)(e=>e.location.hash),a=e=>{const n=t[e];if(!n)throw new Error(`Docusaurus bug, no locale config found for locale=${e}`);return n};return{getURL:(t,o)=>{const s=(0,Ce.jy)([r,o.queryString],"append");return`${(t=>a(t).url===e.url?`pathname://${n.createUrl({locale:t,fullyQualified:!1})}`:n.createUrl({locale:t,fullyQualified:!0}))(t)}${s}${i}`},getLabel:e=>a(e).label,getLang:e=>a(e).htmlLang}}var Pe=n(11088);var je=n(44070),Re=n(69153),Ie=n(69913),De=n(4471),Fe=n(27674),Me=n(86841),qe=n(43810);const ze="searchBar_RVTs",Be="dropdownMenu_qbY6",$e="searchInput_YFbd",Ue="searchBarLeft_MXDe",He="suggestion_fB_2",Ve="cursor_eG29",We="hitTree_kk6K",Qe="hitIcon_a7Zy",Ge="hitPath_ieM4",Ye="noResultsIcon_EBY5",Ke="hitFooter_E9YW",Ze="hitWrapper_sAK8",Xe="hitTitle_vyVt",Je="hitAction_NqkB",et="noResults_l6Q3",tt="searchBarContainer_NW3z",nt="searchBarLoadingRing_YnHq",rt="searchClearButton_qk4g",it="searchIndexLoading_EJ1f",at="searchHintContainer_Pkmr",ot="searchHint_iIMx",st="focused_OWtg",lt="input_FOTf",ct="hint_URu1",ut="suggestions_X8XU",dt="dataset_QiCy",pt="empty_eITn";function ft({document:e,type:t,page:n,metadata:r,tokens:i,isInterOfTree:a,isLastOfTree:o}){const s=t===Ie.i.Title,l=t===Ie.i.Keywords,c=s||l,u=t===Ie.i.Heading,d=[];a?d.push(''):o&&d.push('');const p=d.map(e=>`${e}`),f=`${c?'':u?'':''}`,g=[`${l?(0,Me.Z)(e.s,i):(0,qe.C)(e.t,(0,Fe.g)(r,"t"),i)}`];if(!a&&!o&&Pe.tb){const t=n?n.b?.concat(n.t).concat(e.s&&e.s!==n.t?e.s:[]):e.b;g.push(`${(0,De.$)(t??[])}`)}else c||g.push(`${(0,Me.Z)(n.t||(e.u.startsWith("/docs/api-reference/")?"API Reference":""),i)}`);const h=``;return[...p,f,``,...g,"",h].join("")}function gt(){return`${(0,l.T)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var ht=n(2849),mt=n(43385);n(58291);function bt(){if("undefined"==typeof navigator)return!1;if("userAgentData"in navigator&&navigator.userAgentData?.platform){return navigator.userAgentData.platform.toLowerCase().includes("mac")}return navigator.userAgent?/mac/i.test(navigator.userAgent):!!navigator.platform&&navigator.platform.toLowerCase().includes("mac")}function yt(e){const t=e.toLowerCase().split("+"),n={key:"",ctrl:!1,alt:!1,shift:!1,meta:!1},r=bt();for(const i of t){const e=i.trim();switch(e){case"ctrl":n.ctrl=!0;break;case"cmd":n.meta=!0;break;case"mod":r?n.meta=!0:n.ctrl=!0;break;case"alt":n.alt=!0;break;case"shift":n.shift=!0;break;default:n.key=e}}return n}function vt(e,t){const n=yt(e),r=[],i=e.toLowerCase().split("+").map(e=>e.trim()).includes("mod");return n.ctrl&&!i&&r.push("ctrl"),n.meta&&!i&&r.push(t?"\u2318":"cmd"),i&&r.push(t?"\u2318":"ctrl"),n.alt&&r.push(t?"\u2325":"alt"),n.shift&&r.push(t?"\u21e7":"shift"),n.key&&r.push(n.key.toUpperCase()),r}async function wt(){const e=await Promise.all([n.e(489),n.e(5741)]).then(n.t.bind(n,90489,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const St="_highlight";const kt=function({handleSearchBarToggle:e}){const t=(0,B.A)(),{siteConfig:{baseUrl:a},i18n:{currentLocale:o}}=(0,we.A)(),c=(0,je.vT)();let d=a;try{const{preferredVersion:e}=function(...e){return n(44070).g1(...e)}(c?.pluginId??Pe.UB);e&&!e.isLast&&(d=e.path+"/")}catch(q){if(Pe.I$&&!(q instanceof L.dV))throw q}const p=(0,s.W6)(),f=(0,s.zy)(),g=(0,r.useRef)(null),h=(0,r.useRef)(new Map),m=(0,r.useRef)(!1),[b,y]=(0,r.useState)(!1),[v,w]=(0,r.useState)(!1),[S,k]=(0,r.useState)(""),x=(0,r.useRef)(null),_=(0,r.useRef)(""),[E,T]=(0,r.useState)(""),A=(0,r.useRef)(a);(0,r.useEffect)(()=>{if(!Array.isArray(Pe.Hg))return void(A.current!==d&&(h.current.delete(""),A.current=d));let e="";if(f.pathname.startsWith(d)){const t=f.pathname.substring(d.length);let n;for(const e of Pe.Hg){const r="string"==typeof e?e:e.path;if(t===r||t.startsWith(`${r}/`)){n=r;break}}n&&(e=n)}_.current!==e&&(h.current.delete(e),_.current=e),T(e)},[f.pathname,d]);const C=!!Pe.O6&&Array.isArray(Pe.Hg)&&""===E,N=(0,r.useCallback)(async()=>{if(C||h.current.get(E))return;h.current.set(E,"loading"),x.current?.autocomplete.destroy(),y(!0);const[e]=await Promise.all([wt(),(0,Re.k)(d,E)]);if(x.current=e(g.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,i.A)(ze,{[Ue]:"left"===Pe.ZG}),noPrefix:!0,dropdownMenu:Be,input:lt,hint:ct,suggestions:ut,suggestion:He,cursor:Ve,dataset:dt,empty:pt}},[{source:async(e,t)=>{t(await(0,Re.w)(d,E,e,10))},templates:{suggestion:ft,empty:gt,footer:({query:e,isEmpty:t})=>{if(t&&(!E||!Pe.dz))return;const n=(({query:e,isEmpty:t})=>{const n=document.createElement("a"),r=new URLSearchParams;let i;if(r.set("q",e),E){const e=E&&Array.isArray(Pe.Hg)?Pe.Hg.find(e=>"string"==typeof e?e===E:e.path===E):E,n=e?(0,mt.p)(e,o).label:E;i=Pe.dz&&t?(0,l.T)({id:"theme.SearchBar.seeAllOutsideContext",message:'See all results outside "{context}"'},{context:n}):(0,l.T)({id:"theme.SearchBar.searchInContext",message:'See all results within "{context}"'},{context:n})}else i=(0,l.T)({id:"theme.SearchBar.seeAll",message:"See all results"});if(!E||!Array.isArray(Pe.Hg)||Pe.dz&&t||r.set("ctx",E),d!==a){if(!d.startsWith(a))throw new Error(`Version url '${d}' does not start with base url '${a}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);r.set("version",d.substring(a.length))}const s=`${a}search/?${r.toString()}`;return n.href=s,n.textContent=i,n.addEventListener("click",e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),x.current?.autocomplete.close(),p.push(s))}),n})({query:e,isEmpty:t}),r=document.createElement("div");return r.className=Ke,r.appendChild(n),r}}}]).on("autocomplete:selected",function(e,{document:{u:t,h:n},tokens:r}){g.current?.blur();let i=t;if(Pe.CU&&r.length>0){const e=new URLSearchParams;for(const t of r)e.append(St,t);i+=`?${e.toString()}`}n&&(i+=n),p.push(i)}).on("autocomplete:closed",()=>{g.current?.blur()}),h.current.set(E,"done"),y(!1),m.current){const e=g.current;e.value&&x.current?.autocomplete.open(),e.focus()}},[C,E,d,a,p]);(0,r.useEffect)(()=>{if(!Pe.CU)return;const e=t?new URLSearchParams(f.search).getAll(St):[];setTimeout(()=>{const t=document.querySelector("article");if(!t)return;const n=new Pe.CU(t);n.unmark(),0!==e.length&&n.mark(e,{exclude:[".theme-doc-toc-mobile > button"]}),k(e.join(" ")),x.current?.autocomplete.setVal(e.join(" "))})},[t,f.search,f.pathname]);const[O,P]=(0,r.useState)(!1),j=(0,r.useCallback)(()=>{m.current=!0,N(),P(!0),e?.(!0)},[e,N]),R=(0,r.useCallback)(()=>{P(!1),e?.(!1)},[e]),I=(0,r.useCallback)(()=>{N()},[N]),D=(0,r.useCallback)(e=>{k(e.target.value),e.target.value&&w(!0)},[]),F=!!t&&bt();(0,r.useEffect)(()=>{const t=g.current,n=t?.value;n&&k(n),t&&document.activeElement===t&&(m.current=!0,N(),P(!0),e?.(!0))},[]),(0,r.useEffect)(()=>{if(!Pe.WW||!Pe.tF)return;const e=yt(Pe.tF),t=t=>{(function(e,t){return e.key.toLowerCase()===t.key&&e.ctrlKey===t.ctrl&&e.altKey===t.alt&&e.shiftKey===t.shift&&e.metaKey===t.meta})(t,e)&&(t.preventDefault(),g.current?.focus(),j())};return document.addEventListener("keydown",t),()=>{document.removeEventListener("keydown",t)}},[j,Pe.tF]);const M=(0,r.useCallback)(()=>{const e=new URLSearchParams(f.search);e.delete(St);const t=e.toString(),n=f.pathname+(""!=t?`?${t}`:"")+f.hash;n!=f.pathname+f.search+f.hash&&p.push(n),k(""),x.current?.autocomplete.setVal("")},[f.pathname,f.search,f.hash,p]);return(0,u.jsxs)("div",{className:(0,i.A)("navbar__search",tt,{[it]:b&&v,[st]:O}),hidden:C,dir:"ltr",children:[(0,u.jsx)("input",{placeholder:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:`navbar__search-input ${$e}`,onMouseEnter:I,onFocus:j,onBlur:R,onChange:D,ref:g,value:S}),(0,u.jsx)(ht.A,{className:nt}),Pe.WW&&Pe.pk&&(""!==S?(0,u.jsx)("button",{className:rt,onClick:M,children:"\u2715"}):t&&Pe.tF&&(0,u.jsx)("div",{className:at,children:vt(Pe.tF,F).map((e,t)=>(0,u.jsx)("kbd",{className:ot,children:e},t))}))]})},xt={navbarSearchContainer:"navbarSearchContainer_Bca1"};function _t({children:e,className:t}){return(0,u.jsx)("div",{className:(0,i.A)(t,xt.navbarSearchContainer),children:e})}var Et=n(26972);var Tt=n(53886);function At({docsPluginId:e,configs:t}){return function(e,t){if(t){const n=new Map(e.map(e=>[e.name,e])),r=(t,r)=>{const i=n.get(t);if(!i)throw new Error(`No docs version exist for name '${t}', please verify your 'docsVersionDropdown' navbar item versions config.\nAvailable version names:\n- ${e.map(e=>`${e.name}`).join("\n- ")}`);return{version:i,label:r?.label??i.label}};return Array.isArray(t)?t.map(e=>r(e,void 0)):Object.entries(t).map(([e,t])=>r(e,t))}return e.map(e=>({version:e,label:e.label}))}((0,je.jh)(e),t)}function Ct(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find(t=>t.id===e.mainDocId)}(e)}const Nt={default:be,localeDropdown:function({mobile:e,dropdownItemsBefore:t,dropdownItemsAfter:n,queryString:r,...i}){const a=Le(),{i18n:{currentLocale:o,locales:s}}=(0,we.A)(),c=[...t,...s.map(t=>({label:a.getLabel(t),lang:a.getLang(t),to:a.getURL(t,{queryString:r}),target:"_self",autoAddBaseUrl:!1,className:t===o?e?"menu__link--active":"dropdown__link--active":""})),...n],d=e?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):a.getLabel(o);return(0,u.jsx)(Te,{...i,mobile:e,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ne,{className:Oe}),d]}),items:c})},search:function({mobile:e,className:t}){return e?null:(0,u.jsx)(_t,{className:t,children:(0,u.jsx)(kt,{})})},dropdown:Te,html:function({value:e,className:t,mobile:n=!1,isDropdownItem:r=!1}){const a=r?"li":"div";return(0,u.jsx)(a,{className:(0,i.A)({navbar__item:!n&&!r,"menu__list-item":n},t),dangerouslySetInnerHTML:{__html:e}})},doc:function({docId:e,label:t,docsPluginId:n,...r}){const{activeDoc:i}=(0,je.zK)(n),a=(0,Et.QB)(e,n),o=i?.path===a?.path;return null===a||a.unlisted&&!o?null:(0,u.jsx)(be,{exact:!0,...r,isActive:()=>o||!!i?.sidebar&&i.sidebar===a.sidebar,label:t??a.id,to:a.path})},docSidebar:function({sidebarId:e,label:t,docsPluginId:n,...r}){const{activeDoc:i}=(0,je.zK)(n),a=(0,Et.fW)(e,n).link;if(!a)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${e}" doesn't have anything to be linked to.`);return(0,u.jsx)(be,{exact:!0,...r,isActive:()=>i?.sidebar===e,label:t??a.label,to:a.path})},docsVersion:function({label:e,to:t,docsPluginId:n,...r}){const i=(0,Et.Vd)(n)[0],a=e??i.label,o=t??(e=>e.docs.find(t=>t.id===e.mainDocId))(i).path;return(0,u.jsx)(be,{...r,label:a,to:o})},docsVersionDropdown:function({mobile:e,docsPluginId:t,dropdownActiveClassDisabled:n,dropdownItemsBefore:r,dropdownItemsAfter:i,versions:a,...o}){const s=(0,Ce.Hl)(e=>e.location.search),c=(0,Ce.Hl)(e=>e.location.hash),d=(0,je.zK)(t),{savePreferredVersionName:p}=(0,Tt.g1)(t),f=At({docsPluginId:t,configs:a}),g=function({docsPluginId:e,versionItems:t}){return(0,Et.Vd)(e).map(e=>t.find(t=>t.version===e)).filter(e=>void 0!==e)[0]??t[0]}({docsPluginId:t,versionItems:f}),h=[...r,...f.map(function({version:e,label:t}){return{label:t,to:`${Ct(e,d).path}${s}${c}`,isActive:()=>e===d.activeVersion,onClick:()=>p(e.name)}}),...i],m=e&&h.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,b=e&&h.length>1?void 0:Ct(g.version,d).path;return h.length<=1?(0,u.jsx)(be,{...o,mobile:e,label:m,to:b,isActive:n?()=>!1:void 0}):(0,u.jsx)(Te,{...o,mobile:e,label:m,to:b,items:h,isActive:n?()=>!1:void 0})}};function Ot({type:e,...t}){const n=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(e,t),r=Nt[n];if(!r)throw new Error(`No NavbarItem component found for type "${e}".`);return(0,u.jsx)(r,{...t})}function Lt(){const e=(0,N.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map((t,n)=>(0,r.createElement)(Ot,{mobile:!0,...t,onClick:()=>e.toggle(),key:n}))})}function Pt(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function jt(){const e=0===(0,w.p)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Pt,{onClick:()=>t.hide()}),t.content]})}function Rt(){const e=(0,N.M)();return function(e=!0){(0,r.useEffect)(()=>(document.body.style.overflow=e?"hidden":"visible",()=>{document.body.style.overflow="visible"}),[e])}(e.shown),e.shouldRender?(0,u.jsx)(q,{header:(0,u.jsx)(le,{}),primaryMenu:(0,u.jsx)(Lt,{}),secondaryMenu:(0,u.jsx)(jt,{})}):null}const It={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Dt(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,i.A)("navbar-sidebar__backdrop",e.className)})}function Ft({children:e}){const{navbar:{hideOnScroll:t,style:n}}=(0,w.p)(),a=(0,N.M)(),{navbarRef:o,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),i=(0,r.useRef)(!1),a=(0,r.useRef)(0),o=(0,r.useCallback)(e=>{null!==e&&(a.current=e.getBoundingClientRect().height)},[]);return(0,O.Mq)(({scrollY:t},r)=>{if(!e)return;if(t=o?n(!1):t+l{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return i.current=!0,void n(!1);n(!0)}),{navbarRef:o,isNavbarVisible:t}}(t);return(0,u.jsxs)("nav",{ref:o,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,i.A)(m.G.layout.navbar.container,"navbar","navbar--fixed-top",t&&[It.navbarHideable,!s&&It.navbarHidden],{"navbar--dark":"dark"===n,"navbar--primary":"primary"===n,"navbar-sidebar--show":a.shown}),children:[e,(0,u.jsx)(Dt,{onClick:a.toggle}),(0,u.jsx)(Rt,{})]})}var Mt=n(12181);const qt="right";function zt({width:e=30,height:t=30,className:n,...r}){return(0,u.jsx)("svg",{className:n,width:e,height:t,viewBox:"0 0 30 30","aria-hidden":"true",...r,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Bt(){const{toggle:e,shown:t}=(0,N.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(zt,{})})}const $t={colorModeToggle:"colorModeToggle_DEke"};function Ut({items:e}){return(0,u.jsx)(u.Fragment,{children:e.map((e,t)=>(0,u.jsx)(Mt.k2,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Ot,{...e})},t))})}function Ht({left:e,right:t}){return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:(0,i.A)(m.G.layout.navbar.containerLeft,"navbar__items"),children:e}),(0,u.jsx)("div",{className:(0,i.A)(m.G.layout.navbar.containerRight,"navbar__items navbar__items--right"),children:t})]})}function Vt(){const e=(0,N.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??qt)}return[e.filter(t),e.filter(e=>!t(e))]}(t),i=t.find(e=>"search"===e.type);return(0,u.jsx)(Ht,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Bt,{}),(0,u.jsx)(oe,{}),(0,u.jsx)(Ut,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ut,{items:r}),(0,u.jsx)(ie,{className:$t.colorModeToggle}),!i&&(0,u.jsx)(_t,{children:(0,u.jsx)(kt,{})})]})})}function Wt(){return(0,u.jsx)(Ft,{children:(0,u.jsx)(Vt,{})})}function Qt({item:e}){const{to:t,href:n,label:r,prependBaseUrlToHref:a,className:o,...s}=e,l=(0,ue.Ay)(t),c=(0,ue.Ay)(n,{forcePrependBaseUrl:!0});return(0,u.jsxs)(ce.A,{className:(0,i.A)("footer__link-item",o),...n?{href:a?c:n}:{to:l},...s,children:[r,n&&!(0,de.A)(n)&&(0,u.jsx)(fe.A,{})]})}function Gt({item:e}){return e.html?(0,u.jsx)("li",{className:(0,i.A)("footer__item",e.className),dangerouslySetInnerHTML:{__html:e.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(Qt,{item:e})},e.href??e.to)}function Yt({column:e}){return(0,u.jsxs)("div",{className:(0,i.A)(m.G.layout.footer.column,"col footer__col",e.className),children:[(0,u.jsx)("div",{className:"footer__title",children:e.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:e.items.map((e,t)=>(0,u.jsx)(Gt,{item:e},t))})]})}function Kt({columns:e}){return(0,u.jsx)("div",{className:"row footer__links",children:e.map((e,t)=>(0,u.jsx)(Yt,{column:e},t))})}function Zt(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Xt({item:e}){return e.html?(0,u.jsx)("span",{className:(0,i.A)("footer__link-item",e.className),dangerouslySetInnerHTML:{__html:e.html}}):(0,u.jsx)(Qt,{item:e})}function Jt({links:e}){return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:e.map((t,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Xt,{item:t}),e.length!==n+1&&(0,u.jsx)(Zt,{})]},n))})})}function en({links:e}){return function(e){return"title"in e[0]}(e)?(0,u.jsx)(Kt,{columns:e}):(0,u.jsx)(Jt,{links:e})}var tn=n(21122);const nn="footerLogoLink_BH7S";function rn({logo:e}){const{withBaseUrl:t}=(0,ue.hH)(),n={light:t(e.src),dark:t(e.srcDark??e.src)};return(0,u.jsx)(tn.A,{className:(0,i.A)("footer__logo",e.className),alt:e.alt,sources:n,width:e.width,height:e.height,style:e.style})}function an({logo:e}){return e.href?(0,u.jsx)(ce.A,{href:e.href,className:nn,target:e.target,children:(0,u.jsx)(rn,{logo:e})}):(0,u.jsx)(rn,{logo:e})}function on({copyright:e}){return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:e}})}function sn({style:e,links:t,logo:n,copyright:r}){return(0,u.jsx)("footer",{className:(0,i.A)(m.G.layout.footer.container,"footer",{"footer--dark":"dark"===e}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[t,(n||r)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[n&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:n}),r]})]})})}function ln(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:i}=e;return(0,u.jsx)(sn,{style:i,links:n&&n.length>0&&(0,u.jsx)(en,{links:n}),logo:r&&(0,u.jsx)(an,{logo:r}),copyright:t&&(0,u.jsx)(on,{copyright:t})})}const cn=r.memo(ln),un=(0,L.fM)([z.a,S.o,O.Tv,Tt.VQ,o.Jx,function({children:e}){return(0,u.jsx)(P.y_,{children:(0,u.jsx)(N.e,{children:(0,u.jsx)(R,{children:e})})})}]);function dn({children:e}){return(0,u.jsx)(un,{children:e})}var pn=n(51107);function fn({error:e,tryAgain:t}){return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(pn.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Mt.a2,{onClick:t,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Mt.bq,{error:e})})]})})})}const gn={mainWrapper:"mainWrapper_z2l0"};function hn(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.J)(),(0,u.jsxs)(dn,{children:[(0,u.jsx)(o.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(C,{}),(0,u.jsx)(Wt,{}),(0,u.jsx)("div",{id:d,className:(0,i.A)(m.G.layout.main.container,m.G.wrapper.main,gn.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(fn,{...e}),children:t})}),!n&&(0,u.jsx)(cn,{})]})}},14090:(e,t,n)=>{"use strict";n.d(t,{w:()=>i,J:()=>a});var r=n(96540);const i="navigation-with-keyboard";function a(){(0,r.useEffect)(()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(i),"mousedown"===e.type&&document.body.classList.remove(i)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(i),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}},[])}},14563:(e,t,n)=>{"use strict";n.d(t,{AL:()=>u,s$:()=>d});var r=n(96540),i=n(44586),a=n(36803),o=n(89532),s=n(74848);const l=({title:e,siteTitle:t,titleDelimiter:n})=>{const r=e?.trim();return r&&r!==t?`${r} ${n} ${t}`:t},c=(0,r.createContext)(null);function u({formatter:e,children:t}){return(0,s.jsx)(c.Provider,{value:e,children:t})}function d(){const e=function(){const e=(0,r.useContext)(c);if(null===e)throw new o.dV("TitleFormatterProvider");return e}(),{siteConfig:t}=(0,i.A)(),{title:n,titleDelimiter:s}=t,{plugin:u}=(0,a.A)();return{format:t=>e({title:t,siteTitle:n,titleDelimiter:s,plugin:u,defaultFormatter:l})}}},16654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function i(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>i,z:()=>r})},17065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},17559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},announcementBar:{container:"theme-announcement-bar"},tabs:{container:"theme-tabs-container"},layout:{navbar:{container:"theme-layout-navbar",containerLeft:"theme-layout-navbar-left",containerRight:"theme-layout-navbar-right",mobileSidebar:{container:"theme-layout-navbar-sidebar",panel:"theme-layout-navbar-sidebar-panel"}},main:{container:"theme-layout-main"},footer:{container:"theme-layout-footer",column:"theme-layout-footer-column"}},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},19700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,i,a){if(n.language===r){var o=n.tokenStack=[];n.code=n.code.replace(i,function(e){if("function"==typeof a&&!a(e))return e;for(var i,s=o.length;-1!==n.code.indexOf(i=t(r,s));)++s;return o[s]=e,i}),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var i=0,a=Object.keys(n.tokenStack);!function o(s){for(var l=0;l=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[i],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),g=p.indexOf(f);if(g>-1){++i;var h=p.substring(0,g),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(g+f.length),y=[];h&&y.push.apply(y,o([h])),y.push(m),b&&y.push.apply(y,o([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&o(c.content)}return s}(n.tokens)}}}})}(Prism)},20311:e=>{"use strict";e.exports=function(e,t,n,r,i,a,o,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,i,a,o,s],u=0;(l=new Error(t.replace(/%s/g,function(){return c[u++]}))).name="Invariant Violation"}throw l.framesToPop=1,l}}},21122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(96540),i=n(34164),a=n(92303),o=n(95293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(74848);function c({className:e,children:t}){const n=(0,a.A)(),{colorMode:c}=(0,o.G)();return(0,l.jsx)(l.Fragment,{children:(n?"dark"===c?["dark"]:["light"]:["light","dark"]).map(n=>{const a=t({theme:n,className:(0,i.A)(e,s.themedComponent,s[`themedComponent--${n}`])});return(0,l.jsx)(r.Fragment,{children:a},n)})})}function u(e){const{sources:t,className:n,alt:r,...i}=e;return(0,l.jsx)(c,{className:n,children:({theme:e,className:n})=>(0,l.jsx)("img",{src:t[e],alt:r,className:n,...i})})}},21312:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(96540),i=n(74848);function a(e,t){const n=e.split(/(\{\w+\})/).map((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e});return n.some(e=>(0,r.isValidElement)(e))?n.map((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e).filter(e=>""!==e):n.join("")}var o=n(22654);function s({id:e,message:t}){if(void 0===e&&void 0===t)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[e??t]??t??e}function l({message:e,id:t},n){return a(s({message:e,id:t}),n)}function c({children:e,id:t,values:n}){if(e&&"string"!=typeof e)throw console.warn("Illegal children",e),new Error("The Docusaurus component only accept simple string values");const r=s({message:e,id:t});return(0,i.jsx)(i.Fragment,{children:a(r,n)})}},22069:(e,t,n)=>{"use strict";n.d(t,{M:()=>g,e:()=>f});var r=n(96540),i=n(75600),a=n(24581),o=n(57485),s=n(6342),l=n(89532),c=n(74848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,i.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[o,l]=(0,r.useState)(!1),c=(0,r.useCallback)(()=>{l(e=>!e)},[]);return(0,r.useEffect)(()=>{"desktop"===t&&l(!1)},[t]),(0,r.useMemo)(()=>({disabled:e,shouldRender:n,toggle:c,shown:o}),[e,n,c,o])}function p({handler:e}){return(0,o.$Z)(e),null}function f({children:e}){const t=d();return(0,c.jsxs)(c.Fragment,{children:[t.shown&&(0,c.jsx)(p,{handler:()=>(t.toggle(),!1)}),(0,c.jsx)(u.Provider,{value:t,children:e})]})}function g(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},22654:e=>{"use strict";e.exports={}},22799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,i=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,o=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,h=n?Symbol.for("react.memo"):60115,m=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function S(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case o:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case m:case h:case l:return e;default:return t}}case i:return t}}}function k(e){return S(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=m,t.Memo=h,t.Portal=i,t.Profiler=s,t.StrictMode=o,t.Suspense=f,t.isAsyncMode=function(e){return k(e)||S(e)===u},t.isConcurrentMode=k,t.isContextConsumer=function(e){return S(e)===c},t.isContextProvider=function(e){return S(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return S(e)===p},t.isFragment=function(e){return S(e)===a},t.isLazy=function(e){return S(e)===m},t.isMemo=function(e){return S(e)===h},t.isPortal=function(e){return S(e)===i},t.isProfiler=function(e){return S(e)===s},t.isStrictMode=function(e){return S(e)===o},t.isSuspense=function(e){return S(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===o||e===f||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===m||e.$$typeof===h||e.$$typeof===l||e.$$typeof===c||e.$$typeof===p||e.$$typeof===y||e.$$typeof===v||e.$$typeof===w||e.$$typeof===b)},t.typeOf=S},22831:(e,t,n)=>{"use strict";n.d(t,{u:()=>o,v:()=>s});var r=n(56347),i=n(58168),a=n(96540);function o(e,t,n){return void 0===n&&(n=[]),e.some(function(e){var i=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return i&&(n.push({route:e,match:i}),e.routes&&o(e.routes,t,n)),i}),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.dO,n,e.map(function(e,n){return a.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,i.A)({},n,{},t,{route:e})):a.createElement(e.component,(0,i.A)({},n,t,{route:e}))}})})):null}},23025:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(96540),i=n(89532),a=n(74848);const o=r.createContext(null);function s({children:e,version:t}){return(0,a.jsx)(o.Provider,{value:t,children:e})}function l(){const e=(0,r.useContext)(o);if(null===e)throw new i.dV("DocsVersionProvider");return e}},23104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>u,a_:()=>g,gk:()=>h});var r=n(96540),i=n(38193),a=n(92303),o=n(205),s=n(89532),l=n(74848);const c=r.createContext(void 0);function u({children:e}){const t=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)(()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}}),[])}();return(0,l.jsx)(c.Provider,{value:t,children:e})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.dV("ScrollControllerProvider");return e}const p=()=>i.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t=[]){const{scrollEventsEnabledRef:n}=d(),i=(0,r.useRef)(p()),a=(0,s._q)(e);(0,r.useEffect)(()=>{const e=()=>{if(!n.current)return;const e=p();a(e,i.current),i.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)},[a,n,...t])}function g(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)(t=>{e.current={elem:t,top:t.getBoundingClientRect().top}},[]),n=(0,r.useCallback)(()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}},[]);return(0,r.useMemo)(()=>({save:t,restore:n}),[n,t])}(),n=(0,r.useRef)(void 0),i=(0,r.useCallback)(r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}},[e,t]);return(0,o.A)(()=>{queueMicrotask(()=>n.current?.())}),{blockElementScrollPositionUntilNextRender:i}}function h(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const i=document.documentElement.scrollTop;(n&&i>e||!n&&it&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},23465:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(96540);var r=n(28774),i=n(86025),a=n(44586),o=n(6342),s=n(21122),l=n(74848);function c({logo:e,alt:t,imageClassName:n}){const r={light:(0,i.Ay)(e.src),dark:(0,i.Ay)(e.srcDark||e.src)},a=(0,l.jsx)(s.A,{className:e.className,sources:r,height:e.height,width:e.width,alt:t,style:e.style});return n?(0,l.jsx)("div",{className:n,children:a}):a}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,o.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,i.Ay)(s?.href||"/"),g=n?"":t,h=s?.alt??g;return(0,l.jsxs)(r.A,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:h,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},24581:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(96540),i=n(38193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},o=996;function s({desktopBreakpoint:e=o}={}){const[t,n]=(0,r.useState)(()=>"ssr");return(0,r.useEffect)(()=>{function t(){n(function(e){if(!i.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(e))}return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[e]),t}},26134:(e,t,n)=>{"use strict";var r=n(71765),i=n(4784);!function(e){const{themeConfig:{prism:t}}=i.default,{additionalLanguages:r}=t,a=globalThis.Prism;globalThis.Prism=e,r.forEach(e=>{"php"===e&&n(19700),n(42720)(`./prism-${e}`)}),delete globalThis.Prism,void 0!==a&&(globalThis.Prism=e)}(r.My)},26972:(e,t,n)=>{"use strict";n.d(t,{$S:()=>f,B5:()=>_,Nr:()=>p,OF:()=>w,QB:()=>x,Vd:()=>S,Y:()=>y,d1:()=>E,fW:()=>k,w8:()=>m});var r=n(96540),i=n(56347),a=n(22831),o=n(44070),s=n(99169),l=n(31682),c=n(53886),u=n(23025),d=n(60609);function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}function f(){const{pathname:e}=(0,i.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const g=(e,t)=>void 0!==e&&(0,s.ys)(e,t),h=(e,t)=>e.some(e=>m(e,t));function m(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||h(e.items,t))}function b(e,t){switch(e.type){case"category":return m(e,t)||void 0!==e.href&&!e.linkUnlisted||e.items.some(e=>b(e,t));case"link":return!e.unlisted||m(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)(()=>e.filter(e=>b(e,t)),[e,t])}function v({sidebarItems:e,pathname:t,onlyCategories:n=!1}){const r=[];return function e(i){for(const a of i)if("category"===a.type&&((0,s.ys)(a.href,t)||e(a.items))||"link"===a.type&&(0,s.ys)(a.href,t)){return n&&"category"!==a.type||r.unshift(a),!0}return!1}(e),r}function w(){const e=(0,d.t)(),{pathname:t}=(0,i.zy)(),n=(0,o.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function S(e){const{activeVersion:t}=(0,o.zK)(e),{preferredVersion:n}=(0,c.g1)(e),i=(0,o.r7)(e);return(0,r.useMemo)(()=>(0,l.sb)([t,n,i].filter(Boolean)),[t,n,i])}function k(e,t){const n=S(t);return(0,r.useMemo)(()=>{const t=n.flatMap(e=>e.sidebars?Object.entries(e.sidebars):[]),r=t.find(t=>t[0]===e);if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map(e=>e.name).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map(e=>e[0]).join("\n- ")}`);return r[1]},[e,n])}function x(e,t){const n=S(t);return(0,r.useMemo)(()=>{const t=n.flatMap(e=>e.docs),r=t.find(t=>t.id===e);if(!r){if(n.flatMap(e=>e.draftIds).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map(e=>e.name).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.sb)(t.map(e=>e.id)).join("\n- ")}`)}return r},[e,n])}function _({route:e}){const t=(0,i.zy)(),n=(0,u.r)(),r=e.routes,o=r.find(e=>(0,i.B6)(t.pathname,e));if(!o)return null;const s=o.sidebar,l=s?n.docsSidebars[s]:void 0;return{docElement:(0,a.v)(r),sidebarName:s,sidebarItems:l}}function E(e){return e.filter(e=>!("category"===e.type||"link"===e.type)||!!p(e))}},26988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(96540),i=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs/ignite3/","versions":[{"name":"current","label":"3.1.0 (Latest)","isLast":true,"path":"/docs/ignite3/3.1.0","mainDocId":"index","docs":[{"id":"api-reference/api/cpp-api-reference","path":"/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference","sidebar":"tutorialSidebar"},{"id":"api-reference/api/dotnet-api-reference","path":"/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference","sidebar":"tutorialSidebar"},{"id":"api-reference/api/index","path":"/docs/ignite3/3.1.0/api-reference/api/","sidebar":"tutorialSidebar"},{"id":"api-reference/api/java-api-reference","path":"/docs/ignite3/3.1.0/api-reference/api/java-api-reference","sidebar":"tutorialSidebar"},{"id":"api-reference/index","path":"/docs/ignite3/3.1.0/api-reference/","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/cpp/client-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/cpp/compute-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/cpp/cpp-index","path":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/cpp/network-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/cpp/sql-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/cpp/tables-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/cpp/transactions-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/ado-net-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/client-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/compute-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/data-streamer-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/dotnet-index","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/linq-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/network-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/sql-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/tables-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/dotnet/transactions-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/index","path":"/docs/ignite3/3.1.0/api-reference/native-clients/","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/catalog-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/client-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/compute-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/criteria-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/data-streamer-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/java-index","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/network-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/security-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/server-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/sql-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/tables-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api","sidebar":"tutorialSidebar"},{"id":"api-reference/native-clients/java/transactions-api","path":"/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api","sidebar":"tutorialSidebar"},{"id":"api-reference/sql-only-apis/index","path":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/","sidebar":"tutorialSidebar"},{"id":"api-reference/sql-only-apis/jdbc","path":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc","sidebar":"tutorialSidebar"},{"id":"api-reference/sql-only-apis/odbc","path":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc","sidebar":"tutorialSidebar"},{"id":"api-reference/sql-only-apis/python","path":"/docs/ignite3/3.1.0/api-reference/sql-only-apis/python","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/config-authentication","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/config-cluster-and-nodes","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/config-cluster-security","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/config-ssl-tls","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/config-storage","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/config-storage-overview","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-overview","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/config-storage-persistent","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/config-storage-rocksdb","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/config-storage-volatile","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-volatile","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/index","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/configuration/metrics-configuration","path":"/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/index","path":"/docs/ignite3/3.1.0/configure-and-operate/","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/installation/index","path":"/docs/ignite3/3.1.0/configure-and-operate/installation/","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/installation/install-deb-rpm","path":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-deb-rpm","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/installation/install-docker","path":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/installation/install-kubernetes","path":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/installation/install-zip","path":"/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/monitoring/available-metrics","path":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/monitoring/config-metrics","path":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/config-metrics","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/monitoring/index","path":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/monitoring/metrics","path":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/monitoring/metrics-system-views","path":"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/operations/colocation","path":"/docs/ignite3/3.1.0/configure-and-operate/operations/colocation","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/operations/disaster-recovery","path":"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/operations/disaster-recovery-partitions","path":"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-partitions","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/operations/disaster-recovery-system-groups","path":"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-system-groups","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/operations/handle-exceptions","path":"/docs/ignite3/3.1.0/configure-and-operate/operations/handle-exceptions","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/operations/index","path":"/docs/ignite3/3.1.0/configure-and-operate/operations/","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/operations/lifecycle","path":"/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/reference/cli-configuration","path":"/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/reference/cluster-configuration","path":"/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/reference/index","path":"/docs/ignite3/3.1.0/configure-and-operate/reference/","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/reference/node-configuration","path":"/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration","sidebar":"tutorialSidebar"},{"id":"configure-and-operate/reference/storage-profiles","path":"/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles","sidebar":"tutorialSidebar"},{"id":"develop/connect-to-ignite/index","path":"/docs/ignite3/3.1.0/develop/connect-to-ignite/","sidebar":"tutorialSidebar"},{"id":"develop/connect-to-ignite/jdbc","path":"/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc","sidebar":"tutorialSidebar"},{"id":"develop/connect-to-ignite/odbc","path":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc","sidebar":"tutorialSidebar"},{"id":"develop/connect-to-ignite/odbc-connection-string","path":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string","sidebar":"tutorialSidebar"},{"id":"develop/connect-to-ignite/odbc-querying-data","path":"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data","sidebar":"tutorialSidebar"},{"id":"develop/connect-to-ignite/python","path":"/docs/ignite3/3.1.0/develop/connect-to-ignite/python","sidebar":"tutorialSidebar"},{"id":"develop/ignite-clients/cpp-client","path":"/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client","sidebar":"tutorialSidebar"},{"id":"develop/ignite-clients/dotnet-client","path":"/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client","sidebar":"tutorialSidebar"},{"id":"develop/ignite-clients/index","path":"/docs/ignite3/3.1.0/develop/ignite-clients/","sidebar":"tutorialSidebar"},{"id":"develop/ignite-clients/java-client","path":"/docs/ignite3/3.1.0/develop/ignite-clients/java-client","sidebar":"tutorialSidebar"},{"id":"develop/index","path":"/docs/ignite3/3.1.0/develop/","sidebar":"tutorialSidebar"},{"id":"develop/integrate/index","path":"/docs/ignite3/3.1.0/develop/integrate/","sidebar":"tutorialSidebar"},{"id":"develop/integrate/spring-boot","path":"/docs/ignite3/3.1.0/develop/integrate/spring-boot","sidebar":"tutorialSidebar"},{"id":"develop/integrate/spring-data","path":"/docs/ignite3/3.1.0/develop/integrate/spring-data","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/code-deployment","path":"/docs/ignite3/3.1.0/develop/work-with-data/code-deployment","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/compute","path":"/docs/ignite3/3.1.0/develop/work-with-data/compute","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/events","path":"/docs/ignite3/3.1.0/develop/work-with-data/events","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/events-list","path":"/docs/ignite3/3.1.0/develop/work-with-data/events-list","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/index","path":"/docs/ignite3/3.1.0/develop/work-with-data/","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/java-client-logging","path":"/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/java-to-tables","path":"/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/serialization","path":"/docs/ignite3/3.1.0/develop/work-with-data/serialization","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/streaming","path":"/docs/ignite3/3.1.0/develop/work-with-data/streaming","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/table-api","path":"/docs/ignite3/3.1.0/develop/work-with-data/table-api","sidebar":"tutorialSidebar"},{"id":"develop/work-with-data/transactions","path":"/docs/ignite3/3.1.0/develop/work-with-data/transactions","sidebar":"tutorialSidebar"},{"id":"getting-started/best-practices","path":"/docs/ignite3/3.1.0/getting-started/best-practices","sidebar":"tutorialSidebar"},{"id":"getting-started/embedded-mode","path":"/docs/ignite3/3.1.0/getting-started/embedded-mode","sidebar":"tutorialSidebar"},{"id":"getting-started/index","path":"/docs/ignite3/3.1.0/getting-started/","sidebar":"tutorialSidebar"},{"id":"getting-started/intro","path":"/docs/ignite3/3.1.0/getting-started/intro","sidebar":"tutorialSidebar"},{"id":"getting-started/key-value-api","path":"/docs/ignite3/3.1.0/getting-started/key-value-api","sidebar":"tutorialSidebar"},{"id":"getting-started/migrate-from-3-0-to-3-1","path":"/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1","sidebar":"tutorialSidebar"},{"id":"getting-started/migrate-from-ignite-2","path":"/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2","sidebar":"tutorialSidebar"},{"id":"getting-started/quick-start","path":"/docs/ignite3/3.1.0/getting-started/quick-start","sidebar":"tutorialSidebar"},{"id":"getting-started/start-cluster","path":"/docs/ignite3/3.1.0/getting-started/start-cluster","sidebar":"tutorialSidebar"},{"id":"getting-started/work-with-sql","path":"/docs/ignite3/3.1.0/getting-started/work-with-sql","sidebar":"tutorialSidebar"},{"id":"index","path":"/docs/ignite3/3.1.0/","sidebar":"tutorialSidebar"},{"id":"sql/advanced/explain-statement","path":"/docs/ignite3/3.1.0/sql/advanced/explain-statement","sidebar":"tutorialSidebar"},{"id":"sql/advanced/index","path":"/docs/ignite3/3.1.0/sql/advanced/","sidebar":"tutorialSidebar"},{"id":"sql/advanced/performance-tuning","path":"/docs/ignite3/3.1.0/sql/advanced/performance-tuning","sidebar":"tutorialSidebar"},{"id":"sql/fundamentals/engine-architecture","path":"/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture","sidebar":"tutorialSidebar"},{"id":"sql/fundamentals/index","path":"/docs/ignite3/3.1.0/sql/fundamentals/","sidebar":"tutorialSidebar"},{"id":"sql/index","path":"/docs/ignite3/3.1.0/sql/","sidebar":"tutorialSidebar"},{"id":"sql/reference/data-types-and-functions/data-types","path":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types","sidebar":"tutorialSidebar"},{"id":"sql/reference/data-types-and-functions/index","path":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/","sidebar":"tutorialSidebar"},{"id":"sql/reference/data-types-and-functions/operational-commands","path":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands","sidebar":"tutorialSidebar"},{"id":"sql/reference/data-types-and-functions/operators-and-functions","path":"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions","sidebar":"tutorialSidebar"},{"id":"sql/reference/index","path":"/docs/ignite3/3.1.0/sql/reference/","sidebar":"tutorialSidebar"},{"id":"sql/reference/language-definition/ddl","path":"/docs/ignite3/3.1.0/sql/reference/language-definition/ddl","sidebar":"tutorialSidebar"},{"id":"sql/reference/language-definition/distribution-zones","path":"/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones","sidebar":"tutorialSidebar"},{"id":"sql/reference/language-definition/dml","path":"/docs/ignite3/3.1.0/sql/reference/language-definition/dml","sidebar":"tutorialSidebar"},{"id":"sql/reference/language-definition/grammar-reference","path":"/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference","sidebar":"tutorialSidebar"},{"id":"sql/reference/language-definition/index","path":"/docs/ignite3/3.1.0/sql/reference/language-definition/","sidebar":"tutorialSidebar"},{"id":"sql/reference/language-definition/transactions","path":"/docs/ignite3/3.1.0/sql/reference/language-definition/transactions","sidebar":"tutorialSidebar"},{"id":"sql/reference/sql-conformance/index","path":"/docs/ignite3/3.1.0/sql/reference/sql-conformance/","sidebar":"tutorialSidebar"},{"id":"sql/reference/sql-conformance/keywords","path":"/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords","sidebar":"tutorialSidebar"},{"id":"sql/reference/sql-conformance/overview","path":"/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview","sidebar":"tutorialSidebar"},{"id":"sql/working-with-sql/execute-queries","path":"/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries","sidebar":"tutorialSidebar"},{"id":"sql/working-with-sql/index","path":"/docs/ignite3/3.1.0/sql/working-with-sql/","sidebar":"tutorialSidebar"},{"id":"sql/working-with-sql/system-views","path":"/docs/ignite3/3.1.0/sql/working-with-sql/system-views","sidebar":"tutorialSidebar"},{"id":"tools/cli-commands","path":"/docs/ignite3/3.1.0/tools/cli-commands","sidebar":"tutorialSidebar"},{"id":"tools/glossary","path":"/docs/ignite3/3.1.0/tools/glossary","sidebar":"tutorialSidebar"},{"id":"tools/index","path":"/docs/ignite3/3.1.0/tools/","sidebar":"tutorialSidebar"},{"id":"tools/rest-api","path":"/docs/ignite3/3.1.0/tools/rest-api","sidebar":"tutorialSidebar"},{"id":"understand/architecture/architecture-overview","path":"/docs/ignite3/3.1.0/understand/architecture/architecture-overview","sidebar":"tutorialSidebar"},{"id":"understand/architecture/index","path":"/docs/ignite3/3.1.0/understand/architecture/","sidebar":"tutorialSidebar"},{"id":"understand/architecture/security","path":"/docs/ignite3/3.1.0/understand/architecture/security","sidebar":"tutorialSidebar"},{"id":"understand/architecture/storage-architecture","path":"/docs/ignite3/3.1.0/understand/architecture/storage-architecture","sidebar":"tutorialSidebar"},{"id":"understand/architecture/storage-engines/aimem","path":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem","sidebar":"tutorialSidebar"},{"id":"understand/architecture/storage-engines/aipersist","path":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist","sidebar":"tutorialSidebar"},{"id":"understand/architecture/storage-engines/index","path":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/","sidebar":"tutorialSidebar"},{"id":"understand/architecture/storage-engines/rocksdb","path":"/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb","sidebar":"tutorialSidebar"},{"id":"understand/core-concepts/compute-and-events","path":"/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events","sidebar":"tutorialSidebar"},{"id":"understand/core-concepts/data-partitioning","path":"/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning","sidebar":"tutorialSidebar"},{"id":"understand/core-concepts/distribution-and-colocation","path":"/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation","sidebar":"tutorialSidebar"},{"id":"understand/core-concepts/index","path":"/docs/ignite3/3.1.0/understand/core-concepts/","sidebar":"tutorialSidebar"},{"id":"understand/core-concepts/tables-and-schemas","path":"/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas","sidebar":"tutorialSidebar"},{"id":"understand/core-concepts/transactions-and-mvcc","path":"/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc","sidebar":"tutorialSidebar"},{"id":"understand/core-concepts/what-is-ignite","path":"/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite","sidebar":"tutorialSidebar"},{"id":"understand/index","path":"/docs/ignite3/3.1.0/understand/","sidebar":"tutorialSidebar"},{"id":"understand/performance/explain-operators","path":"/docs/ignite3/3.1.0/understand/performance/explain-operators","sidebar":"tutorialSidebar"},{"id":"understand/performance/index","path":"/docs/ignite3/3.1.0/understand/performance/","sidebar":"tutorialSidebar"},{"id":"understand/performance/using-explain","path":"/docs/ignite3/3.1.0/understand/performance/using-explain","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/ignite3/3.1.0/","label":"Apache Ignite 3 Documentation"}}}},{"name":"3.0.0","label":"3.0.0","isLast":false,"path":"/docs/ignite3/3.0.0","mainDocId":"index","docs":[{"id":"administrators-guide/cluster-security","path":"/docs/ignite3/3.0.0/administrators-guide/cluster-security","sidebar":"tutorialSidebar"},{"id":"administrators-guide/colocation","path":"/docs/ignite3/3.0.0/administrators-guide/colocation","sidebar":"tutorialSidebar"},{"id":"administrators-guide/config/cli-config","path":"/docs/ignite3/3.0.0/administrators-guide/config/cli-config","sidebar":"tutorialSidebar"},{"id":"administrators-guide/config/cluster-config","path":"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config","sidebar":"tutorialSidebar"},{"id":"administrators-guide/config/index","path":"/docs/ignite3/3.0.0/administrators-guide/config/","sidebar":"tutorialSidebar"},{"id":"administrators-guide/config/node-config","path":"/docs/ignite3/3.0.0/administrators-guide/config/node-config","sidebar":"tutorialSidebar"},{"id":"administrators-guide/config/storage/persistent","path":"/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent","sidebar":"tutorialSidebar"},{"id":"administrators-guide/config/storage/rocksdb","path":"/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb","sidebar":"tutorialSidebar"},{"id":"administrators-guide/config/storage/volatile","path":"/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile","sidebar":"tutorialSidebar"},{"id":"administrators-guide/disaster-recovery","path":"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery","sidebar":"tutorialSidebar"},{"id":"administrators-guide/handling-exceptions","path":"/docs/ignite3/3.0.0/administrators-guide/handling-exceptions","sidebar":"tutorialSidebar"},{"id":"administrators-guide/lifecycle","path":"/docs/ignite3/3.0.0/administrators-guide/lifecycle","sidebar":"tutorialSidebar"},{"id":"administrators-guide/metrics/configuring-metrics","path":"/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics","sidebar":"tutorialSidebar"},{"id":"administrators-guide/metrics/metrics-list","path":"/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list","sidebar":"tutorialSidebar"},{"id":"administrators-guide/metrics/system-views","path":"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views","sidebar":"tutorialSidebar"},{"id":"administrators-guide/security/authentication","path":"/docs/ignite3/3.0.0/administrators-guide/security/authentication","sidebar":"tutorialSidebar"},{"id":"administrators-guide/security/ssl-tls","path":"/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls","sidebar":"tutorialSidebar"},{"id":"administrators-guide/storage/data-partitions","path":"/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions","sidebar":"tutorialSidebar"},{"id":"administrators-guide/storage/engines/aimem","path":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem","sidebar":"tutorialSidebar"},{"id":"administrators-guide/storage/engines/aipersist","path":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist","sidebar":"tutorialSidebar"},{"id":"administrators-guide/storage/engines/index","path":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/","sidebar":"tutorialSidebar"},{"id":"administrators-guide/storage/engines/rocksdb","path":"/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb","sidebar":"tutorialSidebar"},{"id":"administrators-guide/storage/index","path":"/docs/ignite3/3.0.0/administrators-guide/storage/","sidebar":"tutorialSidebar"},{"id":"administrators-guide/storage/storage-profiles","path":"/docs/ignite3/3.0.0/administrators-guide/storage/storage-profiles","sidebar":"tutorialSidebar"},{"id":"administrators-guide/system-groups-recovery","path":"/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery","sidebar":"tutorialSidebar"},{"id":"developers-guide/clients/ado","path":"/docs/ignite3/3.0.0/developers-guide/clients/ado","sidebar":"tutorialSidebar"},{"id":"developers-guide/clients/cpp","path":"/docs/ignite3/3.0.0/developers-guide/clients/cpp","sidebar":"tutorialSidebar"},{"id":"developers-guide/clients/dotnet","path":"/docs/ignite3/3.0.0/developers-guide/clients/dotnet","sidebar":"tutorialSidebar"},{"id":"developers-guide/clients/index","path":"/docs/ignite3/3.0.0/developers-guide/clients/","sidebar":"tutorialSidebar"},{"id":"developers-guide/clients/java","path":"/docs/ignite3/3.0.0/developers-guide/clients/java","sidebar":"tutorialSidebar"},{"id":"developers-guide/clients/jdbc-driver","path":"/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver","sidebar":"tutorialSidebar"},{"id":"developers-guide/clients/linq","path":"/docs/ignite3/3.0.0/developers-guide/clients/linq","sidebar":"tutorialSidebar"},{"id":"developers-guide/clients/python","path":"/docs/ignite3/3.0.0/developers-guide/clients/python","sidebar":"tutorialSidebar"},{"id":"developers-guide/code-deployment/code-deployment","path":"/docs/ignite3/3.0.0/developers-guide/code-deployment/","sidebar":"tutorialSidebar"},{"id":"developers-guide/compute/compute","path":"/docs/ignite3/3.0.0/developers-guide/compute/","sidebar":"tutorialSidebar"},{"id":"developers-guide/compute/serialization","path":"/docs/ignite3/3.0.0/developers-guide/compute/serialization","sidebar":"tutorialSidebar"},{"id":"developers-guide/data-streamer","path":"/docs/ignite3/3.0.0/developers-guide/data-streamer","sidebar":"tutorialSidebar"},{"id":"developers-guide/events/events-list","path":"/docs/ignite3/3.0.0/developers-guide/events/events-list","sidebar":"tutorialSidebar"},{"id":"developers-guide/events/index","path":"/docs/ignite3/3.0.0/developers-guide/events/","sidebar":"tutorialSidebar"},{"id":"developers-guide/java-to-tables","path":"/docs/ignite3/3.0.0/developers-guide/java-to-tables","sidebar":"tutorialSidebar"},{"id":"developers-guide/rest/rest-api","path":"/docs/ignite3/3.0.0/developers-guide/rest/rest-api","sidebar":"tutorialSidebar"},{"id":"developers-guide/sql/calcite-based-sql-engine","path":"/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine","sidebar":"tutorialSidebar"},{"id":"developers-guide/sql/jdbc-driver","path":"/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver","sidebar":"tutorialSidebar"},{"id":"developers-guide/sql/odbc/connection-string","path":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string","sidebar":"tutorialSidebar"},{"id":"developers-guide/sql/odbc/odbc-driver","path":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver","sidebar":"tutorialSidebar"},{"id":"developers-guide/sql/odbc/querying-modifying-data","path":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data","sidebar":"tutorialSidebar"},{"id":"developers-guide/sql/odbc/specification","path":"/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification","sidebar":"tutorialSidebar"},{"id":"developers-guide/sql/sql-api","path":"/docs/ignite3/3.0.0/developers-guide/sql/sql-api","sidebar":"tutorialSidebar"},{"id":"developers-guide/sql/system-views","path":"/docs/ignite3/3.0.0/developers-guide/sql/system-views","sidebar":"tutorialSidebar"},{"id":"developers-guide/table-api","path":"/docs/ignite3/3.0.0/developers-guide/table-api","sidebar":"tutorialSidebar"},{"id":"developers-guide/transactions","path":"/docs/ignite3/3.0.0/developers-guide/transactions","sidebar":"tutorialSidebar"},{"id":"general-tips","path":"/docs/ignite3/3.0.0/general-tips","sidebar":"tutorialSidebar"},{"id":"glossary/glossary","path":"/docs/ignite3/3.0.0/glossary/","sidebar":"tutorialSidebar"},{"id":"ignite-cli-tool","path":"/docs/ignite3/3.0.0/ignite-cli-tool","sidebar":"tutorialSidebar"},{"id":"index","path":"/docs/ignite3/3.0.0/","sidebar":"tutorialSidebar"},{"id":"installation/deb-rpm","path":"/docs/ignite3/3.0.0/installation/deb-rpm","sidebar":"tutorialSidebar"},{"id":"installation/installing-to-k8s","path":"/docs/ignite3/3.0.0/installation/installing-to-k8s","sidebar":"tutorialSidebar"},{"id":"installation/installing-using-docker","path":"/docs/ignite3/3.0.0/installation/installing-using-docker","sidebar":"tutorialSidebar"},{"id":"installation/installing-using-zip","path":"/docs/ignite3/3.0.0/installation/installing-using-zip","sidebar":"tutorialSidebar"},{"id":"installation/migration-from-ai2/index","path":"/docs/ignite3/3.0.0/installation/migration-from-ai2/","sidebar":"tutorialSidebar"},{"id":"quick-start/embedded-mode","path":"/docs/ignite3/3.0.0/quick-start/embedded-mode","sidebar":"tutorialSidebar"},{"id":"quick-start/explore-sql","path":"/docs/ignite3/3.0.0/quick-start/explore-sql","sidebar":"tutorialSidebar"},{"id":"quick-start/getting-started-guide","path":"/docs/ignite3/3.0.0/quick-start/getting-started-guide","sidebar":"tutorialSidebar"},{"id":"quick-start/java-api","path":"/docs/ignite3/3.0.0/quick-start/java-api","sidebar":"tutorialSidebar"},{"id":"quick-start/persist-data","path":"/docs/ignite3/3.0.0/quick-start/persist-data","sidebar":"tutorialSidebar"},{"id":"quick-start/start-cluster","path":"/docs/ignite3/3.0.0/quick-start/start-cluster","sidebar":"tutorialSidebar"},{"id":"sql-reference/data-types","path":"/docs/ignite3/3.0.0/sql-reference/data-types","sidebar":"tutorialSidebar"},{"id":"sql-reference/ddl","path":"/docs/ignite3/3.0.0/sql-reference/ddl","sidebar":"tutorialSidebar"},{"id":"sql-reference/distribution-zones","path":"/docs/ignite3/3.0.0/sql-reference/distribution-zones","sidebar":"tutorialSidebar"},{"id":"sql-reference/dml","path":"/docs/ignite3/3.0.0/sql-reference/dml","sidebar":"tutorialSidebar"},{"id":"sql-reference/explain-operators-list","path":"/docs/ignite3/3.0.0/sql-reference/explain-operators-list","sidebar":"tutorialSidebar"},{"id":"sql-reference/explain-statement","path":"/docs/ignite3/3.0.0/sql-reference/explain-statement","sidebar":"tutorialSidebar"},{"id":"sql-reference/grammar-reference","path":"/docs/ignite3/3.0.0/sql-reference/grammar-reference","sidebar":"tutorialSidebar"},{"id":"sql-reference/keywords","path":"/docs/ignite3/3.0.0/sql-reference/keywords","sidebar":"tutorialSidebar"},{"id":"sql-reference/operational-commands","path":"/docs/ignite3/3.0.0/sql-reference/operational-commands","sidebar":"tutorialSidebar"},{"id":"sql-reference/operators-and-functions","path":"/docs/ignite3/3.0.0/sql-reference/operators-and-functions","sidebar":"tutorialSidebar"},{"id":"sql-reference/sql-conformance","path":"/docs/ignite3/3.0.0/sql-reference/sql-conformance","sidebar":"tutorialSidebar"},{"id":"sql-reference/transactions","path":"/docs/ignite3/3.0.0/sql-reference/transactions","sidebar":"tutorialSidebar"},{"id":"sql-tuning/sql-tuning","path":"/docs/ignite3/3.0.0/sql-tuning/","sidebar":"tutorialSidebar"},{"id":"sql-tuning/using-explain","path":"/docs/ignite3/3.0.0/sql-tuning/using-explain","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/ignite3/3.0.0/","label":"About Apache Ignite 3"}}}}],"breadcrumbs":true}}}'),o=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en","translate":false,"url":"https://ignite.apache.org","baseUrl":"/docs/ignite3/"}}}');var s=n(22654);const l=JSON.parse('{"docusaurusVersion":"3.9.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-css-cascade-layers":{"type":"package","name":"@docusaurus/plugin-css-cascade-layers","version":"3.9.2"},"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.9.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.9.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.9.2"},"docusaurus-plugin-svgr":{"type":"package","name":"@docusaurus/plugin-svgr","version":"3.9.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.9.2"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"3.9.2"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.52.1"}}}');var c=n(74848);const u={siteConfig:i.default,siteMetadata:l,globalData:a,i18n:o,codeTranslations:s},d=r.createContext(u);function p({children:e}){return(0,c.jsx)(d.Provider,{value:u,children:e})}},27674:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort((e,t)=>e[0]-t[0]||t[1]-e[1])}n.d(t,{g:()=>r})},28774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(96540),i=n(54625),a=n(70440),o=n(44586),s=n(16654),l=n(38193),c=n(63427),u=n(86025),d=n(74848);function p({isNavLink:e,to:t,href:n,activeClassName:p,isActive:f,"data-noBrokenLinkCheck":g,autoAddBaseUrl:h=!0,...m},b){const{siteConfig:y}=(0,o.A)(),{trailingSlash:v,baseUrl:w}=y,S=y.future.experimental_router,{withBaseUrl:k}=(0,u.hH)(),x=(0,c.A)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(b,()=>_.current);const E=t||n;const T=(0,s.A)(E),A=E?.replace("pathname://","");let C=void 0!==A?(N=A,h&&(e=>e.startsWith("/"))(N)?k(N):N):void 0;var N;"hash"===S&&C?.startsWith("./")&&(C=C?.slice(1)),C&&T&&(C=(0,a.Ks)(C,{trailingSlash:v,baseUrl:w}));const O=(0,r.useRef)(!1),L=e?i.k2:i.N_,P=l.A.canUseIntersectionObserver,j=(0,r.useRef)(),R=()=>{O.current||null==C||(window.docusaurus.preload(C),O.current=!0)};(0,r.useEffect)(()=>(!P&&T&&l.A.canUseDOM&&null!=C&&window.docusaurus.prefetch(C),()=>{P&&j.current&&j.current.disconnect()}),[j,C,P,T]);const I=C?.startsWith("#")??!1,D=!m.target||"_self"===m.target,F=!C||!T||!D||I&&"hash"!==S;g||!I&&F||x.collectLink(C),m.id&&x.collectAnchor(m.id);const M={};return F?(0,d.jsx)("a",{ref:_,href:C,...E&&!T&&{target:"_blank",rel:"noopener noreferrer"},...m,...M}):(0,d.jsx)(L,{...m,onMouseEnter:R,onTouchStart:R,innerRef:e=>{_.current=e,P&&e&&T&&(j.current=new window.IntersectionObserver(t=>{t.forEach(t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(j.current.unobserve(e),j.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))})}),j.current.observe(e))},to:C,...e&&{isActive:f,activeClassName:p},...M})}const f=r.forwardRef(p)},29698:(e,t)=>{"use strict";var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function i(e,t,r){var i=null;if(void 0!==r&&(i=""+r),void 0!==t.key&&(i=""+t.key),"key"in t)for(var a in r={},t)"key"!==a&&(r[a]=t[a]);else r=t;return t=r.ref,{$$typeof:n,type:e,key:i,ref:void 0!==t?t:null,props:r}}t.Fragment=r,t.jsx=i,t.jsxs=i},29869:(e,t)=>{"use strict";var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),o=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),g=Symbol.iterator;var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,b={};function y(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||h}function v(){}function w(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||h}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=y.prototype;var S=w.prototype=new v;S.constructor=w,m(S,y.prototype),S.isPureReactComponent=!0;var k=Array.isArray;function x(){}var _={H:null,A:null,T:null,S:null},E=Object.prototype.hasOwnProperty;function T(e,t,r){var i=r.ref;return{$$typeof:n,type:e,key:t,ref:void 0!==i?i:null,props:r}}function A(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var C=/\/+/g;function N(e,t){return"object"==typeof e&&null!==e&&null!=e.key?(n=""+e.key,r={"=":"=0",":":"=2"},"$"+n.replace(/[=:]/g,function(e){return r[e]})):t.toString(36);var n,r}function O(e,t,i,a,o){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var l,c,u=!1;if(null===e)u=!0;else switch(s){case"bigint":case"string":case"number":u=!0;break;case"object":switch(e.$$typeof){case n:case r:u=!0;break;case p:return O((u=e._init)(e._payload),t,i,a,o)}}if(u)return o=o(e),u=""===a?"."+N(e,0):a,k(o)?(i="",null!=u&&(i=u.replace(C,"$&/")+"/"),O(o,t,i,"",function(e){return e})):null!=o&&(A(o)&&(l=o,c=i+(null==o.key||e&&e.key===o.key?"":(""+o.key).replace(C,"$&/")+"/")+u,o=T(l.type,c,l.props)),t.push(o)),1;u=0;var d,f=""===a?".":a+":";if(k(e))for(var h=0;h{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,i="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,o){if(e===o)return!0;if(e&&o&&"object"==typeof e&&"object"==typeof o){if(e.constructor!==o.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=o.length)return!1;for(l=s;0!==l--;)if(!a(e[l],o[l]))return!1;return!0}if(n&&e instanceof Map&&o instanceof Map){if(e.size!==o.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!o.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!a(l.value[1],o.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&o instanceof Set){if(e.size!==o.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!o.has(l.value[0]))return!1;return!0}if(i&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(o)){if((s=e.length)!=o.length)return!1;for(l=s;0!==l--;)if(e[l]!==o[l])return!1;return!0}if(e.constructor===RegExp)return e.source===o.source&&e.flags===o.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof o.valueOf)return e.valueOf()===o.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof o.toString)return e.toString()===o.toString();if((s=(c=Object.keys(e)).length)!==Object.keys(o).length)return!1;for(l=s;0!==l--;)if(!Object.prototype.hasOwnProperty.call(o,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!==l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!a(e[c[l]],o[c[l]]))return!1;return!0}return e!=e&&o!=o}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},31247:(e,t,n)=>{"use strict";var r=n(69982),i=n(96540),a=n(40961);function o(e){var t="https://react.dev/errors/"+e;if(1M||(e.current=F[M],F[M]=null,M--)}function B(e,t){M++,F[M]=e.current,e.current=t}var $,U,H=q(null),V=q(null),W=q(null),Q=q(null);function G(e,t){switch(B(W,t),B(V,e),B(H,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?bd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=yd(t=bd(t),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}z(H),B(H,e)}function Y(){z(H),z(V),z(W)}function K(e){null!==e.memoizedState&&B(Q,e);var t=H.current,n=yd(t,e.type);t!==n&&(B(V,e),B(H,n))}function Z(e){V.current===e&&(z(H),z(V)),Q.current===e&&(z(Q),up._currentValue=D)}function X(e){if(void 0===$)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);$=t&&t[1]||"",U=-1)":-1--i||l[r]!==c[i]){var u="\n"+l[r].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}}while(1<=r&&0<=i);break}}}finally{J=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?X(n):""}function te(e,t){switch(e.tag){case 26:case 27:case 5:return X(e.type);case 16:return X("Lazy");case 13:return e.child!==t&&null!==t?X("Suspense Fallback"):X("Suspense");case 19:return X("SuspenseList");case 0:case 15:return ee(e.type,!1);case 11:return ee(e.type.render,!1);case 1:return ee(e.type,!0);case 31:return X("Activity");default:return""}}function ne(e){try{var t="",n=null;do{t+=te(e,n),n=e,e=e.return}while(e);return t}catch(r){return"\nError generating stack: "+r.message+"\n"+r.stack}}var re=Object.prototype.hasOwnProperty,ie=r.unstable_scheduleCallback,ae=r.unstable_cancelCallback,oe=r.unstable_shouldYield,se=r.unstable_requestPaint,le=r.unstable_now,ce=r.unstable_getCurrentPriorityLevel,ue=r.unstable_ImmediatePriority,de=r.unstable_UserBlockingPriority,pe=r.unstable_NormalPriority,fe=r.unstable_LowPriority,ge=r.unstable_IdlePriority,he=r.log,me=r.unstable_setDisableYieldValue,be=null,ye=null;function ve(e){if("function"==typeof he&&me(e),ye&&"function"==typeof ye.setStrictMode)try{ye.setStrictMode(be,e)}catch(t){}}var we=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(Se(e)/ke|0)|0},Se=Math.log,ke=Math.LN2;var xe=256,_e=262144,Ee=4194304;function Te(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return 261888&e;case 262144:case 524288:case 1048576:case 2097152:return 3932160&e;case 4194304:case 8388608:case 16777216:case 33554432:return 62914560&e;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ae(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=134217727&r;return 0!==s?0!==(r=s&~a)?i=Te(r):0!==(o&=s)?i=Te(o):n||0!==(n=s&~e)&&(i=Te(n)):0!==(s=r&~a)?i=Te(s):0!==o?i=Te(o):n||0!==(n=r&~e)&&(i=Te(n)),0===i?0:0!==t&&t!==i&&0===(t&a)&&((a=i&-i)>=(n=t&-t)||32===a&&4194048&n)?t:i}function Ce(e,t){return 0===(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function Ne(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function Oe(){var e=Ee;return!(62914560&(Ee<<=1))&&(Ee=4194304),e}function Le(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Pe(e,t){e.pendingLanes|=t,268435456!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function je(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-we(t);e.entangledLanes|=t,e.entanglements[r]=1073741824|e.entanglements[r]|261930&n}function Re(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-we(n),i=1<=Tn),Nn=String.fromCharCode(32),On=!1;function Ln(e,t){switch(e){case"keyup":return-1!==_n.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Pn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var jn=!1;var Rn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function In(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Rn[e.type]:"textarea"===t}function Dn(e,t,n,r){It?Dt?Dt.push(r):Dt=[r]:It=r,0<(t=rd(t,"onChange")).length&&(n=new nn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Fn=null,Mn=null;function qn(e){Yu(e,0)}function zn(e){if(gt(Xe(e)))return e}function Bn(e,t){if("change"===e)return t}var $n=!1;if(Bt){var Un;if(Bt){var Hn="oninput"in document;if(!Hn){var Vn=document.createElement("div");Vn.setAttribute("oninput","return;"),Hn="function"==typeof Vn.oninput}Un=Hn}else Un=!1;$n=Un&&(!document.documentMode||9=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=er(r)}}function nr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?nr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function rr(e){for(var t=ht((e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window).document);t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=ht((e=t.contentWindow).document)}return t}function ir(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var ar=Bt&&"documentMode"in document&&11>=document.documentMode,or=null,sr=null,lr=null,cr=!1;function ur(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;cr||null==or||or!==ht(r)||("selectionStart"in(r=or)&&ir(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},lr&&Jn(lr,r)||(lr=r,0<(r=rd(sr,"onSelect")).length&&(t=new nn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=or)))}function dr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var pr={animationend:dr("Animation","AnimationEnd"),animationiteration:dr("Animation","AnimationIteration"),animationstart:dr("Animation","AnimationStart"),transitionrun:dr("Transition","TransitionRun"),transitionstart:dr("Transition","TransitionStart"),transitioncancel:dr("Transition","TransitionCancel"),transitionend:dr("Transition","TransitionEnd")},fr={},gr={};function hr(e){if(fr[e])return fr[e];if(!pr[e])return e;var t,n=pr[e];for(t in n)if(n.hasOwnProperty(t)&&t in gr)return fr[e]=n[t];return e}Bt&&(gr=document.createElement("div").style,"AnimationEvent"in window||(delete pr.animationend.animation,delete pr.animationiteration.animation,delete pr.animationstart.animation),"TransitionEvent"in window||delete pr.transitionend.transition);var mr=hr("animationend"),br=hr("animationiteration"),yr=hr("animationstart"),vr=hr("transitionrun"),wr=hr("transitionstart"),Sr=hr("transitioncancel"),kr=hr("transitionend"),xr=new Map,_r="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Er(e,t){xr.set(e,t),rt(t,[e])}_r.push("scrollEnd");var Tr="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)},Ar=[],Cr=0,Nr=0;function Or(){for(var e=Cr,t=Nr=Cr=0;t>=o,i-=o,ni=1<<32-we(t)+i|n<h?(m=d,d=null):m=d.sibling;var b=f(i,d,s[h],l);if(null===b){null===d&&(d=m);break}e&&d&&null===b.alternate&&t(i,d),o=a(b,o,h),null===u?c=b:u.sibling=b,u=b,d=m}if(h===s.length)return n(i,d),di&&ii(i,h),c;if(null===d){for(;hm?(b=h,h=null):b=h.sibling;var v=f(i,h,y.value,c);if(null===v){null===h&&(h=b);break}e&&h&&null===v.alternate&&t(i,h),s=a(v,s,m),null===d?u=v:d.sibling=v,d=v,h=b}if(y.done)return n(i,h),di&&ii(i,m),u;if(null===h){for(;!y.done;m++,y=l.next())null!==(y=p(i,y.value,c))&&(s=a(y,s,m),null===d?u=y:d.sibling=y,d=y);return di&&ii(i,m),u}for(h=r(h);!y.done;m++,y=l.next())null!==(y=g(h,i,m,y.value,c))&&(e&&null!==y.alternate&&h.delete(null===y.key?m:y.key),s=a(y,s,m),null===d?u=y:d.sibling=y,d=y);return e&&h.forEach(function(e){return t(i,e)}),di&&ii(i,m),u}(l,c,u=v.call(u),d)}if("function"==typeof u.then)return y(l,c,ca(u),d);if(u.$$typeof===S)return y(l,c,ji(l,u),d);da(l,u)}return"string"==typeof u&&""!==u||"number"==typeof u||"bigint"==typeof u?(u=""+u,null!==c&&6===c.tag?(n(l,c.sibling),(d=i(c,u)).return=l,l=d):(n(l,c),(d=Hr(u,l.mode,d)).return=l,l=d),s(l)):n(l,c)}return function(e,t,n,r){try{la=0;var i=y(e,t,n,r);return sa=null,i}catch(o){if(o===Zi||o===Ji)throw o;var a=Mr(29,o,null,e.mode);return a.lanes=r,a.return=e,a}}}var fa=pa(!0),ga=pa(!1),ha=!1;function ma(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function ba(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function ya(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function va(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&fc){var i=r.pending;return null===i?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=Ir(e),Rr(e,null,n),t}return Lr(e,r,t,n),Ir(e)}function wa(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194048&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,Re(e,n)}}function Sa(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var i=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};null===a?i=a=o:a=a.next=o,n=n.next}while(null!==n);null===a?i=a=t:a=a.next=t}else i=a=t;return n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var ka=!1;function xa(){if(ka){if(null!==Hi)throw Hi}}function _a(e,t,n,r){ka=!1;var i=e.updateQueue;ha=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(null!==s){i.shared.pending=null;var l=s,c=l.next;l.next=null,null===o?a=c:o.next=c,o=l;var u=e.alternate;null!==u&&((s=(u=u.updateQueue).lastBaseUpdate)!==o&&(null===s?u.firstBaseUpdate=c:s.next=c,u.lastBaseUpdate=l))}if(null!==a){var d=i.baseState;for(o=0,u=c=l=null,s=a;;){var p=-536870913&s.lane,g=p!==s.lane;if(g?(mc&p)===p:(r&p)===p){0!==p&&p===Ui&&(ka=!0),null!==u&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});e:{var h=e,m=s;p=t;var b=n;switch(m.tag){case 1:if("function"==typeof(h=m.payload)){d=h.call(b,d,p);break e}d=h;break e;case 3:h.flags=-65537&h.flags|128;case 0:if(null==(p="function"==typeof(h=m.payload)?h.call(b,d,p):h))break e;d=f({},d,p);break e;case 2:ha=!0}}null!==(p=s.callback)&&(e.flags|=64,g&&(e.flags|=8192),null===(g=i.callbacks)?i.callbacks=[p]:g.push(p))}else g={lane:p,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(c=u=g,l=d):u=u.next=g,o|=p;if(null===(s=s.next)){if(null===(s=i.shared.pending))break;s=(g=s).next,g.next=null,i.lastBaseUpdate=g,i.shared.pending=null}}null===u&&(l=d),i.baseState=l,i.firstBaseUpdate=c,i.lastBaseUpdate=u,null===a&&(i.shared.lanes=0),_c|=o,e.lanes=o,e.memoizedState=d}}function Ea(e,t){if("function"!=typeof e)throw Error(o(191,e));e.call(t)}function Ta(e,t){var n=e.callbacks;if(null!==n)for(e.callbacks=null,e=0;ea?a:8;var o,s,l,c=R.T,u={};R.T=u,ds(e,!1,t,n);try{var d=i(),p=R.S;if(null!==p&&p(u,d),null!==d&&"object"==typeof d&&"function"==typeof d.then)us(e,t,(o=r,s=[],l={status:"pending",value:null,reason:null,then:function(e){s.push(e)}},d.then(function(){l.status="fulfilled",l.value=o;for(var e=0;e<\/script>",a=a.removeChild(a.firstChild);break;case"select":a="string"==typeof r.is?s.createElement("select",{is:r.is}):s.createElement("select"),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a="string"==typeof r.is?s.createElement(i,{is:r.is}):s.createElement(i)}}a[Be]=t,a[$e]=r;e:for(s=t.child;null!==s;){if(5===s.tag||6===s.tag)a.appendChild(s.stateNode);else if(4!==s.tag&&27!==s.tag&&null!==s.child){s.child.return=s,s=s.child;continue}if(s===t)break e;for(;null===s.sibling;){if(null===s.return||s.return===t)break e;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=a;e:switch(pd(a,i,r),i){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}r&&sl(t)}}return pl(t),ll(t,t.type,null===e||e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&null!=t.stateNode)e.memoizedProps!==r&&sl(t);else{if("string"!=typeof r&&null===t.stateNode)throw Error(o(166));if(e=W.current,yi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,null!==(i=ci))switch(i.tag){case 27:case 5:r=i.memoizedProps}e[Be]=t,(e=!!(e.nodeValue===n||null!==r&&!0===r.suppressHydrationWarning||cd(e.nodeValue,n)))||hi(t,!0)}else(e=md(e).createTextNode(r))[Be]=t,t.stateNode=e}return pl(t),null;case 31:if(n=t.memoizedState,null===e||null!==e.memoizedState){if(r=yi(t),null!==n){if(null===e){if(!r)throw Error(o(318));if(!(e=null!==(e=t.memoizedState)?e.dehydrated:null))throw Error(o(557));e[Be]=t}else vi(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;pl(t),e=!1}else n=wi(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return 256&t.flags?(Ma(t),t):(Ma(t),null);if(128&t.flags)throw Error(o(558))}return pl(t),null;case 13:if(r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(i=yi(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(o(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(o(317));i[Be]=t}else vi(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;pl(t),i=!1}else i=wi(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return 256&t.flags?(Ma(t),t):(Ma(t),null)}return Ma(t),128&t.flags?(t.lanes=n,t):(n=null!==r,e=null!==e&&null!==e.memoizedState,n&&(i=null,null!==(r=t.child).alternate&&null!==r.alternate.memoizedState&&null!==r.alternate.memoizedState.cachePool&&(i=r.alternate.memoizedState.cachePool.pool),a=null,null!==r.memoizedState&&null!==r.memoizedState.cachePool&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),ul(t,t.updateQueue),pl(t),null);case 4:return Y(),null===e&&Ju(t.stateNode.containerInfo),pl(t),null;case 10:return Ti(t.type),pl(t),null;case 19:if(z(qa),null===(r=t.memoizedState))return pl(t),null;if(i=!!(128&t.flags),null===(a=r.rendering))if(i)dl(r,!1);else{if(0!==xc||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(a=za(e))){for(t.flags|=128,dl(r,!1),e=a.updateQueue,t.updateQueue=e,ul(t,e),t.subtreeFlags=0,e=n,n=t.child;null!==n;)Br(n,e),n=n.sibling;return B(qa,1&qa.current|2),di&&ii(t,r.treeForkCount),t.child}e=e.sibling}null!==r.tail&&le()>Rc&&(t.flags|=128,i=!0,dl(r,!1),t.lanes=4194304)}else{if(!i)if(null!==(e=za(a))){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,ul(t,e),dl(r,!0),null===r.tail&&"hidden"===r.tailMode&&!a.alternate&&!di)return pl(t),null}else 2*le()-r.renderingStartTime>Rc&&536870912!==n&&(t.flags|=128,i=!0,dl(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(null!==(e=r.last)?e.sibling=a:t.child=a,r.last=a)}return null!==r.tail?(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=le(),e.sibling=null,n=qa.current,B(qa,i?1&n|2:1&n),di&&ii(t,r.treeForkCount),e):(pl(t),null);case 22:case 23:return Ma(t),La(),r=null!==t.memoizedState,null!==e?null!==e.memoizedState!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?!!(536870912&n)&&!(128&t.flags)&&(pl(t),6&t.subtreeFlags&&(t.flags|=8192)):pl(t),null!==(n=t.updateQueue)&&ul(t,n.retryQueue),n=null,null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),r=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),null!==e&&z(Qi),null;case 24:return n=null,null!==e&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Ti(Mi),pl(t),null;case 25:case 30:return null}throw Error(o(156,t.tag))}function gl(e,t){switch(si(t),t.tag){case 1:return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Ti(Mi),Y(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 26:case 27:case 5:return Z(t),null;case 31:if(null!==t.memoizedState){if(Ma(t),null===t.alternate)throw Error(o(340));vi()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 13:if(Ma(t),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(o(340));vi()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return z(qa),null;case 4:return Y(),null;case 10:return Ti(t.type),null;case 22:case 23:return Ma(t),La(),null!==e&&z(Qi),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 24:return Ti(Mi),null;default:return null}}function hl(e,t){switch(si(t),t.tag){case 3:Ti(Mi),Y();break;case 26:case 27:case 5:Z(t);break;case 4:Y();break;case 31:null!==t.memoizedState&&Ma(t);break;case 13:Ma(t);break;case 19:z(qa);break;case 10:Ti(t.type);break;case 22:case 23:Ma(t),La(),null!==e&&z(Qi);break;case 24:Ti(Mi)}}function ml(e,t){try{var n=t.updateQueue,r=null!==n?n.lastEffect:null;if(null!==r){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(s){xu(t,t.return,s)}}function bl(e,t,n){try{var r=t.updateQueue,i=null!==r?r.lastEffect:null;if(null!==i){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(void 0!==s){o.destroy=void 0,i=t;var l=n,c=s;try{c()}catch(u){xu(i,l,u)}}}r=r.next}while(r!==a)}}catch(u){xu(t,t.return,u)}}function yl(e){var t=e.updateQueue;if(null!==t){var n=e.stateNode;try{Ta(t,n)}catch(r){xu(e,e.return,r)}}}function vl(e,t,n){n.props=xs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(r){xu(e,t,r)}}function wl(e,t){try{var n=e.ref;if(null!==n){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;default:r=e.stateNode}"function"==typeof n?e.refCleanup=n(r):n.current=r}}catch(i){xu(e,t,i)}}function Sl(e,t){var n=e.ref,r=e.refCleanup;if(null!==n)if("function"==typeof r)try{r()}catch(i){xu(e,t,i)}finally{e.refCleanup=null,null!=(e=e.alternate)&&(e.refCleanup=null)}else if("function"==typeof n)try{n(null)}catch(a){xu(e,t,a)}else n.current=null}function kl(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&r.focus();break e;case"img":n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(i){xu(e,e.return,i)}}function xl(e,t,n){try{var r=e.stateNode;!function(e,t,n,r){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var i=null,a=null,s=null,l=null,c=null,u=null,d=null;for(g in n){var p=n[g];if(n.hasOwnProperty(g)&&null!=p)switch(g){case"checked":case"value":break;case"defaultValue":c=p;default:r.hasOwnProperty(g)||ud(e,t,g,null,r,p)}}for(var f in r){var g=r[f];if(p=n[f],r.hasOwnProperty(f)&&(null!=g||null!=p))switch(f){case"type":a=g;break;case"name":i=g;break;case"checked":u=g;break;case"defaultChecked":d=g;break;case"value":s=g;break;case"defaultValue":l=g;break;case"children":case"dangerouslySetInnerHTML":if(null!=g)throw Error(o(137,t));break;default:g!==p&&ud(e,t,f,g,r,p)}}return void yt(e,s,l,c,u,d,a,i);case"select":for(a in g=s=l=f=null,n)if(c=n[a],n.hasOwnProperty(a)&&null!=c)switch(a){case"value":break;case"multiple":g=c;default:r.hasOwnProperty(a)||ud(e,t,a,null,r,c)}for(i in r)if(a=r[i],c=n[i],r.hasOwnProperty(i)&&(null!=a||null!=c))switch(i){case"value":f=a;break;case"defaultValue":l=a;break;case"multiple":s=a;default:a!==c&&ud(e,t,i,a,r,c)}return t=l,n=s,r=g,void(null!=f?St(e,!!n,f,!1):!!r!=!!n&&(null!=t?St(e,!!n,t,!0):St(e,!!n,n?[]:"",!1)));case"textarea":for(l in g=f=null,n)if(i=n[l],n.hasOwnProperty(l)&&null!=i&&!r.hasOwnProperty(l))switch(l){case"value":case"children":break;default:ud(e,t,l,null,r,i)}for(s in r)if(i=r[s],a=n[s],r.hasOwnProperty(s)&&(null!=i||null!=a))switch(s){case"value":f=i;break;case"defaultValue":g=i;break;case"children":break;case"dangerouslySetInnerHTML":if(null!=i)throw Error(o(91));break;default:i!==a&&ud(e,t,s,i,r,a)}return void kt(e,f,g);case"option":for(var h in n)if(f=n[h],n.hasOwnProperty(h)&&null!=f&&!r.hasOwnProperty(h))if("selected"===h)e.selected=!1;else ud(e,t,h,null,r,f);for(c in r)if(f=r[c],g=n[c],r.hasOwnProperty(c)&&f!==g&&(null!=f||null!=g))if("selected"===c)e.selected=f&&"function"!=typeof f&&"symbol"!=typeof f;else ud(e,t,c,f,r,g);return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var m in n)f=n[m],n.hasOwnProperty(m)&&null!=f&&!r.hasOwnProperty(m)&&ud(e,t,m,null,r,f);for(u in r)if(f=r[u],g=n[u],r.hasOwnProperty(u)&&f!==g&&(null!=f||null!=g))switch(u){case"children":case"dangerouslySetInnerHTML":if(null!=f)throw Error(o(137,t));break;default:ud(e,t,u,f,r,g)}return;default:if(Ct(t)){for(var b in n)f=n[b],n.hasOwnProperty(b)&&void 0!==f&&!r.hasOwnProperty(b)&&dd(e,t,b,void 0,r,f);for(d in r)f=r[d],g=n[d],!r.hasOwnProperty(d)||f===g||void 0===f&&void 0===g||dd(e,t,d,f,r,g);return}}for(var y in n)f=n[y],n.hasOwnProperty(y)&&null!=f&&!r.hasOwnProperty(y)&&ud(e,t,y,null,r,f);for(p in r)f=r[p],g=n[p],!r.hasOwnProperty(p)||f===g||null==f&&null==g||ud(e,t,p,f,r,g)}(r,e.type,n,t),r[$e]=t}catch(i){xu(e,e.return,i)}}function _l(e){return 5===e.tag||3===e.tag||26===e.tag||27===e.tag&&Td(e.type)||4===e.tag}function El(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||_l(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(27===e.tag&&Td(e.type))continue e;if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function Tl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?(9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).insertBefore(e,t):((t=9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Pt));else if(4!==r&&(27===r&&Td(e.type)&&(n=e.stateNode,t=null),null!==(e=e.child)))for(Tl(e,t,n),e=e.sibling;null!==e;)Tl(e,t,n),e=e.sibling}function Al(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&(27===r&&Td(e.type)&&(n=e.stateNode),null!==(e=e.child)))for(Al(e,t,n),e=e.sibling;null!==e;)Al(e,t,n),e=e.sibling}function Cl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);pd(t,r,n),t[Be]=e,t[$e]=n}catch(a){xu(e,e.return,a)}}var Nl=!1,Ol=!1,Ll=!1,Pl="function"==typeof WeakSet?WeakSet:Set,jl=null;function Rl(e,t,n){var r=n.flags;switch(n.tag){case 0:case 11:case 15:Gl(e,n),4&r&&ml(5,n);break;case 1:if(Gl(e,n),4&r)if(e=n.stateNode,null===t)try{e.componentDidMount()}catch(o){xu(n,n.return,o)}else{var i=xs(n.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(i,t,e.__reactInternalSnapshotBeforeUpdate)}catch(s){xu(n,n.return,s)}}64&r&&yl(n),512&r&&wl(n,n.return);break;case 3:if(Gl(e,n),64&r&&null!==(e=n.updateQueue)){if(t=null,null!==n.child)switch(n.child.tag){case 27:case 5:case 1:t=n.child.stateNode}try{Ta(e,t)}catch(o){xu(n,n.return,o)}}break;case 27:null===t&&4&r&&Cl(n);case 26:case 5:Gl(e,n),null===t&&4&r&&kl(n),512&r&&wl(n,n.return);break;case 12:Gl(e,n);break;case 31:Gl(e,n),4&r&&zl(e,n);break;case 13:Gl(e,n),4&r&&Bl(e,n),64&r&&(null!==(e=n.memoizedState)&&(null!==(e=e.dehydrated)&&function(e,t){var n=e.ownerDocument;if("$~"===e.data)e._reactRetry=t;else if("$?"!==e.data||"loading"!==n.readyState)t();else{var r=function(){t(),n.removeEventListener("DOMContentLoaded",r)};n.addEventListener("DOMContentLoaded",r),e._reactRetry=r}}(e,n=Au.bind(null,n))));break;case 22:if(!(r=null!==n.memoizedState||Nl)){t=null!==t&&null!==t.memoizedState||Ol,i=Nl;var a=Ol;Nl=r,(Ol=t)&&!a?Kl(e,n,!!(8772&n.subtreeFlags)):Gl(e,n),Nl=i,Ol=a}break;case 30:break;default:Gl(e,n)}}function Il(e){var t=e.alternate;null!==t&&(e.alternate=null,Il(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&Ye(t)),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}var Dl=null,Fl=!1;function Ml(e,t,n){for(n=n.child;null!==n;)ql(e,t,n),n=n.sibling}function ql(e,t,n){if(ye&&"function"==typeof ye.onCommitFiberUnmount)try{ye.onCommitFiberUnmount(be,n)}catch(a){}switch(n.tag){case 26:Ol||Sl(n,t),Ml(e,t,n),n.memoizedState?n.memoizedState.count--:n.stateNode&&(n=n.stateNode).parentNode.removeChild(n);break;case 27:Ol||Sl(n,t);var r=Dl,i=Fl;Td(n.type)&&(Dl=n.stateNode,Fl=!1),Ml(e,t,n),Md(n.stateNode),Dl=r,Fl=i;break;case 5:Ol||Sl(n,t);case 6:if(r=Dl,i=Fl,Dl=null,Ml(e,t,n),Fl=i,null!==(Dl=r))if(Fl)try{(9===Dl.nodeType?Dl.body:"HTML"===Dl.nodeName?Dl.ownerDocument.body:Dl).removeChild(n.stateNode)}catch(o){xu(n,t,o)}else try{Dl.removeChild(n.stateNode)}catch(o){xu(n,t,o)}break;case 18:null!==Dl&&(Fl?(Ad(9===(e=Dl).nodeType?e.body:"HTML"===e.nodeName?e.ownerDocument.body:e,n.stateNode),Hp(e)):Ad(Dl,n.stateNode));break;case 4:r=Dl,i=Fl,Dl=n.stateNode.containerInfo,Fl=!0,Ml(e,t,n),Dl=r,Fl=i;break;case 0:case 11:case 14:case 15:bl(2,n,t),Ol||bl(4,n,t),Ml(e,t,n);break;case 1:Ol||(Sl(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount&&vl(n,t,r)),Ml(e,t,n);break;case 21:Ml(e,t,n);break;case 22:Ol=(r=Ol)||null!==n.memoizedState,Ml(e,t,n),Ol=r;break;default:Ml(e,t,n)}}function zl(e,t){if(null===t.memoizedState&&(null!==(e=t.alternate)&&null!==(e=e.memoizedState))){e=e.dehydrated;try{Hp(e)}catch(n){xu(t,t.return,n)}}}function Bl(e,t){if(null===t.memoizedState&&(null!==(e=t.alternate)&&(null!==(e=e.memoizedState)&&null!==(e=e.dehydrated))))try{Hp(e)}catch(n){xu(t,t.return,n)}}function $l(e,t){var n=function(e){switch(e.tag){case 31:case 13:case 19:var t=e.stateNode;return null===t&&(t=e.stateNode=new Pl),t;case 22:return null===(t=(e=e.stateNode)._retryCache)&&(t=e._retryCache=new Pl),t;default:throw Error(o(435,e.tag))}}(e);t.forEach(function(t){if(!n.has(t)){n.add(t);var r=Cu.bind(null,e,t);t.then(r,r)}})}function Ul(e,t){var n=t.deletions;if(null!==n)for(var r=0;r title"))),pd(a,r,n),a[Be]=e,et(a),r=a;break e;case"link":var s=np("link","href",i).get(r+(n.href||""));if(s)for(var l=0;ls)break;var u=l.transferSize,d=l.initiatorType;u&&fd(d)&&(o+=u*((l=l.responseEnd)ap?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}(d,g)))return zc=a,e.cancelPendingCommit=g(hu.bind(null,e,t,a,n,r,i,o,s,l,u,d,null,p,f)),void Xc(e,a,o,!c)}hu(e,t,a,n,r,i,o,s,l)}function Zc(e){for(var t=e;;){var n=t.tag;if((0===n||11===n||15===n)&&16384&t.flags&&(null!==(n=t.updateQueue)&&null!==(n=n.stores)))for(var r=0;rm&&(o=m,m=h,h=o);var b=tr(s,h),y=tr(s,m);if(b&&y&&(1!==f.rangeCount||f.anchorNode!==b.node||f.anchorOffset!==b.offset||f.focusNode!==y.node||f.focusOffset!==y.offset)){var v=d.createRange();v.setStart(b.node,b.offset),f.removeAllRanges(),h>m?(f.addRange(v),f.extend(y.node,y.offset)):(v.setEnd(y.node,y.offset),f.addRange(v))}}}}for(d=[],f=s;f=f.parentNode;)1===f.nodeType&&d.push({element:f,left:f.scrollLeft,top:f.scrollTop});for("function"==typeof s.focus&&s.focus(),s=0;sn?32:n,R.T=null,n=$c,$c=null;var a=Mc,s=zc;if(Fc=0,qc=Mc=null,zc=0,6&fc)throw Error(o(331));var l=fc;if(fc|=4,lc(a.current),ec(a,a.current,s,n),fc=l,Du(0,!1),ye&&"function"==typeof ye.onPostCommitFiberRoot)try{ye.onPostCommitFiberRoot(be,a)}catch(c){}return!0}finally{I.p=i,R.T=r,vu(e,t)}}function ku(e,t,n){t=Gr(n,t),null!==(e=va(e,t=Ns(e.stateNode,t,2),2))&&(Pe(e,2),Iu(e))}function xu(e,t,n){if(3===e.tag)ku(e,e,n);else for(;null!==t;){if(3===t.tag){ku(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Dc||!Dc.has(r))){e=Gr(n,e),null!==(r=va(t,n=Os(2),2))&&(Ls(n,r,t,e),Pe(r,2),Iu(r));break}}t=t.return}}function _u(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new pc;var i=new Set;r.set(t,i)}else void 0===(i=r.get(t))&&(i=new Set,r.set(t,i));i.has(n)||(Sc=!0,i.add(n),e=Eu.bind(null,e,t,n),t.then(e,e))}function Eu(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,gc===e&&(mc&n)===n&&(4===xc||3===xc&&(62914560&mc)===mc&&300>le()-Pc?!(2&fc)&&tu(e,0):Tc|=n,Cc===mc&&(Cc=0)),Iu(e)}function Tu(e,t){0===t&&(t=Oe()),null!==(e=jr(e,t))&&(Pe(e,t),Iu(e))}function Au(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Tu(e,n)}function Cu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;null!==i&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(o(314))}null!==r&&r.delete(t),Tu(e,n)}var Nu=null,Ou=null,Lu=!1,Pu=!1,ju=!1,Ru=0;function Iu(e){e!==Ou&&null===e.next&&(null===Ou?Nu=Ou=e:Ou=Ou.next=e),Pu=!0,Lu||(Lu=!0,_d(function(){6&fc?ie(ue,Fu):Mu()}))}function Du(e,t){if(!ju&&Pu){ju=!0;do{for(var n=!1,r=Nu;null!==r;){if(!t)if(0!==e){var i=r.pendingLanes;if(0===i)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-we(42|e)+1)-1,a=201326741&(a&=i&~(o&~s))?201326741&a|1:a?2|a:0}0!==a&&(n=!0,Bu(r,a))}else a=mc,!(3&(a=Ae(r,r===gc?a:0,null!==r.cancelPendingCommit||-1!==r.timeoutHandle)))||Ce(r,a)||(n=!0,Bu(r,a));r=r.next}}while(n);ju=!1}}function Fu(){Mu()}function Mu(){Pu=Lu=!1;var e=0;0!==Ru&&function(){var e=window.event;if(e&&"popstate"===e.type)return e!==wd&&(wd=e,!0);return wd=null,!1}()&&(e=Ru);for(var t=le(),n=null,r=Nu;null!==r;){var i=r.next,a=qu(r,t);0===a?(r.next=null,null===n?Nu=i:n.next=i,null===i&&(Ou=n)):(n=r,(0!==e||3&a)&&(Pu=!0)),r=i}0!==Fc&&5!==Fc||Du(e,!1),0!==Ru&&(Ru=0)}function qu(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=-62914561&e.pendingLanes;0 title"):null)}function ip(e){return!!("stylesheet"!==e.type||3&e.state.loading)}var ap=0;function op(){if(this.count--,0===this.count&&(0===this.imgCount||!this.waitingForImages))if(this.stylesheets)lp(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}var sp=null;function lp(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,sp=new Map,t.forEach(cp,e),sp=null,op.call(e))}function cp(e,t){if(!(4&t.state.loading)){var n=sp.get(e);if(n)var r=n.get(null);else{n=new Map,sp.set(e,n);for(var i=e.querySelectorAll("link[data-precedence],style[data-precedence]"),a=0;a{"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>I,__assign:()=>a,__asyncDelegator:()=>E,__asyncGenerator:()=>_,__asyncValues:()=>T,__await:()=>x,__awaiter:()=>g,__classPrivateFieldGet:()=>P,__classPrivateFieldIn:()=>R,__classPrivateFieldSet:()=>j,__createBinding:()=>m,__decorate:()=>s,__disposeResources:()=>F,__esDecorate:()=>c,__exportStar:()=>b,__extends:()=>i,__generator:()=>h,__importDefault:()=>L,__importStar:()=>O,__makeTemplateObject:()=>A,__metadata:()=>f,__param:()=>l,__propKey:()=>d,__read:()=>v,__rest:()=>o,__rewriteRelativeImportExtension:()=>M,__runInitializers:()=>u,__setFunctionName:()=>p,__spread:()=>w,__spreadArray:()=>k,__spreadArrays:()=>S,__values:()=>y,default:()=>q});var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)};function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n=0;s--)(i=e[s])&&(o=(a<3?i(o):a>3?i(t,n,o):i(t,n))||o);return a>3&&o&&Object.defineProperty(t,n,o),o}function l(e,t){return function(n,r){t(n,r,e)}}function c(e,t,n,r,i,a){function o(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var s,l=r.kind,c="getter"===l?"get":"setter"===l?"set":"value",u=!t&&e?r.static?e:e.prototype:null,d=t||(u?Object.getOwnPropertyDescriptor(u,r.name):{}),p=!1,f=n.length-1;f>=0;f--){var g={};for(var h in r)g[h]="access"===h?{}:r[h];for(var h in r.access)g.access[h]=r.access[h];g.addInitializer=function(e){if(p)throw new TypeError("Cannot add initializers after decoration has completed");a.push(o(e||null))};var m=(0,n[f])("accessor"===l?{get:d.get,set:d.set}:d[c],g);if("accessor"===l){if(void 0===m)continue;if(null===m||"object"!=typeof m)throw new TypeError("Object expected");(s=o(m.get))&&(d.get=s),(s=o(m.set))&&(d.set=s),(s=o(m.init))&&i.unshift(s)}else(s=o(m))&&("field"===l?i.unshift(s):d[c]=s)}u&&Object.defineProperty(u,r.name,d),p=!0}function u(e,t,n){for(var r=arguments.length>2,i=0;i0&&i[i.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,a=n.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(r=a.next()).done;)o.push(r.value)}catch(s){i={error:s}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(i)throw i.error}}return o}function w(){for(var e=[],t=0;t1||s(e,t)})},t&&(r[e]=t(r[e])))}function s(e,t){try{(n=i[e](t)).value instanceof x?Promise.resolve(n.value.v).then(l,c):u(a[0][2],n)}catch(r){u(a[0][3],r)}var n}function l(e){s("next",e)}function c(e){s("throw",e)}function u(e,t){e(t),a.shift(),a.length&&s(a[0][0],a[0][1])}}function E(e){var t,n;return t={},r("next"),r("throw",function(e){throw e}),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,i){t[r]=e[r]?function(t){return(n=!n)?{value:x(e[r](t)),done:!1}:i?i(t):t}:i}}function T(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=y(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise(function(r,i){(function(e,t,n,r){Promise.resolve(r).then(function(t){e({value:t,done:n})},t)})(r,i,(t=e[n](t)).done,t.value)})}}}function A(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var C=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},N=function(e){return N=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[t.length]=n);return t},N(e)};function O(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n=N(e),r=0;r{"use strict";function r(e,t=(e,t)=>e===t){return e.filter((n,r)=>e.findIndex(e=>t(e,n))!==r)}function i(e){return Array.from(new Set(e))}n.d(t,{XI:()=>r,sb:()=>i})},32131:(e,t,n)=>{"use strict";n.d(t,{o:()=>o});var r=n(44586),i=n(56347),a=n(70440);function o(){const{siteConfig:{baseUrl:e,trailingSlash:t},i18n:{localeConfigs:n}}=(0,r.A)(),{pathname:o}=(0,i.zy)(),s=(0,a.Ks)(o,{trailingSlash:t,baseUrl:e}).replace(e,"");return{createUrl:function({locale:e,fullyQualified:t}){const r=function(e){const t=n[e];if(!t)throw new Error(`Unexpected Docusaurus bug, no locale config found for locale=${e}`);return t}(e);return`${`${t?r.url:""}`}${r.baseUrl}${s}`}}}},33001:(e,t,n)=>{"use strict";n.r(t)},34164:(e,t,n)=>{"use strict";function r(e){var t,n,i="";if("string"==typeof e||"number"==typeof e)i+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;ti});const i=function(){for(var e,t,n=0,i="",a=arguments.length;n{var r=n(64634);e.exports=h,e.exports.parse=a,e.exports.compile=function(e,t){return c(a(e,t),t)},e.exports.tokensToFunction=c,e.exports.tokensToRegExp=g;var i=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,s=0,l="",c=t&&t.delimiter||"/";null!=(n=i.exec(e));){var u=n[0],p=n[1],f=n.index;if(l+=e.slice(s,f),s=f+u.length,p)l+=p[1];else{var g=e[s],h=n[2],m=n[3],b=n[4],y=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var S=null!=h&&null!=g&&g!==h,k="+"===v||"*"===v,x="?"===v||"*"===v,_=h||c,E=b||y,T=h||("string"==typeof r[r.length-1]?r[r.length-1]:"");r.push({name:m||a++,prefix:h||"",delimiter:_,optional:x,repeat:k,partial:S,asterisk:!!w,pattern:E?d(E):w?".*":o(_,T)})}}return s-1?"[^"+u(e)+"]+?":u(t)+"|(?:(?!"+u(t)+")[^"+u(e)+"])+?"}function s(e){return encodeURI(e).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function l(e){return encodeURI(e).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function c(e,t){for(var n=new Array(e.length),i=0;i{"use strict";n.d(t,{A:()=>p});n(96540);var r=n(53259),i=n.n(r),a=n(84054);const o={"00310d16":[()=>n.e(746).then(n.bind(n,80042)),"@site/docs/tools/rest-api.md",80042],"01605f1b":[()=>n.e(720).then(n.bind(n,8164)),"@site/docs/api-reference/sql-only-apis/jdbc.md",8164],"01966bdf":[()=>n.e(8201).then(n.bind(n,51502)),"@site/docs/configure-and-operate/index.mdx",51502],"01a4d6cc":[()=>n.e(505).then(n.bind(n,30917)),"@site/docs/api-reference/native-clients/cpp/sql-api.md",30917],"04b7cdab":[()=>n.e(8054).then(n.bind(n,48347)),"@site/versioned_docs/version-3.0.0/administrators-guide/storage/data-partitions.md",48347],"071c34d4":[()=>Promise.all([n.e(1869),n.e(2445)]).then(n.bind(n,94515)),"@site/docs/develop/ignite-clients/cpp.md",94515],"0b3cdf12":[()=>n.e(6064).then(n.bind(n,54119)),"@site/docs/api-reference/index.mdx",54119],"0c117f5c":[()=>n.e(3001).then(n.bind(n,27183)),"@site/docs/configure-and-operate/configuration/storage.md",27183],"0d1c3a24":[()=>n.e(7313).then(n.bind(n,47957)),"@site/versioned_docs/version-3.0.0/administrators-guide/system-groups-recovery.md",47957],"0dba3038":[()=>n.e(8424).then(n.bind(n,94068)),"@site/docs/configure-and-operate/configuration/authentication.md",94068],"0e52afe7":[()=>n.e(4026).then(n.bind(n,33124)),"@site/versioned_docs/version-3.0.0/administrators-guide/metrics/system-views.md",33124],"0ea0f99b":[()=>n.e(5423).then(n.bind(n,14315)),"@site/versioned_docs/version-3.0.0/administrators-guide/handling-exceptions.md",14315],"0eb0485d":[()=>n.e(2035).then(n.bind(n,4660)),"@site/docs/api-reference/sql-only-apis/odbc.md",4660],"0ed4f4b9":[()=>n.e(8723).then(n.bind(n,80376)),"@site/docs/configure-and-operate/configuration/cluster-and-nodes.md",80376],"0f12c4b6":[()=>Promise.all([n.e(1869),n.e(6717)]).then(n.bind(n,71001)),"@site/docs/develop/work-with-data/compute.md",71001],"10d5c8a2":[()=>n.e(9589).then(n.bind(n,20490)),"@site/docs/configure-and-operate/configuration/storage-rocksdb.md",20490],"138e0e15":[()=>n.e(4921).then(n.t.bind(n,41597,19)),"@generated/@easyops-cn/docusaurus-search-local/default/__plugin.json",41597],"148ac273":[()=>n.e(1824).then(n.bind(n,97674)),"@site/versioned_docs/version-3.0.0/sql-reference/operators-and-functions.md",97674],"14965a6a":[()=>n.e(960).then(n.bind(n,11590)),"@site/docs/develop/work-with-data/events.md",11590],"14ca7f3e":[()=>n.e(19).then(n.bind(n,59482)),"@site/docs/sql/fundamentals/index.mdx",59482],"15d99295":[()=>n.e(8983).then(n.bind(n,29179)),"@site/docs/getting-started/index.mdx",29179],"16d50cfe":[()=>n.e(6927).then(n.bind(n,32058)),"@site/docs/develop/integrate/index.mdx",32058],17896441:[()=>Promise.all([n.e(1869),n.e(5595),n.e(8401)]).then(n.bind(n,82386)),"@theme/DocItem",82386],"18c7933a":[()=>n.e(6626).then(n.bind(n,79121)),"@site/docs/understand/architecture/index.mdx",79121],"19ff637c":[()=>n.e(4182).then(n.bind(n,11774)),"@site/versioned_docs/version-3.0.0/quick-start/java-api.md",11774],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,81035)),"@theme/SearchPage",81035],"1aa4865b":[()=>n.e(3821).then(n.bind(n,64598)),"@site/versioned_docs/version-3.0.0/administrators-guide/metrics/configuring-metrics.md",64598],"1b5d77aa":[()=>n.e(673).then(n.bind(n,14766)),"@site/docs/configure-and-operate/operations/disaster-recovery.md",14766],"1bfb13ba":[()=>n.e(8653).then(n.bind(n,85774)),"@site/docs/understand/architecture/storage-engines/rocksdb.md",85774],"1c440c53":[()=>n.e(9496).then(n.bind(n,3536)),"@site/docs/develop/work-with-data/index.mdx",3536],"1c5cff81":[()=>n.e(6946).then(n.bind(n,45599)),"@site/docs/configure-and-operate/installation/kubernetes.md",45599],"1d166f75":[()=>Promise.all([n.e(1869),n.e(965)]).then(n.bind(n,93213)),"@site/docs/sql/advanced/explain-statement.mdx",93213],"1df93b7f":[()=>n.e(4583).then(n.bind(n,36866)),"@site/src/pages/index.tsx",36866],"1f9d746e":[()=>n.e(7543).then(n.bind(n,49486)),"@site/versioned_docs/version-3.0.0/sql-reference/keywords.md",49486],"1ffcbc41":[()=>n.e(4007).then(n.bind(n,59152)),"@site/docs/sql/reference/sql-conformance/keywords.md",59152],"20e3d2e5":[()=>n.e(7889).then(n.bind(n,61335)),"@site/docs/sql/reference/sql-conformance/overview.md",61335],"24058a50":[()=>n.e(2446).then(n.bind(n,58638)),"@site/docs/tools/glossary.md",58638],"24239f0f":[()=>Promise.all([n.e(1869),n.e(7419)]).then(n.bind(n,77433)),"@site/docs/sql/reference/language-definition/transactions.mdx",77433],"24d94e02":[()=>n.e(1079).then(n.bind(n,21264)),"@site/versioned_docs/version-3.0.0/administrators-guide/security/ssl-tls.md",21264],"254bafb3":[()=>n.e(1926).then(n.bind(n,38169)),"@site/versioned_docs/version-3.0.0/sql-reference/operational-commands.md",38169],25653805:[()=>n.e(295).then(n.bind(n,63827)),"@site/versioned_docs/version-3.0.0/developers-guide/clients/jdbc-driver.md",63827],"25efb993":[()=>n.e(2846).then(n.bind(n,4671)),"@site/docs/api-reference/native-clients/dotnet/ado-net-api.md",4671],"264dac2b":[()=>n.e(6387).then(n.bind(n,60973)),"@site/versioned_docs/version-3.0.0/administrators-guide/config/storage/persistent.md",60973],29562505:[()=>n.e(9759).then(n.bind(n,13523)),"@site/docs/getting-started/migrate-from-3-0-to-3-1.md",13523],"29e18771":[()=>n.e(4889).then(n.bind(n,81961)),"@site/docs/develop/connect-to-ignite/odbc.md",81961],"2abe8a17":[()=>Promise.all([n.e(1869),n.e(1590)]).then(n.bind(n,72526)),"@site/versioned_docs/version-3.0.0/developers-guide/table-api.md",72526],"2b2b4e7a":[()=>Promise.all([n.e(1869),n.e(6334)]).then(n.bind(n,11014)),"@site/docs/develop/work-with-data/transactions.md",11014],"2c69403e":[()=>Promise.all([n.e(1869),n.e(3309)]).then(n.bind(n,82776)),"@site/docs/develop/work-with-data/streaming.md",82776],"2dd8807d":[()=>n.e(148).then(n.bind(n,55143)),"@site/versioned_docs/version-3.0.0/index.md",55143],"2e3ac162":[()=>n.e(3280).then(n.bind(n,67572)),"@site/docs/understand/performance/using-explain.md",67572],"2e4f0f2d":[()=>n.e(5606).then(n.bind(n,58754)),"@site/docs/understand/architecture/architecture-overview.md",58754],"2e631686":[()=>Promise.all([n.e(1869),n.e(4766)]).then(n.bind(n,59464)),"@site/versioned_docs/version-3.0.0/developers-guide/data-streamer.md",59464],"2e7ecfd5":[()=>n.e(8622).then(n.bind(n,55890)),"@site/versioned_docs/version-3.0.0/developers-guide/events/events-list.md",55890],"2f89ca13":[()=>n.e(666).then(n.bind(n,45237)),"@site/docs/develop/integrate/spring-boot.md",45237],"31dfd8c3":[()=>n.e(9655).then(n.bind(n,25231)),"@site/docs/api-reference/sql-only-apis/python.md",25231],"31fb6dea":[()=>n.e(7687).then(n.bind(n,78301)),"@site/docs/configure-and-operate/configuration/cluster-security.md",78301],"3293c63f":[()=>Promise.all([n.e(1869),n.e(404)]).then(n.bind(n,12661)),"@site/docs/sql/working-with-sql/execute-queries.md",12661],"32c93f0c":[()=>Promise.all([n.e(1869),n.e(2276)]).then(n.bind(n,49389)),"@site/docs/develop/work-with-data/table-api.md",49389],"375301b3":[()=>n.e(8865).then(n.bind(n,64548)),"@site/docs/understand/core-concepts/index.mdx",64548],"38c4fee5":[()=>n.e(4738).then(n.bind(n,88844)),"@site/docs/configure-and-operate/configuration/storage-volatile.md",88844],"390e6ec8":[()=>Promise.all([n.e(1869),n.e(9568)]).then(n.bind(n,28146)),"@site/docs/sql/reference/language-definition/dml.mdx",28146],39417523:[()=>Promise.all([n.e(1869),n.e(9239)]).then(n.bind(n,92347)),"@site/docs/configure-and-operate/installation/zip.md",92347],"3cf17eef":[()=>n.e(6567).then(n.bind(n,62598)),"@site/docs/sql/reference/data-types-and-functions/index.mdx",62598],"3f98ac4d":[()=>n.e(6647).then(n.bind(n,7705)),"@site/docs/api-reference/native-clients/dotnet/transactions-api.md",7705],"407a0507":[()=>Promise.all([n.e(1869),n.e(1785)]).then(n.bind(n,16493)),"@site/versioned_docs/version-3.0.0/developers-guide/sql/odbc/connection-string.md",16493],"42222ea0":[()=>n.e(2881).then(n.bind(n,78587)),"@site/docs/develop/work-with-data/events-list.md",78587],"42f764c6":[()=>n.e(3346).then(n.bind(n,21441)),"@site/docs/understand/performance/index.mdx",21441],"430edd65":[()=>n.e(1326).then(n.bind(n,9054)),"@site/versioned_docs/version-3.0.0/quick-start/start-cluster.md",9054],"4436c0ec":[()=>n.e(9901).then(n.bind(n,22312)),"@site/docs/configure-and-operate/reference/cluster-configuration.md",22312],"4643c4f2":[()=>Promise.all([n.e(1869),n.e(8767)]).then(n.bind(n,18386)),"@site/docs/develop/connect-to-ignite/odbc-querying-data.md",18386],"46a2bd78":[()=>n.e(6459).then(n.bind(n,84710)),"@site/docs/configure-and-operate/configuration/storage-persistent.md",84710],"46d70a83":[()=>n.e(3124).then(n.bind(n,21023)),"@site/docs/tools/index.mdx",21023],"485437b7":[()=>n.e(975).then(n.bind(n,749)),"@site/versioned_docs/version-3.0.0/sql-reference/data-types.md",749],"4c300737":[()=>n.e(5460).then(n.bind(n,78213)),"@site/versioned_docs/version-3.0.0/administrators-guide/config/cli-config.md",78213],"4edc808e":[()=>n.e(308).then(n.bind(n,16215)),"@site/docs/index.mdx",16215],"4f4c954e":[()=>n.e(2329).then(n.bind(n,96840)),"@site/versioned_docs/version-3.0.0/administrators-guide/disaster-recovery.md",96840],"4fffa35c":[()=>n.e(1929).then(n.bind(n,79782)),"@site/versioned_docs/version-3.0.0/quick-start/explore-sql.md",79782],"5152a8e0":[()=>n.e(2252).then(n.bind(n,4180)),"@site/versioned_docs/version-3.0.0/sql-reference/explain-operators-list.md",4180],"51b5f6a1":[()=>Promise.all([n.e(1869),n.e(9196)]).then(n.bind(n,17197)),"@site/docs/getting-started/work-with-sql.md",17197],"52ea876c":[()=>n.e(6922).then(n.bind(n,38947)),"@site/versioned_docs/version-3.0.0/developers-guide/sql/odbc/specification.md",38947],"54b9d659":[()=>n.e(4595).then(n.bind(n,2445)),"@site/versioned_docs/version-3.0.0/developers-guide/java-to-tables.md",2445],"555c49dc":[()=>Promise.all([n.e(1869),n.e(6391)]).then(n.bind(n,88045)),"@site/docs/sql/reference/language-definition/distribution-zones.mdx",88045],"55bb5782":[()=>n.e(6147).then(n.bind(n,96514)),"@site/docs/sql/reference/sql-conformance/index.mdx",96514],"56216d1a":[()=>n.e(3433).then(n.bind(n,88769)),"@site/docs/api-reference/native-clients/dotnet/compute-api.md",88769],56998700:[()=>n.e(4695).then(n.bind(n,85994)),"@site/versioned_docs/version-3.0.0/glossary/glossary.md",85994],"5745cf5f":[()=>n.e(2808).then(n.bind(n,75374)),"@site/docs/configure-and-operate/monitoring/index.mdx",75374],"588bd741":[()=>Promise.all([n.e(1869),n.e(4324)]).then(n.bind(n,23014)),"@site/docs/getting-started/quick-start.md",23014],59074688:[()=>n.e(3092).then(n.bind(n,11358)),"@site/versioned_docs/version-3.0.0/developers-guide/rest/rest-api.md",11358],"5ba93427":[()=>n.e(6324).then(n.bind(n,20949)),"@site/versioned_docs/version-3.0.0/administrators-guide/config/node-config.md",20949],"5bd6484a":[()=>n.e(6129).then(n.bind(n,82367)),"@site/versioned_docs/version-3.0.0/developers-guide/sql/calcite-based-sql-engine.md",82367],"5c36b491":[()=>n.e(5348).then(n.bind(n,38973)),"@site/docs/understand/index.mdx",38973],"5ced4073":[()=>n.e(8362).then(n.bind(n,53973)),"@site/docs/api-reference/api/cpp-api.md",53973],"5d2daac0":[()=>Promise.all([n.e(1869),n.e(4641)]).then(n.bind(n,80839)),"@site/docs/sql/reference/data-types-and-functions/operational-commands.mdx",80839],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"60b12218":[()=>n.e(2569).then(n.bind(n,62863)),"@site/docs/sql/reference/index.mdx",62863],"6105dffd":[()=>n.e(7901).then(n.bind(n,66261)),"@site/versioned_docs/version-3.0.0/administrators-guide/storage/engines/rocksdb.md",66261],"61eaa059":[()=>n.e(4091).then(n.bind(n,36804)),"@site/versioned_docs/version-3.0.0/sql-reference/grammar-reference.md",36804],"630993fc":[()=>n.e(398).then(n.bind(n,43125)),"@site/docs/understand/architecture/storage-architecture.md",43125],"6449194f":[()=>n.e(6824).then(n.bind(n,51068)),"@site/docs/sql/working-with-sql/index.mdx",51068],"6453b56c":[()=>n.e(6891).then(n.bind(n,99491)),"@site/versioned_docs/version-3.0.0/developers-guide/clients/python.md",99491],"654e3e67":[()=>n.e(3144).then(n.bind(n,78827)),"@site/docs/develop/integrate/spring-data.md",78827],"6686d628":[()=>n.e(2233).then(n.bind(n,92188)),"@site/docs/configure-and-operate/configuration/metrics.md",92188],"66b63dfc":[()=>n.e(5083).then(n.bind(n,29292)),"@site/docs/getting-started/best-practices.md",29292],"66cd9110":[()=>n.e(8275).then(n.bind(n,45100)),"@site/docs/configure-and-operate/monitoring/metrics-system-views.md",45100],68533010:[()=>n.e(5291).then(n.bind(n,46346)),"@site/docs/api-reference/sql-only-apis/index.mdx",46346],"6861f3ae":[()=>n.e(3425).then(n.bind(n,96161)),"@site/docs/sql/reference/data-types-and-functions/operators-and-functions.md",96161],"689fd026":[()=>n.e(1804).then(n.bind(n,43605)),"@site/docs/configure-and-operate/installation/docker.md",43605],"696e0280":[()=>n.e(3173).then(n.bind(n,65677)),"@site/docs/getting-started/start-cluster.md",65677],"69bfbf1a":[()=>n.e(8610).then(n.bind(n,50688)),"@site/docs/sql/reference/data-types-and-functions/data-types.md",50688],"69dbdcb6":[()=>n.e(581).then(n.bind(n,3916)),"@site/docs/develop/work-with-data/java-to-tables.md",3916],"6b5309c4":[()=>n.e(8772).then(n.bind(n,59747)),"@site/docs/api-reference/native-clients/java/security-api.md",59747],"6b7ab3e3":[()=>n.e(6346).then(n.bind(n,85104)),"@site/docs/develop/connect-to-ignite/index.mdx",85104],"6cc25ccb":[()=>n.e(3614).then(n.bind(n,29508)),"@site/docs/develop/index.mdx",29508],"6ce9454c":[()=>Promise.all([n.e(1869),n.e(8134)]).then(n.bind(n,29939)),"@site/versioned_docs/version-3.0.0/developers-guide/compute/compute.md",29939],"6d14130f":[()=>n.e(748).then(n.bind(n,91464)),"@site/versioned_docs/version-3.0.0/administrators-guide/colocation.md",91464],"6d99e875":[()=>n.e(2108).then(n.bind(n,90738)),"@site/docs/api-reference/native-clients/java/network-api.md",90738],"6dd34219":[()=>n.e(7366).then(n.bind(n,88242)),"@site/docs/configure-and-operate/configuration/index.mdx",88242],"6dfec84f":[()=>n.e(2561).then(n.bind(n,20836)),"@site/docs/getting-started/intro.md",20836],"6e1e49fb":[()=>n.e(131).then(n.bind(n,10167)),"@site/versioned_docs/version-3.0.0/installation/installing-using-docker.md",10167],"6ff241e2":[()=>n.e(4383).then(n.bind(n,19891)),"@site/docs/api-reference/api/java-api.md",19891],70598898:[()=>n.e(7076).then(n.bind(n,38964)),"@site/docs/api-reference/native-clients/cpp/network-api.md",38964],"712f9ec4":[()=>n.e(5472).then(n.bind(n,95401)),"@site/docs/sql/working-with-sql/system-views.md",95401],"714f451d":[()=>n.e(8075).then(n.bind(n,16396)),"@site/docs/configure-and-operate/monitoring/metrics.md",16396],"73aef688":[()=>n.e(6855).then(n.bind(n,14688)),"@site/versioned_docs/version-3.0.0/administrators-guide/metrics/metrics-list.md",14688],"76682ea2":[()=>Promise.all([n.e(1869),n.e(3908)]).then(n.bind(n,60697)),"@site/versioned_docs/version-3.0.0/installation/installing-using-zip.md",60697],"77a23d4b":[()=>n.e(167).then(n.bind(n,86516)),"@site/docs/api-reference/native-clients/dotnet/data-streamer-api.md",86516],"796ebb42":[()=>n.e(2758).then(n.bind(n,91583)),"@site/docs/configure-and-operate/operations/lifecycle.md",91583],"7a0d0e36":[()=>n.e(5405).then(n.bind(n,44370)),"@site/versioned_docs/version-3.0.0/general-tips.md",44370],"7a459efc":[()=>Promise.all([n.e(1869),n.e(4005)]).then(n.bind(n,89233)),"@site/versioned_docs/version-3.0.0/developers-guide/compute/serialization.md",89233],"7bd5cb78":[()=>n.e(9399).then(n.bind(n,35130)),"@site/docs/configure-and-operate/configuration/storage-overview.md",35130],"7ea0a1cf":[()=>n.e(9).then(n.bind(n,98129)),"@site/versioned_docs/version-3.0.0/installation/installing-to-k8s.md",98129],"7faacd1a":[()=>n.e(2265).then(n.bind(n,27647)),"@site/versioned_docs/version-3.0.0/administrators-guide/storage/engines/aimem.md",27647],"83719db0":[()=>n.e(213).then(n.bind(n,6430)),"@site/versioned_docs/version-3.0.0/sql-tuning/using-explain.md",6430],"840d3d48":[()=>n.e(8178).then(n.bind(n,63264)),"@site/docs/getting-started/key-value-api.md",63264],"8452ee8f":[()=>n.e(8494).then(n.bind(n,59602)),"@site/docs/api-reference/native-clients/java/index.mdx",59602],"86aa3622":[()=>n.e(8392).then(n.bind(n,40104)),"@site/versioned_docs/version-3.0.0/administrators-guide/config/cluster-config.md",40104],"86fea04b":[()=>n.e(3187).then(n.bind(n,97246)),"@site/docs/configure-and-operate/monitoring/configuring-metrics.md",97246],"8826f367":[()=>Promise.all([n.e(1869),n.e(6755)]).then(n.bind(n,49017)),"@site/docs/develop/connect-to-ignite/odbc-connection-string.md",49017],"88642a14":[()=>n.e(325).then(n.bind(n,20995)),"@site/docs/api-reference/native-clients/java/data-streamer-api.md",20995],"8d621382":[()=>Promise.all([n.e(1869),n.e(3517)]).then(n.bind(n,47709)),"@site/versioned_docs/version-3.0.0/developers-guide/clients/cpp.md",47709],"8e496006":[()=>n.e(1175).then(n.bind(n,88127)),"@site/docs/understand/core-concepts/transactions-and-mvcc.md",88127],"8f4c7ad5":[()=>n.e(7607).then(n.bind(n,1049)),"@site/versioned_docs/version-3.0.0/administrators-guide/config/index.md",1049],"8f944727":[()=>n.e(3164).then(n.bind(n,5119)),"@site/docs/configure-and-operate/configuration/ssl-tls.md",5119],"8f9fabaf":[()=>n.e(5448).then(n.bind(n,68524)),"@site/versioned_docs/version-3.0.0/developers-guide/sql/system-views.md",68524],"90a0f442":[()=>n.e(9459).then(n.bind(n,14667)),"@site/docs/configure-and-operate/reference/cli-configuration.md",14667],"9185a77c":[()=>n.e(6210).then(n.bind(n,26215)),"@site/docs/api-reference/native-clients/java/tables-api.md",26215],91920555:[()=>n.e(5859).then(n.bind(n,59296)),"@site/docs/develop/connect-to-ignite/jdbc.md",59296],"936721b0":[()=>n.e(179).then(n.bind(n,77222)),"@site/docs/understand/core-concepts/tables-and-schemas.md",77222],"948ed64f":[()=>Promise.all([n.e(1869),n.e(4821)]).then(n.bind(n,80767)),"@site/docs/develop/work-with-data/serialization.md",80767],"967c1bfd":[()=>n.e(2355).then(n.bind(n,98415)),"@site/docs/api-reference/native-clients/cpp/compute-api.md",98415],"994e0b8f":[()=>n.e(1232).then(n.bind(n,96729)),"@site/docs/understand/architecture/storage-engines/aipersist.md",96729],"9a925e23":[()=>Promise.all([n.e(1869),n.e(2527)]).then(n.bind(n,26)),"@site/versioned_docs/version-3.0.0/quick-start/getting-started-guide.md",26],"9ac7fe78":[()=>n.e(5373).then(n.bind(n,99979)),"@site/docs/configure-and-operate/operations/handle-exceptions.md",99979],"9af10537":[()=>n.e(4581).then(n.bind(n,82413)),"@site/versioned_docs/version-3.0.0/developers-guide/clients/ado.md",82413],"9bbb96d9":[()=>n.e(4518).then(n.bind(n,24293)),"@site/docs/configure-and-operate/reference/storage-profiles.md",24293],a06ae79b:[()=>n.e(3126).then(n.bind(n,67546)),"@site/versioned_docs/version-3.0.0/administrators-guide/cluster-security.md",67546],a150ce1d:[()=>n.e(2645).then(n.bind(n,1302)),"@site/docs/develop/ignite-clients/index.mdx",1302],a1b4f2ab:[()=>n.e(4414).then(n.bind(n,34854)),"@site/docs/api-reference/native-clients/cpp/index.mdx",34854],a3771ee6:[()=>n.e(6874).then(n.bind(n,40741)),"@site/docs/api-reference/api/dotnet-api.md",40741],a4bdb400:[()=>n.e(2272).then(n.bind(n,40582)),"@site/docs/api-reference/native-clients/java/criteria-api.md",40582],a6ff32af:[()=>Promise.all([n.e(1869),n.e(6728)]).then(n.bind(n,49634)),"@site/docs/configure-and-operate/installation/deb-rpm.md",49634],a734c28f:[()=>n.e(1411).then(n.bind(n,88960)),"@site/docs/api-reference/native-clients/java/sql-api.md",88960],a7456010:[()=>n.e(1235).then(n.t.bind(n,88552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",88552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,74532)),"@theme/DocVersionRoot",74532],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,78115)),"@theme/DocRoot",78115],aa014cab:[()=>Promise.all([n.e(1869),n.e(9042)]).then(n.bind(n,97099)),"@site/docs/develop/ignite-clients/dotnet.md",97099],aab940e4:[()=>Promise.all([n.e(1869),n.e(9189)]).then(n.bind(n,62973)),"@site/versioned_docs/version-3.0.0/developers-guide/clients/dotnet.md",62973],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,27093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",27093],ac3be0c3:[()=>n.e(4393).then(n.bind(n,66624)),"@site/versioned_docs/version-3.0.0/administrators-guide/lifecycle.md",66624],ad0d46b8:[()=>n.e(9768).then(n.bind(n,22338)),"@site/docs/configure-and-operate/reference/index.mdx",22338],aea2f960:[()=>n.e(9289).then(n.t.bind(n,91433,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-ignite-3-3-1-0-398.json",91433],b01f8e23:[()=>n.e(7360).then(n.bind(n,47186)),"@site/docs/api-reference/native-clients/dotnet/index.mdx",47186],b0221735:[()=>n.e(5262).then(n.bind(n,1993)),"@site/docs/configure-and-operate/operations/disaster-recovery-system-groups.md",1993],b1ab1304:[()=>n.e(1965).then(n.bind(n,14402)),"@site/docs/develop/connect-to-ignite/python.md",14402],b1ef1c36:[()=>n.e(5190).then(n.bind(n,34559)),"@site/versioned_docs/version-3.0.0/quick-start/embedded-mode.md",34559],b7991eff:[()=>n.e(8918).then(n.t.bind(n,58767,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-ignite-3-3-0-0-d32.json",58767],b89de411:[()=>n.e(6695).then(n.bind(n,75172)),"@site/docs/understand/architecture/security.md",75172],b9041da1:[()=>n.e(6861).then(n.bind(n,99603)),"@site/versioned_docs/version-3.0.0/sql-reference/explain-statement.md",99603],b96d81e3:[()=>n.e(6007).then(n.bind(n,68807)),"@site/versioned_docs/version-3.0.0/administrators-guide/security/authentication.md",68807],b99fd215:[()=>n.e(7505).then(n.bind(n,57080)),"@site/docs/api-reference/native-clients/cpp/tables-api.md",57080],bb56423f:[()=>n.e(8695).then(n.bind(n,66122)),"@site/docs/configure-and-operate/installation/index.mdx",66122],bc873ee7:[()=>n.e(9305).then(n.bind(n,38048)),"@site/docs/understand/performance/explain-operators.md",38048],bcb7ad38:[()=>n.e(1665).then(n.bind(n,11627)),"@site/docs/configure-and-operate/operations/index.mdx",11627],be3682b6:[()=>n.e(6193).then(n.bind(n,75454)),"@site/versioned_docs/version-3.0.0/administrators-guide/storage/index.md",75454],bf32d4f4:[()=>n.e(5194).then(n.bind(n,14154)),"@site/docs/configure-and-operate/monitoring/available-metrics.md",14154],bfca4c52:[()=>n.e(5853).then(n.bind(n,84906)),"@site/versioned_docs/version-3.0.0/developers-guide/code-deployment/code-deployment.md",84906],c0475018:[()=>n.e(1029).then(n.bind(n,7267)),"@site/versioned_docs/version-3.0.0/sql-reference/dml.md",7267],c196937a:[()=>n.e(8498).then(n.bind(n,13269)),"@site/versioned_docs/version-3.0.0/developers-guide/events/index.md",13269],c2c5a8d2:[()=>n.e(2521).then(n.bind(n,39715)),"@site/versioned_docs/version-3.0.0/administrators-guide/storage/engines/aipersist.md",39715],c4101606:[()=>n.e(270).then(n.bind(n,26366)),"@site/versioned_docs/version-3.0.0/administrators-guide/config/storage/volatile.md",26366],c564e63a:[()=>n.e(6667).then(n.bind(n,60816)),"@site/docs/api-reference/native-clients/dotnet/sql-api.md",60816],c5beb181:[()=>n.e(6534).then(n.bind(n,5089)),"@site/versioned_docs/version-3.0.0/administrators-guide/storage/engines/index.md",5089],c6f94207:[()=>n.e(4430).then(n.bind(n,20863)),"@site/docs/sql/reference/language-definition/index.mdx",20863],c851e8ef:[()=>Promise.all([n.e(1869),n.e(5318)]).then(n.bind(n,89160)),"@site/docs/sql/reference/language-definition/ddl.mdx",89160],c96ce734:[()=>Promise.all([n.e(1869),n.e(7363)]).then(n.bind(n,43205)),"@site/versioned_docs/version-3.0.0/developers-guide/clients/linq.md",43205],c9838793:[()=>n.e(8943).then(n.bind(n,94323)),"@site/versioned_docs/version-3.0.0/sql-reference/ddl.md",94323],c98fd205:[()=>n.e(5558).then(n.bind(n,64672)),"@site/docs/api-reference/api/index.mdx",64672],cb32231c:[()=>n.e(4734).then(n.bind(n,88839)),"@site/versioned_docs/version-3.0.0/quick-start/persist-data.md",88839],cb5d1ef8:[()=>n.e(6987).then(n.bind(n,85791)),"@site/docs/configure-and-operate/reference/node-configuration.md",85791],cbbcdc53:[()=>n.e(9242).then(n.bind(n,88816)),"@site/docs/understand/architecture/storage-engines/aimem.md",88816],cd6ed4c4:[()=>n.e(1516).then(n.bind(n,5116)),"@site/docs/api-reference/native-clients/cpp/client-api.md",5116],cf4f3c50:[()=>n.e(607).then(n.bind(n,61398)),"@site/docs/api-reference/native-clients/dotnet/client-api.md",61398],cfa06b25:[()=>n.e(7164).then(n.bind(n,16173)),"@site/docs/api-reference/native-clients/java/client-api.md",16173],cfc81aaa:[()=>n.e(8345).then(n.bind(n,22462)),"@site/docs/getting-started/embedded-mode.md",22462],d02d3d43:[()=>n.e(7639).then(n.bind(n,16655)),"@site/docs/understand/architecture/storage-engines/index.mdx",16655],d2778e29:[()=>n.e(6537).then(n.bind(n,40379)),"@site/docs/sql/advanced/index.mdx",40379],d5d3293e:[()=>n.e(9298).then(n.bind(n,16711)),"@site/docs/understand/core-concepts/distribution-and-colocation.md",16711],d7a33538:[()=>Promise.all([n.e(1869),n.e(9665)]).then(n.bind(n,97983)),"@site/docs/api-reference/native-clients/dotnet/linq-api.md",97983],d902eba8:[()=>Promise.all([n.e(1869),n.e(1986)]).then(n.bind(n,20558)),"@site/versioned_docs/version-3.0.0/installation/deb-rpm.md",20558],d95c5914:[()=>n.e(3039).then(n.bind(n,68393)),"@site/versioned_docs/version-3.0.0/sql-tuning/sql-tuning.md",68393],da66ee89:[()=>n.e(7577).then(n.bind(n,5369)),"@site/docs/api-reference/native-clients/java/server-api.md",5369],dad9a2fd:[()=>n.e(3928).then(n.bind(n,22626)),"@site/docs/api-reference/native-clients/index.mdx",22626],dcbc23ab:[()=>n.e(797).then(n.bind(n,58922)),"@site/docs/api-reference/native-clients/dotnet/network-api.md",58922],dd1a5b79:[()=>n.e(1752).then(n.bind(n,88346)),"@site/versioned_docs/version-3.0.0/administrators-guide/storage/storage-profiles.md",88346],dd4c3c7d:[()=>n.e(2919).then(n.bind(n,90330)),"@site/docs/develop/work-with-data/java-client-logging.md",90330],ddb6bda5:[()=>Promise.all([n.e(1869),n.e(7511)]).then(n.bind(n,30547)),"@site/docs/sql/reference/language-definition/grammar-reference.mdx",30547],df80b230:[()=>n.e(1188).then(n.bind(n,22674)),"@site/versioned_docs/version-3.0.0/developers-guide/sql/jdbc-driver.md",22674],e0d8b5f8:[()=>n.e(2209).then(n.bind(n,2896)),"@site/versioned_docs/version-3.0.0/developers-guide/clients/java.md",2896],e288cdcf:[()=>n.e(5024).then(n.bind(n,10976)),"@site/versioned_docs/version-3.0.0/sql-reference/transactions.md",10976],e30f13ec:[()=>n.e(2313).then(n.bind(n,40879)),"@site/docs/sql/advanced/performance-tuning.md",40879],e4ab0479:[()=>n.e(1605).then(n.bind(n,58266)),"@site/docs/getting-started/migrate-from-ignite-2.md",58266],e6238dca:[()=>n.e(4443).then(n.bind(n,11015)),"@site/docs/understand/core-concepts/data-partitioning.md",11015],e6e12c77:[()=>n.e(9883).then(n.bind(n,46513)),"@site/docs/api-reference/native-clients/java/transactions-api.md",46513],e910cb7c:[()=>n.e(8351).then(n.bind(n,62660)),"@site/docs/configure-and-operate/operations/colocation.md",62660],ea9d2f00:[()=>n.e(4690).then(n.bind(n,41453)),"@site/docs/api-reference/native-clients/java/compute-api.md",41453],eb76c95c:[()=>Promise.all([n.e(1869),n.e(1597)]).then(n.bind(n,67089)),"@site/versioned_docs/version-3.0.0/developers-guide/sql/sql-api.md",67089],ede2c0d3:[()=>n.e(6527).then(n.bind(n,98366)),"@site/versioned_docs/version-3.0.0/developers-guide/clients/index.md",98366],ee0a6a95:[()=>Promise.all([n.e(1869),n.e(5641)]).then(n.bind(n,91922)),"@site/docs/develop/ignite-clients/java.md",91922],ee8364d1:[()=>n.e(3149).then(n.bind(n,45659)),"@site/versioned_docs/version-3.0.0/developers-guide/sql/odbc/odbc-driver.md",45659],eff8d8a9:[()=>n.e(186).then(n.bind(n,35955)),"@site/versioned_docs/version-3.0.0/administrators-guide/config/storage/rocksdb.md",35955],f043e5a8:[()=>n.e(1019).then(n.bind(n,68150)),"@site/docs/tools/cli-commands.md",68150],f0a4d6aa:[()=>n.e(202).then(n.bind(n,9441)),"@site/docs/sql/fundamentals/engine-architecture.md",9441],f2461985:[()=>n.e(2418).then(n.bind(n,4679)),"@site/docs/understand/core-concepts/compute-and-events.md",4679],f522cffe:[()=>Promise.all([n.e(1869),n.e(180)]).then(n.bind(n,33496)),"@site/versioned_docs/version-3.0.0/developers-guide/sql/odbc/querying-modifying-data.md",33496],f6ab33a6:[()=>n.e(3837).then(n.bind(n,26768)),"@site/docs/sql/index.mdx",26768],f7a2bd99:[()=>n.e(67).then(n.bind(n,55498)),"@site/docs/api-reference/native-clients/java/catalog-api.md",55498],f838f9b1:[()=>Promise.all([n.e(1869),n.e(8688)]).then(n.bind(n,78456)),"@site/versioned_docs/version-3.0.0/ignite-cli-tool.md",78456],f99b384c:[()=>n.e(5687).then(n.bind(n,10577)),"@site/versioned_docs/version-3.0.0/sql-reference/distribution-zones.md",10577],f9e4bc23:[()=>n.e(543).then(n.bind(n,83890)),"@site/docs/api-reference/native-clients/dotnet/tables-api.md",83890],f9e65627:[()=>n.e(8125).then(n.bind(n,12559)),"@site/docs/develop/work-with-data/code-deployment.md",12559],fb00ac63:[()=>n.e(3574).then(n.bind(n,89735)),"@site/versioned_docs/version-3.0.0/installation/migration-from-ai2/index.md",89735],fcc8bf93:[()=>n.e(675).then(n.bind(n,57337)),"@site/docs/api-reference/native-clients/cpp/transactions-api.md",57337],fd10d9c3:[()=>n.e(545).then(n.bind(n,51647)),"@site/docs/configure-and-operate/operations/disaster-recovery-partitions.md",51647],fddde30a:[()=>n.e(3500).then(n.bind(n,11773)),"@site/versioned_docs/version-3.0.0/sql-reference/sql-conformance.md",11773],fe1d83c2:[()=>Promise.all([n.e(1869),n.e(9435)]).then(n.bind(n,18041)),"@site/versioned_docs/version-3.0.0/developers-guide/transactions.md",18041],ffa03752:[()=>n.e(6299).then(n.bind(n,36304)),"@site/docs/understand/core-concepts/what-is-ignite.md",36304]};var s=n(74848);function l({error:e,retry:t,pastDelay:n}){return e?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(e)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:t,children:"Retry"})})]}):n?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(86921),u=n(53102);function d(e,t){if("*"===e)return i()({loading:l,loader:()=>n.e(2237).then(n.bind(n,82237)),modules:["@theme/NotFound"],webpack:()=>[82237],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],g=(0,c.A)(r);return Object.entries(g).forEach(([e,t])=>{const n=o[t];n&&(d[e]=n[0],p.push(n[1]),f.push(n[2]))}),i().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const i=JSON.parse(JSON.stringify(r));Object.entries(t).forEach(([t,n])=>{const r=n.default;if(!r)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof r&&"function"!=typeof r||Object.keys(n).filter(e=>"default"!==e).forEach(e=>{r[e]=n[e]});let a=i;const o=t.split(".");o.slice(0,-1).forEach(e=>{a=a[e]}),a[o[o.length-1]]=r});const a=i.__comp;delete i.__comp;const o=i.__context;delete i.__context;const l=i.__props;return delete i.__props,(0,s.jsx)(u.W,{value:o,children:(0,s.jsx)(a,{...i,...l,...n})})}})}const p=[{path:"/docs/ignite3/search",component:d("/docs/ignite3/search","085"),exact:!0},{path:"/docs/ignite3/",component:d("/docs/ignite3/","4c4"),exact:!0},{path:"/docs/ignite3/",component:d("/docs/ignite3/","0c3"),routes:[{path:"/docs/ignite3/3.0.0",component:d("/docs/ignite3/3.0.0","e86"),routes:[{path:"/docs/ignite3/3.0.0",component:d("/docs/ignite3/3.0.0","f69"),routes:[{path:"/docs/ignite3/3.0.0",component:d("/docs/ignite3/3.0.0","91c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/cluster-security",component:d("/docs/ignite3/3.0.0/administrators-guide/cluster-security","60d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/colocation",component:d("/docs/ignite3/3.0.0/administrators-guide/colocation","de9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/config",component:d("/docs/ignite3/3.0.0/administrators-guide/config","6f7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/config/cli-config",component:d("/docs/ignite3/3.0.0/administrators-guide/config/cli-config","cb2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config",component:d("/docs/ignite3/3.0.0/administrators-guide/config/cluster-config","a8f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/config/node-config",component:d("/docs/ignite3/3.0.0/administrators-guide/config/node-config","cbe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent",component:d("/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent","23e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb",component:d("/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb","471"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile",component:d("/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile","c9e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery",component:d("/docs/ignite3/3.0.0/administrators-guide/disaster-recovery","180"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/handling-exceptions",component:d("/docs/ignite3/3.0.0/administrators-guide/handling-exceptions","d34"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/lifecycle",component:d("/docs/ignite3/3.0.0/administrators-guide/lifecycle","28c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics",component:d("/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics","db5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list",component:d("/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list","2cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views",component:d("/docs/ignite3/3.0.0/administrators-guide/metrics/system-views","0bd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/security/authentication",component:d("/docs/ignite3/3.0.0/administrators-guide/security/authentication","8b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls",component:d("/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls","afc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/storage",component:d("/docs/ignite3/3.0.0/administrators-guide/storage","87d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions",component:d("/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions","625"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/storage/engines",component:d("/docs/ignite3/3.0.0/administrators-guide/storage/engines","e5f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem",component:d("/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem","e3b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist",component:d("/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist","8df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb",component:d("/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb","f6f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/storage/storage-profiles",component:d("/docs/ignite3/3.0.0/administrators-guide/storage/storage-profiles","9e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery",component:d("/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery","785"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/clients",component:d("/docs/ignite3/3.0.0/developers-guide/clients","5dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/clients/ado",component:d("/docs/ignite3/3.0.0/developers-guide/clients/ado","4dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/clients/cpp",component:d("/docs/ignite3/3.0.0/developers-guide/clients/cpp","19c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/clients/dotnet",component:d("/docs/ignite3/3.0.0/developers-guide/clients/dotnet","bd2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/clients/java",component:d("/docs/ignite3/3.0.0/developers-guide/clients/java","754"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver",component:d("/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver","cb4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/clients/linq",component:d("/docs/ignite3/3.0.0/developers-guide/clients/linq","b29"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/clients/python",component:d("/docs/ignite3/3.0.0/developers-guide/clients/python","126"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/code-deployment",component:d("/docs/ignite3/3.0.0/developers-guide/code-deployment","ab9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/compute",component:d("/docs/ignite3/3.0.0/developers-guide/compute","cf9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/compute/serialization",component:d("/docs/ignite3/3.0.0/developers-guide/compute/serialization","e6b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/data-streamer",component:d("/docs/ignite3/3.0.0/developers-guide/data-streamer","781"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/events",component:d("/docs/ignite3/3.0.0/developers-guide/events","187"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/events/events-list",component:d("/docs/ignite3/3.0.0/developers-guide/events/events-list","3fa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/java-to-tables",component:d("/docs/ignite3/3.0.0/developers-guide/java-to-tables","8b1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/rest/rest-api",component:d("/docs/ignite3/3.0.0/developers-guide/rest/rest-api","d5e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine",component:d("/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine","99d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver",component:d("/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver","213"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string",component:d("/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string","7ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver",component:d("/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver","b6f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data",component:d("/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data","bf7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification",component:d("/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification","89b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/sql/sql-api",component:d("/docs/ignite3/3.0.0/developers-guide/sql/sql-api","132"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/sql/system-views",component:d("/docs/ignite3/3.0.0/developers-guide/sql/system-views","39a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/table-api",component:d("/docs/ignite3/3.0.0/developers-guide/table-api","d31"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/developers-guide/transactions",component:d("/docs/ignite3/3.0.0/developers-guide/transactions","000"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/general-tips",component:d("/docs/ignite3/3.0.0/general-tips","72e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/glossary",component:d("/docs/ignite3/3.0.0/glossary","ef9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/ignite-cli-tool",component:d("/docs/ignite3/3.0.0/ignite-cli-tool","9b1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/installation/deb-rpm",component:d("/docs/ignite3/3.0.0/installation/deb-rpm","4f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/installation/installing-to-k8s",component:d("/docs/ignite3/3.0.0/installation/installing-to-k8s","14e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/installation/installing-using-docker",component:d("/docs/ignite3/3.0.0/installation/installing-using-docker","28a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/installation/installing-using-zip",component:d("/docs/ignite3/3.0.0/installation/installing-using-zip","cbb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/installation/migration-from-ai2",component:d("/docs/ignite3/3.0.0/installation/migration-from-ai2","0af"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/quick-start/embedded-mode",component:d("/docs/ignite3/3.0.0/quick-start/embedded-mode","954"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/quick-start/explore-sql",component:d("/docs/ignite3/3.0.0/quick-start/explore-sql","e9e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/quick-start/getting-started-guide",component:d("/docs/ignite3/3.0.0/quick-start/getting-started-guide","567"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/quick-start/java-api",component:d("/docs/ignite3/3.0.0/quick-start/java-api","2e7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/quick-start/persist-data",component:d("/docs/ignite3/3.0.0/quick-start/persist-data","b35"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/quick-start/start-cluster",component:d("/docs/ignite3/3.0.0/quick-start/start-cluster","776"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/data-types",component:d("/docs/ignite3/3.0.0/sql-reference/data-types","1e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/ddl",component:d("/docs/ignite3/3.0.0/sql-reference/ddl","a35"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/distribution-zones",component:d("/docs/ignite3/3.0.0/sql-reference/distribution-zones","1ba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/dml",component:d("/docs/ignite3/3.0.0/sql-reference/dml","f9c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/explain-operators-list",component:d("/docs/ignite3/3.0.0/sql-reference/explain-operators-list","91c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/explain-statement",component:d("/docs/ignite3/3.0.0/sql-reference/explain-statement","6a5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/grammar-reference",component:d("/docs/ignite3/3.0.0/sql-reference/grammar-reference","3bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/keywords",component:d("/docs/ignite3/3.0.0/sql-reference/keywords","abe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/operational-commands",component:d("/docs/ignite3/3.0.0/sql-reference/operational-commands","e80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/operators-and-functions",component:d("/docs/ignite3/3.0.0/sql-reference/operators-and-functions","594"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/sql-conformance",component:d("/docs/ignite3/3.0.0/sql-reference/sql-conformance","4d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-reference/transactions",component:d("/docs/ignite3/3.0.0/sql-reference/transactions","dca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-tuning",component:d("/docs/ignite3/3.0.0/sql-tuning","c82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.0.0/sql-tuning/using-explain",component:d("/docs/ignite3/3.0.0/sql-tuning/using-explain","887"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/ignite3/3.1.0",component:d("/docs/ignite3/3.1.0","252"),routes:[{path:"/docs/ignite3/3.1.0",component:d("/docs/ignite3/3.1.0","e4d"),routes:[{path:"/docs/ignite3/3.1.0",component:d("/docs/ignite3/3.1.0","aef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference",component:d("/docs/ignite3/3.1.0/api-reference","5a3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/api",component:d("/docs/ignite3/3.1.0/api-reference/api","e34"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference",component:d("/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference","043"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference",component:d("/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference","4d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/api/java-api-reference",component:d("/docs/ignite3/3.1.0/api-reference/api/java-api-reference","e58"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients",component:d("/docs/ignite3/3.1.0/api-reference/native-clients","5c4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/cpp",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/cpp","b35"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api","73f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api","458"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api","141"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api","65d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api","aec"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api","6f6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet","69b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api","3a3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api","a0a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api","96c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api","d0c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api","e07"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api","5e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api","86c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api","f11"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api","ce6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java","baa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api","6b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api","b09"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api","1fb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api","0d6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api","b06"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api","693"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api","249"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api","d42"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api","c86"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api","f3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api",component:d("/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api","e3b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/sql-only-apis",component:d("/docs/ignite3/3.1.0/api-reference/sql-only-apis","b52"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc",component:d("/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc","4af"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc",component:d("/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc","384"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/api-reference/sql-only-apis/python",component:d("/docs/ignite3/3.1.0/api-reference/sql-only-apis/python","523"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate",component:d("/docs/ignite3/3.1.0/configure-and-operate","374"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration","bf2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication","1ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes","3c4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security","fef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls","071"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage","078"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-overview",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-overview","3e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent","e70"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb","be0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-volatile",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-volatile","fc0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration",component:d("/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration","69e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/installation",component:d("/docs/ignite3/3.1.0/configure-and-operate/installation","693"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/installation/install-deb-rpm",component:d("/docs/ignite3/3.1.0/configure-and-operate/installation/install-deb-rpm","a06"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker",component:d("/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker","070"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes",component:d("/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes","0e3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip",component:d("/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip","f46"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/monitoring",component:d("/docs/ignite3/3.1.0/configure-and-operate/monitoring","5e8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics",component:d("/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics","375"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/monitoring/config-metrics",component:d("/docs/ignite3/3.1.0/configure-and-operate/monitoring/config-metrics","707"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics",component:d("/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics","8ba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views",component:d("/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views","3af"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/operations",component:d("/docs/ignite3/3.1.0/configure-and-operate/operations","4a7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/operations/colocation",component:d("/docs/ignite3/3.1.0/configure-and-operate/operations/colocation","18c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery",component:d("/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery","821"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-partitions",component:d("/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-partitions","c4b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-system-groups",component:d("/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-system-groups","94a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/operations/handle-exceptions",component:d("/docs/ignite3/3.1.0/configure-and-operate/operations/handle-exceptions","bd9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle",component:d("/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle","f06"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/reference",component:d("/docs/ignite3/3.1.0/configure-and-operate/reference","7c9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration",component:d("/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration","afd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration",component:d("/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration","3f2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration",component:d("/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration","7b6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles",component:d("/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles","7d6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop",component:d("/docs/ignite3/3.1.0/develop","8ea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/connect-to-ignite",component:d("/docs/ignite3/3.1.0/develop/connect-to-ignite","95f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc",component:d("/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc","341"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc",component:d("/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc","7da"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string",component:d("/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string","ac8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data",component:d("/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data","fe6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/connect-to-ignite/python",component:d("/docs/ignite3/3.1.0/develop/connect-to-ignite/python","950"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/ignite-clients",component:d("/docs/ignite3/3.1.0/develop/ignite-clients","1e3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client",component:d("/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client","0cd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client",component:d("/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client","368"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/ignite-clients/java-client",component:d("/docs/ignite3/3.1.0/develop/ignite-clients/java-client","14b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/integrate",component:d("/docs/ignite3/3.1.0/develop/integrate","1e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/integrate/spring-boot",component:d("/docs/ignite3/3.1.0/develop/integrate/spring-boot","1a5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/integrate/spring-data",component:d("/docs/ignite3/3.1.0/develop/integrate/spring-data","57b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data",component:d("/docs/ignite3/3.1.0/develop/work-with-data","258"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/code-deployment",component:d("/docs/ignite3/3.1.0/develop/work-with-data/code-deployment","e63"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/compute",component:d("/docs/ignite3/3.1.0/develop/work-with-data/compute","a92"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/events",component:d("/docs/ignite3/3.1.0/develop/work-with-data/events","ee0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/events-list",component:d("/docs/ignite3/3.1.0/develop/work-with-data/events-list","490"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging",component:d("/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging","1e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables",component:d("/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables","7f6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/serialization",component:d("/docs/ignite3/3.1.0/develop/work-with-data/serialization","5cd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/streaming",component:d("/docs/ignite3/3.1.0/develop/work-with-data/streaming","9f7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/table-api",component:d("/docs/ignite3/3.1.0/develop/work-with-data/table-api","d22"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/develop/work-with-data/transactions",component:d("/docs/ignite3/3.1.0/develop/work-with-data/transactions","eb1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started",component:d("/docs/ignite3/3.1.0/getting-started","aa1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started/best-practices",component:d("/docs/ignite3/3.1.0/getting-started/best-practices","8a2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started/embedded-mode",component:d("/docs/ignite3/3.1.0/getting-started/embedded-mode","6f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started/intro",component:d("/docs/ignite3/3.1.0/getting-started/intro","4bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started/key-value-api",component:d("/docs/ignite3/3.1.0/getting-started/key-value-api","f4c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1",component:d("/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1","f75"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2",component:d("/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2","bb5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started/quick-start",component:d("/docs/ignite3/3.1.0/getting-started/quick-start","989"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started/start-cluster",component:d("/docs/ignite3/3.1.0/getting-started/start-cluster","a25"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/getting-started/work-with-sql",component:d("/docs/ignite3/3.1.0/getting-started/work-with-sql","e6b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql",component:d("/docs/ignite3/3.1.0/sql","137"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/advanced",component:d("/docs/ignite3/3.1.0/sql/advanced","bb9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/advanced/explain-statement",component:d("/docs/ignite3/3.1.0/sql/advanced/explain-statement","3a9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/advanced/performance-tuning",component:d("/docs/ignite3/3.1.0/sql/advanced/performance-tuning","adc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/fundamentals",component:d("/docs/ignite3/3.1.0/sql/fundamentals","0f7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture",component:d("/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture","81f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference",component:d("/docs/ignite3/3.1.0/sql/reference","f6c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions",component:d("/docs/ignite3/3.1.0/sql/reference/data-types-and-functions","846"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types",component:d("/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types","926"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands",component:d("/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands","b81"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions",component:d("/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions","b08"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/language-definition",component:d("/docs/ignite3/3.1.0/sql/reference/language-definition","c80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/language-definition/ddl",component:d("/docs/ignite3/3.1.0/sql/reference/language-definition/ddl","b26"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones",component:d("/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones","9ef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/language-definition/dml",component:d("/docs/ignite3/3.1.0/sql/reference/language-definition/dml","fa7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference",component:d("/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference","6bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/language-definition/transactions",component:d("/docs/ignite3/3.1.0/sql/reference/language-definition/transactions","ee6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/sql-conformance",component:d("/docs/ignite3/3.1.0/sql/reference/sql-conformance","014"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords",component:d("/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords","719"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview",component:d("/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview","fb0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/working-with-sql",component:d("/docs/ignite3/3.1.0/sql/working-with-sql","a7f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries",component:d("/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries","b52"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/sql/working-with-sql/system-views",component:d("/docs/ignite3/3.1.0/sql/working-with-sql/system-views","161"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/tools",component:d("/docs/ignite3/3.1.0/tools","0ab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/tools/cli-commands",component:d("/docs/ignite3/3.1.0/tools/cli-commands","c40"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/tools/glossary",component:d("/docs/ignite3/3.1.0/tools/glossary","637"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/tools/rest-api",component:d("/docs/ignite3/3.1.0/tools/rest-api","a25"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand",component:d("/docs/ignite3/3.1.0/understand","b21"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/architecture",component:d("/docs/ignite3/3.1.0/understand/architecture","0dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/architecture/architecture-overview",component:d("/docs/ignite3/3.1.0/understand/architecture/architecture-overview","a58"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/architecture/security",component:d("/docs/ignite3/3.1.0/understand/architecture/security","413"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/architecture/storage-architecture",component:d("/docs/ignite3/3.1.0/understand/architecture/storage-architecture","4d8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/architecture/storage-engines",component:d("/docs/ignite3/3.1.0/understand/architecture/storage-engines","3a0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem",component:d("/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem","c3c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist",component:d("/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist","46f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb",component:d("/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb","669"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/core-concepts",component:d("/docs/ignite3/3.1.0/understand/core-concepts","599"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events",component:d("/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events","4c8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning",component:d("/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning","730"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation",component:d("/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation","ad0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas",component:d("/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas","487"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc",component:d("/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc","8ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite",component:d("/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite","710"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/performance",component:d("/docs/ignite3/3.1.0/understand/performance","c1c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/performance/explain-operators",component:d("/docs/ignite3/3.1.0/understand/performance/explain-operators","44d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/ignite3/3.1.0/understand/performance/using-explain",component:d("/docs/ignite3/3.1.0/understand/performance/using-explain","f69"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"*",component:d("*")}]},36803:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(96540),i=n(53102);function a(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},38193:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,i={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},40961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(6221)},41422:(e,t,n)=>{"use strict";n.d(t,{N:()=>h,u:()=>l});var r=n(96540),i=n(205),a=n(53109),o=n(74848);const s="ease-in-out";function l({initialState:e}){const[t,n]=(0,r.useState)(e??!1),i=(0,r.useCallback)(()=>{n(e=>!e)},[]);return{collapsed:t,setCollapsed:n,toggleCollapsed:i}}const c={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?c:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p({collapsibleRef:e,collapsed:t,animation:n}){const i=(0,r.useRef)(!1);(0,r.useEffect)(()=>{const r=e.current;function o(){const e=r.scrollHeight,t=n?.duration??function(e){if((0,a.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(e);return{transition:`height ${t}ms ${n?.easing??s}`,height:`${e}px`}}function l(){const e=o();r.style.transition=e.transition,r.style.height=e.height}if(!i.current)return d(r,t),void(i.current=!0);return r.style.willChange="height",function(){const e=requestAnimationFrame(()=>{t?(l(),requestAnimationFrame(()=>{r.style.height=c.height,r.style.overflow=c.overflow})):(r.style.display="block",requestAnimationFrame(()=>{l()}))});return()=>cancelAnimationFrame(e)}()},[e,t,n])}function f({as:e="div",collapsed:t,children:n,animation:i,onCollapseTransitionEnd:a,className:s}){const l=(0,r.useRef)(null);return p({collapsibleRef:l,collapsed:t,animation:i}),(0,o.jsx)(e,{ref:l,onTransitionEnd:e=>{"height"===e.propertyName&&(d(l.current,t),a?.(t))},className:s,children:n})}function g({collapsed:e,...t}){const[n,a]=(0,r.useState)(!e),[s,l]=(0,r.useState)(e);return(0,i.A)(()=>{e||a(!0)},[e]),(0,i.A)(()=>{n&&l(e)},[n,e]),n?(0,o.jsx)(f,{...t,collapsed:s}):null}function h({lazy:e,...t}){const n=e?g:f;return(0,o.jsx)(n,{...t})}},41463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(96540);var r=n(5260),i=n(74848);function a({locale:e,version:t,tag:n}){const a=e;return(0,i.jsxs)(r.A,{children:[e&&(0,i.jsx)("meta",{name:"docusaurus_locale",content:e}),t&&(0,i.jsx)("meta",{name:"docusaurus_version",content:t}),n&&(0,i.jsx)("meta",{name:"docusaurus_tag",content:n}),a&&(0,i.jsx)("meta",{name:"docsearch:language",content:a}),t&&(0,i.jsx)("meta",{name:"docsearch:version",content:t}),n&&(0,i.jsx)("meta",{name:"docsearch:docusaurus_tag",content:n})]})}},42566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},42720:(e,t,n)=>{var r={"./prism-bash":57022,"./prism-cpp":72415,"./prism-csharp":5651,"./prism-java":96976,"./prism-json":72514,"./prism-python":52342,"./prism-sql":96966,"./prism-yaml":60083};function i(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}i.keys=function(){return Object.keys(r)},i.resolve=a,e.exports=i,i.id=42720},42892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function i(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>i})},43186:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});n(96540);var r=n(21312);const i={iconExternalLink:"iconExternalLink_nPIU"};var a=n(74848);const o="#theme-svg-external-link";function s({width:e=13.5,height:t=13.5}){return(0,a.jsx)("svg",{width:e,height:t,"aria-label":(0,r.T)({id:"theme.IconExternalLink.ariaLabel",message:"(opens in new tab)",description:"The ARIA label for the external link icon"}),className:i.iconExternalLink,children:(0,a.jsx)("use",{href:o})})}},43385:(e,t,n)=>{"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{const{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{p:()=>r})},43810:(e,t,n)=>{"use strict";n.d(t,{C:()=>l});var r=n(53103),i=n(86841);const a=/\w+|\p{Unified_Ideograph}/u;function o(e){const t=[];let n=0,r=e;for(;r.length>0;){const i=r.match(a);if(!i){t.push(r);break}i.index>0&&t.push(r.substring(0,i.index)),t.push(i[0]),n+=i.index+i[0].length,r=e.substring(n)}return t}var s=n(11088);function l(e,t,n,a=s.rG){const{chunkIndex:l,chunks:c}=function(e,t,n){const a=[];let s=0,l=0,c=-1;for(;sl){const t=o(e.substring(l,u)).map(e=>({html:(0,r.Z)(e),textLength:e.length}));for(const e of t)a.push(e)}-1===c&&(c=a.length),l=u+d,a.push({html:(0,i.Z)(e.substring(u,l),n,!0),textLength:d})}}if(l({html:(0,r.Z)(e),textLength:e.length}));for(const e of t)a.push(e)}return{chunkIndex:c,chunks:a}}(e,t,n),u=c.slice(0,l),d=c[l],p=[d.html],f=c.slice(l+1);let g=d.textLength,h=0,m=0,b=!1,y=!1;for(;g0){const e=u.pop();g+e.textLength<=a?(p.unshift(e.html),h+=e.textLength,g+=e.textLength):(b=!0,u.length=0)}else{if(!(f.length>0))break;{const e=f.shift();g+e.textLength<=a?(p.push(e.html),m+=e.textLength,g+=e.textLength):(y=!0,f.length=0)}}return(b||u.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},44070:(e,t,n)=>{"use strict";n.d(t,{d1:()=>u.d1,zK:()=>w,vT:()=>m,gk:()=>b,Gy:()=>g,$S:()=>u.$S,HW:()=>S,vF:()=>p.v,ht:()=>h,g1:()=>d.g1,r7:()=>v,jh:()=>y});var r=n(56347),i=n(44586),a=n(17065);function o(e,t={}){const n=function(){const{globalData:e}=(0,i.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find(e=>e.isLast);function l(e,t){return[...e.versions].sort((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0).find(e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1}))}function c(e,t){const n=l(e,t),i=n?.docs.find(e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1}));return{activeVersion:n,activeDoc:i,alternateDocVersions:i?function(t){const n={};return e.versions.forEach(e=>{e.docs.forEach(r=>{r.id===t&&(n[e.name]=r)})}),n}(i.id):{}}}var u=n(26972),d=n(53886),p=n(82565);const f={},g=()=>o("docusaurus-plugin-content-docs")??f,h=e=>{try{return function(e,t=a.W,n={}){const r=o(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function m(e={}){const t=g(),{pathname:n}=(0,r.zy)();return function(e,t,n={}){const i=Object.entries(e).sort((e,t)=>t[1].path.localeCompare(e[1].path)).find(([,e])=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})),a=i?{pluginId:i[0],pluginData:i[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map(e=>e.path).join(", ")}`);return a}(t,n,e)}function b(e={}){const t=m(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function y(e){return h(e).versions}function v(e){const t=h(e);return s(t)}function w(e){const t=h(e),{pathname:n}=(0,r.zy)();return c(t,n)}function S(e){const t=h(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},44363:(e,t,n)=>{"use strict";e.exports=n(22799)},44586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(96540),i=n(26988);function a(){return(0,r.useContext)(i.o)}},45500:(e,t,n)=>{"use strict";n.d(t,{Jx:()=>b,be:()=>g,e3:()=>m});var r=n(96540),i=n(34164),a=n(5260),o=n(36803),s=n(86025),l=n(14563),c=n(74848);function u({title:e}){const t=(0,l.s$)().format(e);return(0,c.jsxs)(a.A,{children:[(0,c.jsx)("title",{children:t}),(0,c.jsx)("meta",{property:"og:title",content:t})]})}function d({description:e}){return(0,c.jsxs)(a.A,{children:[(0,c.jsx)("meta",{name:"description",content:e}),(0,c.jsx)("meta",{property:"og:description",content:e})]})}function p({image:e}){const{withBaseUrl:t}=(0,s.hH)(),n=t(e,{absolute:!0});return(0,c.jsxs)(a.A,{children:[(0,c.jsx)("meta",{property:"og:image",content:n}),(0,c.jsx)("meta",{name:"twitter:image",content:n})]})}function f({keywords:e}){return(0,c.jsx)(a.A,{children:(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(e)?e.join(","):e})})}function g({title:e,description:t,keywords:n,image:r,children:i}){return(0,c.jsxs)(c.Fragment,{children:[e&&(0,c.jsx)(u,{title:e}),t&&(0,c.jsx)(d,{description:t}),n&&(0,c.jsx)(f,{keywords:n}),r&&(0,c.jsx)(p,{image:r}),i&&(0,c.jsx)(a.A,{children:i})]})}const h=r.createContext(void 0);function m({className:e,children:t}){const n=r.useContext(h),o=(0,i.A)(n,e);return(0,c.jsxs)(h.Provider,{value:o,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:o})}),t]})}function b({children:e}){const t=(0,o.A)(),n=`plugin-${t.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const r=`plugin-id-${t.plugin.id}`;return(0,c.jsx)(m,{className:(0,i.A)(n,r),children:e})}},51043:(e,t,n)=>{"use strict";n.r(t)},51107:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(96540);var r=n(34164),i=n(21312),a=n(73535),o=n(28774),s=n(63427),l=n(74848);function c({as:e,id:t,...n}){const c=(0,s.A)(),u=(0,a.v)(t);if("h1"===e||!t)return(0,l.jsx)(e,{...n,id:void 0});c.collectAnchor(t);const d=(0,i.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof n.children?n.children:t});return(0,l.jsxs)(e,{...n,className:(0,r.A)("anchor",u,n.className),id:t,children:[n.children,(0,l.jsx)(o.A,{className:"hash-link",to:`#${t}`,"aria-label":d,title:d,translate:"no",children:"\u200b"})]})}},52342:()=>{Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},53102:(e,t,n)=>{"use strict";n.d(t,{W:()=>o,o:()=>a});var r=n(96540),i=n(74848);const a=r.createContext(null);function o({children:e,value:t}){const n=r.useContext(a),o=(0,r.useMemo)(()=>function({parent:e,value:t}){if(!e){if(!t)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in t))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return t}const n={...e.data,...t?.data};return{plugin:e.plugin,data:n}}({parent:n,value:t}),[n,t]);return(0,i.jsx)(a.Provider,{value:o,children:e})}},53103:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{Z:()=>r})},53109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},53259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function i(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(){return o=Object.assign||function(e){for(var t=1;t{"use strict";n.d(t,{VQ:()=>m,XK:()=>v,g1:()=>y});var r=n(96540),i=n(44070),a=n(17065),o=n(6342),s=n(70679),l=n(89532),c=n(74848);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.Wf)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map(e=>[e,{preferredVersionName:null}]));const f=r.createContext(null);function g(){const e=(0,i.Gy)(),t=(0,o.p)().docs.versionPersistence,n=(0,r.useMemo)(()=>Object.keys(e),[e]),[a,s]=(0,r.useState)(()=>p(n));(0,r.useEffect)(()=>{s(function({pluginIds:e,versionPersistence:t,allDocsData:n}){function r(e){const r=d.read(e,t);return n[e].versions.some(e=>e.name===r)?{preferredVersionName:r}:(d.clear(e,t),{preferredVersionName:null})}return Object.fromEntries(e.map(e=>[e,r(e)]))}({allDocsData:e,versionPersistence:t,pluginIds:n}))},[e,t,n]);return[a,(0,r.useMemo)(()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s(t=>({...t,[e]:{preferredVersionName:n}}))}}),[t])]}function h({children:e}){const t=g();return(0,c.jsx)(f.Provider,{value:t,children:e})}function m({children:e}){return(0,c.jsx)(h,{children:e})}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function y(e=a.W){const t=(0,i.ht)(e),[n,o]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find(e=>e.name===s)??null,savePreferredVersionName:(0,r.useCallback)(t=>{o.savePreferredVersion(e,t)},[o,e])}}function v(){const e=(0,i.Gy)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:i}=t[n];return r.versions.find(e=>e.name===i)??null}const r=Object.keys(e);return Object.fromEntries(r.map(e=>[e,n(e)]))}},54625:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>b,k2:()=>w});var r=n(56347),i=n(42892),a=n(96540),o=n(79231),s=n(58168),l=n(98587),c=n(11561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),i=0;i{"use strict";n.d(t,{B6:()=>N,Ix:()=>v,W6:()=>M,XZ:()=>y,dO:()=>D,qh:()=>O,rd:()=>E,zy:()=>q});var r=n(42892),i=n(96540),a=n(5556),o=n.n(a),s=n(79231),l=n(11561),c=n(58168),u=n(35302),d=n.n(u),p=(n(44363),n(98587)),f=(n(4146),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var h=i.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,i=arguments.length,a=new Array(i),o=0;o{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var i=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,o=0;o{"use strict";n.d(t,{$Z:()=>o,Hl:()=>s,aZ:()=>l,jy:()=>c});var r=n(96540),i=n(56347),a=n(89532);function o(e){!function(e){const t=(0,i.W6)(),n=(0,a._q)(e);(0,r.useEffect)(()=>t.block((e,t)=>n(e,t)),[t,n])}((t,n)=>{if("POP"===n)return e(t,n)})}function s(e){const t=(0,i.W6)();return(0,r.useSyncExternalStore)(t.listen,()=>e(t),()=>e({...t,location:{...t.location,search:"",hash:"",state:void 0}}))}function l(e){return s(t=>null===e?null:new URLSearchParams(t.location.search).get(e))}function c(e,t){const n=function(e,t){const n=new URLSearchParams;for(const r of e)for(const[e,i]of r.entries())"append"===t?n.append(e,i):n.set(e,i);return n}(e.map(e=>new URLSearchParams(e??"")),t),r=n.toString();return r?`?${r}`:r}},58168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;tr})},58291:(e,t,n)=>{var r,i;!function(){var a,o,s,l,c,u,d,p,f,g,h,m,b,y,v,w,S,k,x,_,E,T,A,C,N,O,L,P,j,R,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=I.utils.clone(t)||{};l.position=[o,s],l.index=i.length,i.push(new I.Token(n.slice(o,a),l))}o=a+1}}return i},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach(function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)}),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ae&&(n=i),a!=e);)r=n-t,i=t+Math.floor(r/2),a=this.elements[2*i];return a==e||a>e?2*i:as?c+=2:o==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,o=i.str.charAt(0);o in i.node.edges?a=i.node.edges[o]:(a=new I.TokenSet,i.node.edges[o]=a),1==i.str.length&&(a.final=!0),r.push({node:a,editsRemaining:i.editsRemaining,str:i.str.slice(1)})}if(0!=i.editsRemaining){if("*"in i.node.edges)var s=i.node.edges["*"];else{s=new I.TokenSet;i.node.edges["*"]=s}if(0==i.str.length&&(s.final=!0),r.push({node:s,editsRemaining:i.editsRemaining-1,str:i.str}),i.str.length>1&&r.push({node:i.node,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)}),1==i.str.length&&(i.node.final=!0),i.str.length>=1){if("*"in i.node.edges)var l=i.node.edges["*"];else{l=new I.TokenSet;i.node.edges["*"]=l}1==i.str.length&&(l.final=!0),r.push({node:l,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)})}if(i.str.length>1){var c,u=i.str.charAt(0),d=i.str.charAt(1);d in i.node.edges?c=i.node.edges[d]:(c=new I.TokenSet,i.node.edges[d]=c),1==i.str.length&&(c.final=!0),r.push({node:c,editsRemaining:i.editsRemaining-1,str:u+i.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,i=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query(function(t){new I.QueryParser(e,t).parse()})},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),i=Object.create(null),a=Object.create(null),o=Object.create(null),s=0;s1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var i=0;i=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var i=e.peekLexeme();if(null==i){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(i.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+i.type+"'";throw new I.QueryParseError(r,i.start,i.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var i=e.peekLexeme();if(null!=i)switch(i.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+i.type+"'";throw new I.QueryParseError(r,i.start,i.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var i=e.peekLexeme();if(null!=i)switch(i.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+i.type+"'";throw new I.QueryParseError(r,i.start,i.end)}else e.nextClause()}},void 0===(i="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=i)}()},60083:()=>{!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",i=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function o(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return r}).replace(/<>/g,function(){return e});return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return r})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return r}).replace(/<>/g,function(){return"(?:"+i+"|"+a+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:o(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:o(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:o(a),lookbehind:!0,greedy:!0},number:{pattern:o(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},60609:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(96540),i=n(89532),a=n(74848);const o=Symbol("EmptyContext"),s=r.createContext(o);function l({children:e,name:t,items:n}){const i=(0,r.useMemo)(()=>t&&n?{name:t,items:n}:null,[t,n]);return(0,a.jsx)(s.Provider,{value:i,children:e})}function c(){const e=(0,r.useContext)(s);if(e===o)throw new i.dV("DocsSidebarProvider");return e}},63427:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(96540);n(74848);const i=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(i);function o(){return a()}},64634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},65041:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,o:()=>g});var r=n(96540),i=n(92303),a=n(70679),o=n(89532),s=n(6342),l=n(74848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function g({children:e}){const t=function(){const{announcementBar:e}=(0,s.p)(),t=(0,i.A)(),[n,a]=(0,r.useState)(()=>!!t&&d());(0,r.useEffect)(()=>{a(d())},[]);const o=(0,r.useCallback)(()=>{p(!0),a(!0)},[]);return(0,r.useEffect)(()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)},[e]),(0,r.useMemo)(()=>({isActive:!!e&&!n,close:o}),[e,n,o])}();return(0,l.jsx)(f.Provider,{value:t,children:e})}function h(){const e=(0,r.useContext)(f);if(!e)throw new o.dV("AnnouncementBarProvider");return e}},67489:(e,t,n)=>{"use strict";n.d(t,{A:()=>h});var r=n(96540),i=n(38193),a=n(5260),o=n(70440),s=n(13823),l=n(53102),c=n(74848);function u({error:e,tryAgain:t}){return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:t,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:e})]})}function d({error:e}){const t=(0,o.rA)(e).map(e=>e.message).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:t})}function p({children:e}){return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:e})}function f({error:e,tryAgain:t}){return(0,c.jsx)(p,{children:(0,c.jsxs)(h,{fallback:()=>(0,c.jsx)(u,{error:e,tryAgain:t}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:e,tryAgain:t})})]})})}const g=e=>(0,c.jsx)(f,{...e});class h extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){i.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??g)(e)}return e??null}}},69153:(e,t,n)=>{"use strict";n.d(t,{k:()=>E,w:()=>T});const r=Symbol("Comlink.proxy"),i=Symbol("Comlink.endpoint"),a=Symbol("Comlink.releaseProxy"),o=Symbol("Comlink.finalizer"),s=Symbol("Comlink.thrown"),l=e=>"object"==typeof e&&null!==e||"function"==typeof e,c=new Map([["proxy",{canHandle:e=>l(e)&&e[r],serialize(e){const{port1:t,port2:n}=new MessageChannel;return u(e,t),[n,[n]]},deserialize:e=>(e.start(),p(e))}],["throw",{canHandle:e=>l(e)&&s in e,serialize({value:e}){let t;return t=e instanceof Error?{isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:{isError:!1,value:e},[t,[]]},deserialize(e){if(e.isError)throw Object.assign(new Error(e.value.message),e.value);throw e.value}}]]);function u(e,t=globalThis,n=["*"]){t.addEventListener("message",function i(a){if(!a||!a.data)return;if(!function(e,t){for(const n of e){if(t===n||"*"===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}return!1}(n,a.origin))return void console.warn(`Invalid origin '${a.origin}' for comlink proxy`);const{id:l,type:c,path:p}=Object.assign({path:[]},a.data),f=(a.data.argumentList||[]).map(S);let g;try{const t=p.slice(0,-1).reduce((e,t)=>e[t],e),n=p.reduce((e,t)=>e[t],e);switch(c){case"GET":g=n;break;case"SET":t[p.slice(-1)[0]]=S(a.data.value),g=!0;break;case"APPLY":g=n.apply(t,f);break;case"CONSTRUCT":g=function(e){return Object.assign(e,{[r]:!0})}(new n(...f));break;case"ENDPOINT":{const{port1:t,port2:n}=new MessageChannel;u(e,n),g=function(e,t){return v.set(e,t),e}(t,[t])}break;case"RELEASE":g=void 0;break;default:return}}catch(h){g={value:h,[s]:0}}Promise.resolve(g).catch(e=>({value:e,[s]:0})).then(n=>{const[r,a]=w(n);t.postMessage(Object.assign(Object.assign({},r),{id:l}),a),"RELEASE"===c&&(t.removeEventListener("message",i),d(t),o in e&&"function"==typeof e[o]&&e[o]())}).catch(e=>{const[n,r]=w({value:new TypeError("Unserializable return value"),[s]:0});t.postMessage(Object.assign(Object.assign({},n),{id:l}),r)})}),t.start&&t.start()}function d(e){(function(e){return"MessagePort"===e.constructor.name})(e)&&e.close()}function p(e,t){const n=new Map;return e.addEventListener("message",function(e){const{data:t}=e;if(!t||!t.id)return;const r=n.get(t.id);if(r)try{r(t)}finally{n.delete(t.id)}}),b(e,n,[],t)}function f(e){if(e)throw new Error("Proxy has been released and is not useable")}function g(e){return k(e,new Map,{type:"RELEASE"}).then(()=>{d(e)})}const h=new WeakMap,m="FinalizationRegistry"in globalThis&&new FinalizationRegistry(e=>{const t=(h.get(e)||0)-1;h.set(e,t),0===t&&g(e)});function b(e,t,n=[],r=function(){}){let o=!1;const s=new Proxy(r,{get(r,i){if(f(o),i===a)return()=>{!function(e){m&&m.unregister(e)}(s),g(e),t.clear(),o=!0};if("then"===i){if(0===n.length)return{then:()=>s};const r=k(e,t,{type:"GET",path:n.map(e=>e.toString())}).then(S);return r.then.bind(r)}return b(e,t,[...n,i])},set(r,i,a){f(o);const[s,l]=w(a);return k(e,t,{type:"SET",path:[...n,i].map(e=>e.toString()),value:s},l).then(S)},apply(r,a,s){f(o);const l=n[n.length-1];if(l===i)return k(e,t,{type:"ENDPOINT"}).then(S);if("bind"===l)return b(e,t,n.slice(0,-1));const[c,u]=y(s);return k(e,t,{type:"APPLY",path:n.map(e=>e.toString()),argumentList:c},u).then(S)},construct(r,i){f(o);const[a,s]=y(i);return k(e,t,{type:"CONSTRUCT",path:n.map(e=>e.toString()),argumentList:a},s).then(S)}});return function(e,t){const n=(h.get(t)||0)+1;h.set(t,n),m&&m.register(e,t,e)}(s,e),s}function y(e){const t=e.map(w);return[t.map(e=>e[0]),(n=t.map(e=>e[1]),Array.prototype.concat.apply([],n))];var n}const v=new WeakMap;function w(e){for(const[t,n]of c)if(n.canHandle(e)){const[r,i]=n.serialize(e);return[{type:"HANDLER",name:t,value:r},i]}return[{type:"RAW",value:e},v.get(e)||[]]}function S(e){switch(e.type){case"HANDLER":return c.get(e.name).deserialize(e.value);case"RAW":return e.value}}function k(e,t,n,r){return new Promise(i=>{const a=new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");t.set(a,i),e.start&&e.start(),e.postMessage(Object.assign({id:a},n),r)})}let x;function _(){return x||(x=(async()=>{const e=p(new Worker(new URL(n.p+n.u(4809),n.b)));return await new e})()),x}async function E(e,t){{const n=await _();await n.fetchIndexes(e,t)}}async function T(e,t,n,r){return(await _()).search(e,t,n,r)}},69913:(e,t,n)=>{"use strict";var r;n.d(t,{i:()=>r}),function(e){e[e.Title=0]="Title",e[e.Heading=1]="Heading",e[e.Description=2]="Description",e[e.Keywords=3]="Keywords",e[e.Content=4]="Content"}(r||(r={}))},69982:(e,t,n)=>{"use strict";e.exports=n(4477)},70440:(e,t,n)=>{"use strict";t.rA=t.Ks=void 0;const r=n(31635);var i=n(12983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(i).default}});var a=n(42566);var o=n(80253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},70679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u,Dv:()=>d});var r=n(96540);const i=JSON.parse('{"N":"localStorage","M":""}'),a=i.N;function o({key:e,oldValue:t,newValue:n,storage:r}){if(t===n)return;const i=document.createEvent("StorageEvent");i.initStorageEvent("storage",!1,!1,e,t,n,window.location.href,r),window.dispatchEvent(i)}function s(e=a){if("undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${i.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=s(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),o({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),o({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const[n]=(0,r.useState)(()=>null===e?c:u(e,t)),i=(0,r.useCallback)(e=>"undefined"==typeof window?()=>{}:n.listen(e),[n]);return[(0,r.useSyncExternalStore)(i,()=>n.get(),()=>null),n]}},71765:(e,t,n)=>{"use strict";n.d(t,{My:()=>A,f4:()=>ne});var r,i,a,o,s,l,c,u=n(96540),d=n(34164),p=Object.create,f=Object.defineProperty,g=Object.defineProperties,h=Object.getOwnPropertyDescriptor,m=Object.getOwnPropertyDescriptors,b=Object.getOwnPropertyNames,y=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty,S=Object.prototype.propertyIsEnumerable,k=(e,t,n)=>t in e?f(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,x=(e,t)=>{for(var n in t||(t={}))w.call(t,n)&&k(e,n,t[n]);if(y)for(var n of y(t))S.call(t,n)&&k(e,n,t[n]);return e},_=(e,t)=>g(e,m(t)),E=(e,t)=>{var n={};for(var r in e)w.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&y)for(var r of y(e))t.indexOf(r)<0&&S.call(e,r)&&(n[r]=e[r]);return n},T=(r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof i?new i(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);x+=k.value.length,k=k.next){var _=k.value;if(t.length>e.length)return;if(!(_ instanceof i)){var E,T=1;if(y){if(!(E=a(S,x,e,b))||E.index>=e.length)break;var A=E.index,C=E.index+E[0].length,N=x;for(N+=k.value.length;A>=N;)N+=(k=k.next).value.length;if(x=N-=k.value.length,k.value instanceof i)continue;for(var O=k;O!==t.tail&&(Nd.reach&&(d.reach=R);var I=k.prev;if(P&&(I=l(t,I,P),x+=P.length),c(t,I,T),k=l(t,I,new i(p,m?r.tokenize(L,m):L,v,L)),j&&l(t,k,j),T>1){var D={cause:p+","+g,reach:R};o(e,t,n,k.prev,x,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,i={value:n,prev:t,next:r};return t.next=i,r.prev=i,e.length++,i}function c(e,t,n){for(var r=t.next,i=0;i"+a.content+""},r}();t.exports=n,n.default=n}},function(){return i||(0,r[b(r)[0]])((i={exports:{}}).exports,i),i.exports}),A=((e,t,n)=>(n=null!=e?p(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let i of b(t))w.call(e,i)||i===n||f(e,i,{get:()=>t[i],enumerable:!(r=h(t,i))||r.enumerable});return e})(!t&&e&&e.__esModule?n:f(n,"default",{value:e,enumerable:!0}),e)))(T());A.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},A.languages.markup.tag.inside["attr-value"].inside.entity=A.languages.markup.entity,A.languages.markup.doctype.inside["internal-subset"].inside=A.languages.markup,A.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(A.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:A.languages[t]},n.cdata=/^$/i,{"included-cdata":{pattern://i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:A.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},A.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(A.languages.markup.tag,"addAttribute",{value:function(e,t){A.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:A.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),A.languages.html=A.languages.markup,A.languages.mathml=A.languages.markup,A.languages.svg=A.languages.markup,A.languages.xml=A.languages.extend("markup",{}),A.languages.ssml=A.languages.xml,A.languages.atom=A.languages.xml,A.languages.rss=A.languages.xml,a=A,o={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},l="(?:[^\\\\-]|"+(s=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/).source+")",l=RegExp(l+"-"+l),c={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"},a.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:l,inside:{escape:s,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":o,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:s}},"special-escape":o,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":c}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:s,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},A.languages.javascript=A.languages.extend("clike",{"class-name":[A.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),A.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,A.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:A.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:A.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:A.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:A.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:A.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),A.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:A.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),A.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),A.languages.markup&&(A.languages.markup.tag.addInlined("script","javascript"),A.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),A.languages.js=A.languages.javascript,A.languages.actionscript=A.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),A.languages.actionscript["class-name"].alias="function",delete A.languages.actionscript.parameter,delete A.languages.actionscript["literal-property"],A.languages.markup&&A.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:A.languages.markup}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(A),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach(function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},i="doc-comment";if(a=e.languages[t]){var a,o=a[i];if((o=o||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[i])instanceof RegExp&&(o=a[i]={pattern:o}),Array.isArray(o))for(var s=0,l=o.length;s|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(A),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",i=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function o(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return r}).replace(/<>/g,function(){return e});return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return r})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return r}).replace(/<>/g,function(){return"(?:"+i+"|"+a+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:o(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:o(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:o(a),lookbehind:!0,greedy:!0},number:{pattern:o(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(A),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,function(){return t}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,i=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return r}),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,o=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+i+a+"(?:"+i+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+i+a+")(?:"+i+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+i+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+i+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(t){["url","bold","italic","strike","code-snippet"].forEach(function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])})}),e.hooks.add("after-tokenize",function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(A),A.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:A.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},A.hooks.add("after-tokenize",function(e){if("graphql"===e.language)for(var t=e.tokens.filter(function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type}),n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,i=r.inside["interpolation-punctuation"],a=r.pattern.source;function o(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function l(t,n,o){var l=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(l=s(l.map(function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+o.toUpperCase()+"_"+r+"___")););return u[n]=e,n}).join(""),n,o),Object.keys(u));return c=0,function t(n){for(var a=0;a=d.length)return;var o,l,p,f,g,h,m,b=n[a];"string"==typeof b||"string"==typeof b.content?(o=d[c],-1!==(m=(h="string"==typeof b?b:b.content).indexOf(o))&&(++c,l=h.substring(0,m),g=u[o],p=void 0,(f={})["interpolation-punctuation"]=i,3===(f=e.tokenize(g,f)).length&&((p=[1,1]).push.apply(p,s(f[1],e.languages.javascript,"javascript")),f.splice.apply(f,p)),p=new e.Token("interpolation",f,r.alias,g),f=h.substring(m+o.length),g=[],l&&g.push(l),g.push(p),f&&(t(h=[f]),g.push.apply(g,h)),"string"==typeof b?(n.splice.apply(n,[a,1].concat(g)),a+=g.length-1):b.content=g)):(m=b.content,Array.isArray(m)?t(m):t([m]))}}(l),new e.Token(o,l,"language-"+o,t)}e.languages.javascript["template-string"]=[o("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),o("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),o("svg",/\bsvg/.source),o("markdown",/\b(?:markdown|md)/.source),o("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),o("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",function(t){t.language in c&&function t(n){for(var r=0,i=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(A),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(//g,function(){return n})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(A),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(A),A.languages.n4js=A.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),A.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),A.languages.n4jsd=A.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(//g,function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source}),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function a(e,t){return e=e.replace(//g,function(){return n}).replace(//g,function(){return r}).replace(//g,function(){return i}),RegExp(e,t)}function o(t){for(var n=[],r=0;r"!==i.content[i.content.length-1].content&&n.push({tagName:s(i.content[0].content[1]),openedBraces:0}):0+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""};e.hooks.add("after-tokenize",function(e){"jsx"!==e.language&&"tsx"!==e.language||o(e.tokens)})}(A),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(A),A.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},A.languages.swift["string-literal"].forEach(function(e){e.inside.interpolation.inside=A.languages.swift}),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(A),A.languages.c=A.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),A.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),A.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},A.languages.c.string],char:A.languages.c.char,comment:A.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:A.languages.c}}}}),A.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete A.languages.c.boolean,A.languages.objectivec=A.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete A.languages.objectivec["class-name"],A.languages.objc=A.languages.objectivec,A.languages.reason=A.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),A.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete A.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,n=0;n<2;n++)t=t.replace(//g,function(){return t});t=t.replace(//g,function(){return/[^\s\S]/.source}),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(A),A.languages.go=A.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),A.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete A.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(A),A.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},A.languages.python["string-interpolation"].inside.interpolation.inside.rest=A.languages.python,A.languages.py=A.languages.python,A.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},A.languages.webmanifest=A.languages.json;((e,t)=>{for(var n in t)f(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>C,duotoneDark:()=>N,duotoneLight:()=>O,github:()=>L,gruvboxMaterialDark:()=>G,gruvboxMaterialLight:()=>Y,jettwaveDark:()=>H,jettwaveLight:()=>V,nightOwl:()=>P,nightOwlLight:()=>j,oceanicNext:()=>D,okaidia:()=>F,oneDark:()=>W,oneLight:()=>Q,palenight:()=>M,shadesOfPurple:()=>q,synthwave84:()=>z,ultramin:()=>B,vsDark:()=>$,vsLight:()=>U});var C={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},N={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},O={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},L={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},P={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},j={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},R="#c5a5c5",I="#8dc891",D={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:R}},{types:["attr-value"],style:{color:I}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:I}},{types:["punctuation"],style:{color:I}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:R}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},F={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},M={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},q={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},z={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},B={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},$={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},U={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},H={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},V={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},W={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},Q={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},G={plain:{color:"#ebdbb2",backgroundColor:"#292828"},styles:[{types:["imports","class-name","maybe-class-name","constant","doctype","builtin","function"],style:{color:"#d8a657"}},{types:["property-access"],style:{color:"#7daea3"}},{types:["tag"],style:{color:"#e78a4e"}},{types:["attr-name","char","url","regex"],style:{color:"#a9b665"}},{types:["attr-value","string"],style:{color:"#89b482"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#ea6962"}},{types:["entity","number","symbol"],style:{color:"#d3869b"}}]},Y={plain:{color:"#654735",backgroundColor:"#f9f5d7"},styles:[{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#af2528"}},{types:["imports","class-name","maybe-class-name","constant","doctype","builtin"],style:{color:"#b4730e"}},{types:["string","attr-value"],style:{color:"#477a5b"}},{types:["property-access"],style:{color:"#266b79"}},{types:["function","attr-name","char","url"],style:{color:"#72761e"}},{types:["tag"],style:{color:"#b94c07"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["entity","number","symbol"],style:{color:"#924f79"}}]},K=/\r\n|\r|\n/,Z=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},X=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},J=e=>{const t=[[]],n=[e],r=[0],i=[e.length];let a=0,o=0,s=[];const l=[s];for(;o>-1;){for(;(a=r[o]++)0?c:["plain"],e=u):(c=X(c,u.type),u.alias&&(c=X(c,u.alias)),e=u.content),"string"!=typeof e){o++,t.push(c),n.push(e),r.push(0),i.push(e.length);continue}const d=e.split(K),p=d.length;s.push({types:c,content:d[0]});for(let t=1;t{const{plain:n}=e,r=e.styles.reduce((e,n)=>{const{languages:r,style:i}=n;return r&&!r.includes(t)||n.types.forEach(t=>{const n=x(x({},e[t]),i);e[t]=n}),e},{});return r.root=n,r.plain=_(x({},n),{backgroundColor:void 0}),r},te=({children:e,language:t,code:n,theme:r,prism:i})=>{const a=t.toLowerCase(),o=ee(r,a),s=(e=>(0,u.useCallback)(t=>{var n=t,{className:r,style:i,line:a}=n,o=E(n,["className","style","line"]);const s=_(x({},o),{className:(0,d.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(s.style=e.plain),"object"==typeof i&&(s.style=x(x({},s.style||{}),i)),s},[e]))(o),l=(e=>{const t=(0,u.useCallback)(({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map(t=>e[t]))},[e]);return(0,u.useCallback)(e=>{var n=e,{token:r,className:i,style:a}=n,o=E(n,["token","className","style"]);const s=_(x({},o),{className:(0,d.A)("token",...r.types,i),children:r.content,style:t(r)});return null!=a&&(s.style=x(x({},s.style||{}),a)),s},[t])})(o),c=(({prism:e,code:t,grammar:n,language:r})=>(0,u.useMemo)(()=>{if(null==n)return J([t]);const i={code:t,grammar:n,language:r,tokens:[]};return e.hooks.run("before-tokenize",i),i.tokens=e.tokenize(t,n),e.hooks.run("after-tokenize",i),J(i.tokens)},[t,n,r,e]))({prism:i,language:a,code:n,grammar:i.languages[a]});return e({tokens:c,className:`prism-code language-${a}`,style:null!=o?o.root:{},getLineProps:s,getTokenProps:l})},ne=e=>(0,u.createElement)(te,_(x({},e),{prism:e.prism||A,theme:e.theme||$,code:e.code,language:e.language}))},72415:()=>{!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism)},72514:()=>{Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json},73535:(e,t,n)=>{"use strict";n.d(t,{v:()=>a});var r=n(6342);const i={anchorTargetStickyNavbar:"anchorTargetStickyNavbar_Vzrq",anchorTargetHideOnScrollNavbar:"anchorTargetHideOnScrollNavbar_vjPI"};function a(e){const{navbar:{hideOnScroll:t}}=(0,r.p)();if(void 0!==e)return t?i.anchorTargetHideOnScrollNavbar:i.anchorTargetStickyNavbar}},74848:(e,t,n)=>{"use strict";e.exports=n(29698)},75062:(e,t,n)=>{"use strict";n.d(t,{$:()=>o});var r=n(96540),i=n(56347),a=n(89532);function o(e){const t=(0,i.zy)(),n=(0,a.ZC)(t),o=(0,a._q)(e);(0,r.useEffect)(()=>{n&&t!==n&&o({location:t,previousLocation:n})},[o,t,n])}},75600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(96540),i=n(89532),a=n(74848);const o=r.createContext(null);function s({children:e}){const t=(0,r.useState)({component:null,props:null});return(0,a.jsx)(o.Provider,{value:t,children:e})}function l(){const e=(0,r.useContext)(o);if(!e)throw new i.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c({component:e,props:t}){const n=(0,r.useContext)(o);if(!n)throw new i.dV("NavbarSecondaryMenuContentProvider");const[,a]=n,s=(0,i.Be)(t);return(0,r.useEffect)(()=>{a({component:e,props:s})},[a,e,s]),(0,r.useEffect)(()=>()=>a({component:null,props:null}),[a]),null}},76294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),i=n.n(r);i().configure({showSpinner:!1});const a={onRouteUpdate({location:e,previousLocation:t}){if(t&&e.pathname!==t.pathname){const e=window.setTimeout(()=>{i().start()},200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){i().done()}}},78600:(e,t,n)=>{"use strict";var r=n(96540),i=n(5338),a=n(80545),o=n(54625),s=n(4784),l=n(38193);const c=[n(33001),n(10119),n(26134),n(76294),n(51043)];var u=n(35947),d=n(56347),p=n(22831),f=n(74848);function g({children:e}){return(0,f.jsx)(f.Fragment,{children:e})}var h=n(14563);const m=e=>e.defaultFormatter(e);function b({children:e}){return(0,f.jsx)(h.AL,{formatter:m,children:e})}function y({children:e}){return(0,f.jsx)(b,{children:e})}var v=n(5260),w=n(44586),S=n(86025),k=n(6342),x=n(45500),_=n(32131),E=n(14090);var T=n(70440),A=n(41463);function C(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,w.A)(),r=(0,_.o)(),i=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(v.A,{children:[Object.entries(n).map(([e,{htmlLang:t}])=>(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:e,fullyQualified:!0}),hrefLang:t},e)),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(i)}),Object.values(n).filter(e=>i!==e.htmlLang).map(e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`))]})}function N({permalink:e}){const{siteConfig:{url:t}}=(0,w.A)(),n=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,w.A)(),{pathname:r}=(0,d.zy)();return e+(0,T.Ks)((0,S.Ay)(r),{trailingSlash:n,baseUrl:t})}(),r=e?`${t}${e}`:n;return(0,f.jsxs)(v.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:r}),(0,f.jsx)("link",{rel:"canonical",href:r})]})}function O(){const{i18n:{currentLocale:e}}=(0,w.A)(),{metadata:t,image:n}=(0,k.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(v.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:E.w})]}),n&&(0,f.jsx)(x.be,{image:n}),(0,f.jsx)(N,{}),(0,f.jsx)(C,{}),(0,f.jsx)(A.A,{tag:"default",locale:e}),(0,f.jsx)(v.A,{children:t.map((e,t)=>(0,f.jsx)("meta",{...e},t))})]})}const L=new Map;var P=n(6125),j=n(26988),R=n(205);function I(e,...t){const n=c.map(n=>{const r=n.default?.[e]??n[e];return r?.(...t)});return()=>n.forEach(e=>e?.())}const D=function({children:e,location:t,previousLocation:n}){return(0,R.A)(()=>{n!==t&&(!function({location:e,previousLocation:t}){if(!t)return;const n=e.pathname===t.pathname,r=e.hash===t.hash,i=e.search===t.search;if(n&&r&&!i)return;const{hash:a}=e;if(a){const e=decodeURIComponent(a.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:t,previousLocation:n}),I("onRouteDidUpdate",{previousLocation:n,location:t}))},[n,t]),e};function F(e){const t=Array.from(new Set([e,decodeURI(e)])).map(e=>(0,p.u)(u.A,e)).flat();return Promise.all(t.map(e=>e.route.component.preload?.()))}class M extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),F(n.pathname).then(()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})}).catch(e=>{console.warn(e),window.location.reload()}),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(D,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const q=M,z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '__docusaurus-base-url-issue-banner-container';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
                                                              \n

                                                              Your Docusaurus site did not load properly.

                                                              \n

                                                              A very common reason is a wrong site baseUrl configuration.

                                                              \n

                                                              Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

                                                              \n

                                                              We suggest trying baseUrl =

                                                              \n
                                                              \n`}(e)).replace(/!0===e.exact))return L.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return L.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(q,{location:e,children:G})}function K(){return(0,f.jsx)(V.A,{children:(0,f.jsx)(j.l,{children:(0,f.jsxs)(P.x,{children:[(0,f.jsx)(g,{children:(0,f.jsxs)(y,{children:[(0,f.jsx)(H,{}),(0,f.jsx)(O,{}),(0,f.jsx)(U,{}),(0,f.jsx)(Y,{})]})}),(0,f.jsx)(Q,{})]})})})}var Z=n(84054);const X=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const i=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;i?.appendChild(r)})}:function(e){return new Promise((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)})};var J=n(86921);const ee=new Set,te=new Set,ne=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,re={prefetch:e=>{if(!(e=>!ne()&&!te.has(e)&&!ee.has(e))(e))return!1;ee.add(e);const t=(0,p.u)(u.A,e).flatMap(e=>{return t=e.route.path,Object.entries(Z).filter(([e])=>e.replace(/-[^-]+$/,"")===t).flatMap(([,e])=>Object.values((0,J.A)(e)));var t});return Promise.all(t.map(e=>{const t=n.gca(e);return t&&!t.includes("undefined")?X(t).catch(()=>{}):Promise.resolve()}))},preload:e=>!!(e=>!ne()&&!te.has(e))(e)&&(te.add(e),F(e))},ie=Object.freeze(re);function ae({children:e}){return"hash"===s.default.future.experimental_router?(0,f.jsx)(o.I9,{children:e}):(0,f.jsx)(o.Kd,{children:e})}const oe=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=ie;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(ae,{children:(0,f.jsx)(K,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},o=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(oe)window.docusaurusRoot=i.hydrateRoot(e,t,{onRecoverableError:n});else{const r=i.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};F(window.location.pathname).then(()=>{(0,r.startTransition)(o)})}},79231:(e,t,n)=>{"use strict";n.d(t,{zR:()=>x,TM:()=>N,yJ:()=>h,sC:()=>L,AO:()=>g,Fu:()=>m});var r=n(58168);function i(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,i=e.length;r=0;p--){var f=o[p];"."===f?a(o,p):".."===f?(a(o,p),d++):d&&(a(o,p),d--)}if(!c)for(;d--;d)o.unshift("..");!c||""===o[0]||o[0]&&i(o[0])||o.unshift("");var g=o.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};function s(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const l=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every(function(t,r){return e(t,n[r])});if("object"==typeof t||"object"==typeof n){var r=s(t),i=s(n);return r!==t||i!==n?e(r,i):Object.keys(Object.assign({},t,n)).every(function(r){return e(t[r],n[r])})}return!1};var c=n(11561);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function p(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function f(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function g(e){var t=e.pathname,n=e.search,r=e.hash,i=t||"/";return n&&"?"!==n&&(i+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(i+="#"===r.charAt(0)?r:"#"+r),i}function h(e,t,n,i){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",i=t.indexOf("#");-1!==i&&(r=t.substr(i),t=t.substr(0,i));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),i?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=o(a.pathname,i.pathname)):a.pathname=i.pathname:a.pathname||(a.pathname="/"),a}function m(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&l(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,i){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,i):i(!0):i(!1!==a)}else i(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter(function(e){return e!==r})}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,i):n.push(i),d({action:r,location:i,index:t,entries:n})}})},replace:function(e,t){var r="REPLACE",i=h(e,t,p(),w.location);u.confirmTransitionTo(i,r,n,function(e){e&&(w.entries[w.index]=i,d({action:r,location:i}))})},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},80545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>V});var r=n(96540),i=n(5556),a=n.n(i),o=n(30115),s=n.n(o),l=n(20311),c=n.n(l),u=n(2833),d=n.n(u);function p(){return p=Object.assign||function(e){for(var t=1;t=0||(i[n]=e[n]);return i}var m={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},y={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(m).map(function(e){return m[e]}),S={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},k=Object.keys(S).reduce(function(e,t){return e[S[t]]=t,e},{}),x=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},_=function(e){var t=x(e,m.TITLE),n=x(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,function(){return t});var r=x(e,"defaultTitle");return t||r||void 0},E=function(e){return x(e,"onChangeClientState")||function(){}},T=function(e,t){return t.filter(function(t){return void 0!==t[e]}).map(function(t){return t[e]}).reduce(function(e,t){return p({},e,t)},{})},A=function(e,t){return t.filter(function(e){return void 0!==e[m.BASE]}).map(function(e){return e[m.BASE]}).reverse().reduce(function(t,n){if(!t.length)for(var r=Object.keys(n),i=0;i/g,">").replace(/"/g,""").replace(/'/g,"'")},I=function(e){return Object.keys(e).reduce(function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r},"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce(function(t,n){return t[S[n]||n]=e[n],t},t)},F=function(e,t){return t.map(function(t,n){var i,a=((i={key:n})["data-rh"]=!0,i);return Object.keys(t).forEach(function(e){var n=S[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]}),r.createElement(e,a)})},M=function(e,t,n){switch(e){case m.TITLE:return{toComponent:function(){return n=t.titleAttributes,(i={key:e=t.title})["data-rh"]=!0,a=D(n,i),[r.createElement(m.TITLE,a,e)];var e,n,i,a},toString:function(){return function(e,t,n,r){var i=I(n),a=O(t);return i?"<"+e+' data-rh="true" '+i+">"+R(a,r)+"":"<"+e+' data-rh="true">'+R(a,r)+""}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return I(t)}};default:return{toComponent:function(){return F(e,t)},toString:function(){return function(e,t,n){return t.reduce(function(t,r){var i=Object.keys(r).filter(function(e){return!("innerHTML"===e||"cssText"===e)}).reduce(function(e,t){var i=void 0===r[t]?t:t+'="'+R(r[t],n)+'"';return e?e+" "+i:i},""),a=r.innerHTML||r.cssText||"",o=-1===j.indexOf(e);return t+"<"+e+' data-rh="true" '+i+(o?"/>":">"+a+"")},"")}(e,t,n)}}}},q=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,i=e.htmlAttributes,a=e.noscriptTags,o=e.styleTags,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,i=L(e.metaTags,v),a=L(t,b),o=L(n,y);return{priorityMethods:{toComponent:function(){return[].concat(F(m.META,i.priority),F(m.LINK,a.priority),F(m.SCRIPT,o.priority))},toString:function(){return M(m.META,i.priority,r)+" "+M(m.LINK,a.priority,r)+" "+M(m.SCRIPT,o.priority,r)}},metaTags:i.default,linkTags:a.default,scriptTags:o.default}}(e);f=g.priorityMethods,u=g.linkTags,d=g.metaTags,p=g.scriptTags}return{priority:f,base:M(m.BASE,t,r),bodyAttributes:M("bodyAttributes",n,r),htmlAttributes:M("htmlAttributes",i,r),link:M(m.LINK,u,r),meta:M(m.META,d,r),noscript:M(m.NOSCRIPT,a,r),script:M(m.SCRIPT,p,r),style:M(m.STYLE,o,r),title:M(m.TITLE,{title:l,titleAttributes:c},r)}},z=[],B=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=q({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),U=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,V=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new B(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement($.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);V.canUseDOM=H,V.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},V.defaultProps={context:{}},V.displayName="HelmetProvider";var W=function(e,t){var n,r=document.head||document.querySelector(m.HEAD),i=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(i),o=[];return t&&t.length&&t.forEach(function(t){var r=document.createElement(e);for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&("innerHTML"===i?r.innerHTML=t.innerHTML:"cssText"===i?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(i,void 0===t[i]?"":t[i]));r.setAttribute("data-rh","true"),a.some(function(e,t){return n=t,r.isEqualNode(e)})?a.splice(n,1):o.push(r)}),a.forEach(function(e){return e.parentNode.removeChild(e)}),o.forEach(function(e){return r.appendChild(e)}),{oldTags:a,newTags:o}},Q=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),i=r?r.split(","):[],a=[].concat(i),o=Object.keys(t),s=0;s=0;d-=1)n.removeAttribute(a[d]);i.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==o.join(",")&&n.setAttribute("data-rh",o.join(","))}},G=function(e,t){var n=e.baseTag,r=e.htmlAttributes,i=e.linkTags,a=e.metaTags,o=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;Q(m.BODY,e.bodyAttributes),Q(m.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=O(e)),Q(m.TITLE,t)}(u,d);var p={baseTag:W(m.BASE,n),linkTags:W(m.LINK,i),metaTags:W(m.META,a),noscriptTags:W(m.NOSCRIPT,o),scriptTags:W(m.SCRIPT,l),styleTags:W(m.STYLE,c)},f={},g={};Object.keys(p).forEach(function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(g[e]=p[e].oldTags)}),t&&t(),s(e,f,g)},Y=null,K=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),i=0;i elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,i=e.newProps,a=e.newChildProps,o=e.nestedChildren;switch(r.type){case m.TITLE:return p({},i,((t={})[r.type]=o,t.titleAttributes=p({},a),t));case m.BODY:return p({},i,{bodyAttributes:p({},a)});case m.HTML:return p({},i,{htmlAttributes:p({},a)});default:return p({},i,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach(function(t){var r;n=p({},n,((r={})[t]=e[t],r))}),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some(function(t){return e.type===t}),"function"==typeof e.type?"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some(function(e){return"string"!=typeof e}),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``} ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,i={};return r.Children.forEach(e,function(e){if(e&&e.props){var r=e.props,a=r.children,o=h(r,Z),s=Object.keys(o).reduce(function(e,t){return e[k[t]||t]=o[t],e},{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case m.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case m.LINK:case m.META:case m.NOSCRIPT:case m.SCRIPT:case m.STYLE:i=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:i,newChildProps:s,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:a})}}}),this.mapArrayTypeChildrenToProps(i,t)},n.render=function(){var e=this.props,t=e.children,n=h(e,X),i=p({},n),a=n.helmetData;return t&&(i=this.mapChildrenToProps(t,i)),!a||a instanceof B||(a=new B(a.context,a.instances)),a?r.createElement(K,p({},i,{context:a.value,helmetData:void 0})):r.createElement($.Consumer,null,function(e){return r.createElement(K,p({},i,{context:e}))})},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},82565:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>o});var r=n(44070),i=n(53886);function a(e,t){return`docs-${e}-${t}`}function o(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,i.XK)();return[...Object.keys(e).map(function(r){const i=t?.activePlugin.pluginId===r?t.activeVersion:void 0,o=n[r],s=e[r].versions.find(e=>e.isLast);return a(r,(i??o??s).name)})]}},84054:e=>{"use strict";e.exports=JSON.parse('{"/docs/ignite3/search-085":{"__comp":"1a4e3797","__context":{"plugin":"138e0e15"}},"/docs/ignite3/-4c4":{"__comp":"1df93b7f","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"},"/docs/ignite3/-0c3":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/docs/ignite3/3.0.0-e86":{"__comp":"a7bd4aaa","__props":"b7991eff"},"/docs/ignite3/3.0.0-f69":{"__comp":"a94703ab"},"/docs/ignite3/3.0.0-91c":{"__comp":"17896441","content":"2dd8807d"},"/docs/ignite3/3.0.0/administrators-guide/cluster-security-60d":{"__comp":"17896441","content":"a06ae79b"},"/docs/ignite3/3.0.0/administrators-guide/colocation-de9":{"__comp":"17896441","content":"6d14130f"},"/docs/ignite3/3.0.0/administrators-guide/config-6f7":{"__comp":"17896441","content":"8f4c7ad5"},"/docs/ignite3/3.0.0/administrators-guide/config/cli-config-cb2":{"__comp":"17896441","content":"4c300737"},"/docs/ignite3/3.0.0/administrators-guide/config/cluster-config-a8f":{"__comp":"17896441","content":"86aa3622"},"/docs/ignite3/3.0.0/administrators-guide/config/node-config-cbe":{"__comp":"17896441","content":"5ba93427"},"/docs/ignite3/3.0.0/administrators-guide/config/storage/persistent-23e":{"__comp":"17896441","content":"264dac2b"},"/docs/ignite3/3.0.0/administrators-guide/config/storage/rocksdb-471":{"__comp":"17896441","content":"eff8d8a9"},"/docs/ignite3/3.0.0/administrators-guide/config/storage/volatile-c9e":{"__comp":"17896441","content":"c4101606"},"/docs/ignite3/3.0.0/administrators-guide/disaster-recovery-180":{"__comp":"17896441","content":"4f4c954e"},"/docs/ignite3/3.0.0/administrators-guide/handling-exceptions-d34":{"__comp":"17896441","content":"0ea0f99b"},"/docs/ignite3/3.0.0/administrators-guide/lifecycle-28c":{"__comp":"17896441","content":"ac3be0c3"},"/docs/ignite3/3.0.0/administrators-guide/metrics/configuring-metrics-db5":{"__comp":"17896441","content":"1aa4865b"},"/docs/ignite3/3.0.0/administrators-guide/metrics/metrics-list-2cf":{"__comp":"17896441","content":"73aef688"},"/docs/ignite3/3.0.0/administrators-guide/metrics/system-views-0bd":{"__comp":"17896441","content":"0e52afe7"},"/docs/ignite3/3.0.0/administrators-guide/security/authentication-8b8":{"__comp":"17896441","content":"b96d81e3"},"/docs/ignite3/3.0.0/administrators-guide/security/ssl-tls-afc":{"__comp":"17896441","content":"24d94e02"},"/docs/ignite3/3.0.0/administrators-guide/storage-87d":{"__comp":"17896441","content":"be3682b6"},"/docs/ignite3/3.0.0/administrators-guide/storage/data-partitions-625":{"__comp":"17896441","content":"04b7cdab"},"/docs/ignite3/3.0.0/administrators-guide/storage/engines-e5f":{"__comp":"17896441","content":"c5beb181"},"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aimem-e3b":{"__comp":"17896441","content":"7faacd1a"},"/docs/ignite3/3.0.0/administrators-guide/storage/engines/aipersist-8df":{"__comp":"17896441","content":"c2c5a8d2"},"/docs/ignite3/3.0.0/administrators-guide/storage/engines/rocksdb-f6f":{"__comp":"17896441","content":"6105dffd"},"/docs/ignite3/3.0.0/administrators-guide/storage/storage-profiles-9e1":{"__comp":"17896441","content":"dd1a5b79"},"/docs/ignite3/3.0.0/administrators-guide/system-groups-recovery-785":{"__comp":"17896441","content":"0d1c3a24"},"/docs/ignite3/3.0.0/developers-guide/clients-5dc":{"__comp":"17896441","content":"ede2c0d3"},"/docs/ignite3/3.0.0/developers-guide/clients/ado-4dc":{"__comp":"17896441","content":"9af10537"},"/docs/ignite3/3.0.0/developers-guide/clients/cpp-19c":{"__comp":"17896441","content":"8d621382"},"/docs/ignite3/3.0.0/developers-guide/clients/dotnet-bd2":{"__comp":"17896441","content":"aab940e4"},"/docs/ignite3/3.0.0/developers-guide/clients/java-754":{"__comp":"17896441","content":"e0d8b5f8"},"/docs/ignite3/3.0.0/developers-guide/clients/jdbc-driver-cb4":{"__comp":"17896441","content":"25653805"},"/docs/ignite3/3.0.0/developers-guide/clients/linq-b29":{"__comp":"17896441","content":"c96ce734"},"/docs/ignite3/3.0.0/developers-guide/clients/python-126":{"__comp":"17896441","content":"6453b56c"},"/docs/ignite3/3.0.0/developers-guide/code-deployment-ab9":{"__comp":"17896441","content":"bfca4c52"},"/docs/ignite3/3.0.0/developers-guide/compute-cf9":{"__comp":"17896441","content":"6ce9454c"},"/docs/ignite3/3.0.0/developers-guide/compute/serialization-e6b":{"__comp":"17896441","content":"7a459efc"},"/docs/ignite3/3.0.0/developers-guide/data-streamer-781":{"__comp":"17896441","content":"2e631686"},"/docs/ignite3/3.0.0/developers-guide/events-187":{"__comp":"17896441","content":"c196937a"},"/docs/ignite3/3.0.0/developers-guide/events/events-list-3fa":{"__comp":"17896441","content":"2e7ecfd5"},"/docs/ignite3/3.0.0/developers-guide/java-to-tables-8b1":{"__comp":"17896441","content":"54b9d659"},"/docs/ignite3/3.0.0/developers-guide/rest/rest-api-d5e":{"__comp":"17896441","content":"59074688"},"/docs/ignite3/3.0.0/developers-guide/sql/calcite-based-sql-engine-99d":{"__comp":"17896441","content":"5bd6484a"},"/docs/ignite3/3.0.0/developers-guide/sql/jdbc-driver-213":{"__comp":"17896441","content":"df80b230"},"/docs/ignite3/3.0.0/developers-guide/sql/odbc/connection-string-7ac":{"__comp":"17896441","content":"407a0507"},"/docs/ignite3/3.0.0/developers-guide/sql/odbc/odbc-driver-b6f":{"__comp":"17896441","content":"ee8364d1"},"/docs/ignite3/3.0.0/developers-guide/sql/odbc/querying-modifying-data-bf7":{"__comp":"17896441","content":"f522cffe"},"/docs/ignite3/3.0.0/developers-guide/sql/odbc/specification-89b":{"__comp":"17896441","content":"52ea876c"},"/docs/ignite3/3.0.0/developers-guide/sql/sql-api-132":{"__comp":"17896441","content":"eb76c95c"},"/docs/ignite3/3.0.0/developers-guide/sql/system-views-39a":{"__comp":"17896441","content":"8f9fabaf"},"/docs/ignite3/3.0.0/developers-guide/table-api-d31":{"__comp":"17896441","content":"2abe8a17"},"/docs/ignite3/3.0.0/developers-guide/transactions-000":{"__comp":"17896441","content":"fe1d83c2"},"/docs/ignite3/3.0.0/general-tips-72e":{"__comp":"17896441","content":"7a0d0e36"},"/docs/ignite3/3.0.0/glossary-ef9":{"__comp":"17896441","content":"56998700"},"/docs/ignite3/3.0.0/ignite-cli-tool-9b1":{"__comp":"17896441","content":"f838f9b1"},"/docs/ignite3/3.0.0/installation/deb-rpm-4f9":{"__comp":"17896441","content":"d902eba8"},"/docs/ignite3/3.0.0/installation/installing-to-k8s-14e":{"__comp":"17896441","content":"7ea0a1cf"},"/docs/ignite3/3.0.0/installation/installing-using-docker-28a":{"__comp":"17896441","content":"6e1e49fb"},"/docs/ignite3/3.0.0/installation/installing-using-zip-cbb":{"__comp":"17896441","content":"76682ea2"},"/docs/ignite3/3.0.0/installation/migration-from-ai2-0af":{"__comp":"17896441","content":"fb00ac63"},"/docs/ignite3/3.0.0/quick-start/embedded-mode-954":{"__comp":"17896441","content":"b1ef1c36"},"/docs/ignite3/3.0.0/quick-start/explore-sql-e9e":{"__comp":"17896441","content":"4fffa35c"},"/docs/ignite3/3.0.0/quick-start/getting-started-guide-567":{"__comp":"17896441","content":"9a925e23"},"/docs/ignite3/3.0.0/quick-start/java-api-2e7":{"__comp":"17896441","content":"19ff637c"},"/docs/ignite3/3.0.0/quick-start/persist-data-b35":{"__comp":"17896441","content":"cb32231c"},"/docs/ignite3/3.0.0/quick-start/start-cluster-776":{"__comp":"17896441","content":"430edd65"},"/docs/ignite3/3.0.0/sql-reference/data-types-1e1":{"__comp":"17896441","content":"485437b7"},"/docs/ignite3/3.0.0/sql-reference/ddl-a35":{"__comp":"17896441","content":"c9838793"},"/docs/ignite3/3.0.0/sql-reference/distribution-zones-1ba":{"__comp":"17896441","content":"f99b384c"},"/docs/ignite3/3.0.0/sql-reference/dml-f9c":{"__comp":"17896441","content":"c0475018"},"/docs/ignite3/3.0.0/sql-reference/explain-operators-list-91c":{"__comp":"17896441","content":"5152a8e0"},"/docs/ignite3/3.0.0/sql-reference/explain-statement-6a5":{"__comp":"17896441","content":"b9041da1"},"/docs/ignite3/3.0.0/sql-reference/grammar-reference-3bf":{"__comp":"17896441","content":"61eaa059"},"/docs/ignite3/3.0.0/sql-reference/keywords-abe":{"__comp":"17896441","content":"1f9d746e"},"/docs/ignite3/3.0.0/sql-reference/operational-commands-e80":{"__comp":"17896441","content":"254bafb3"},"/docs/ignite3/3.0.0/sql-reference/operators-and-functions-594":{"__comp":"17896441","content":"148ac273"},"/docs/ignite3/3.0.0/sql-reference/sql-conformance-4d2":{"__comp":"17896441","content":"fddde30a"},"/docs/ignite3/3.0.0/sql-reference/transactions-dca":{"__comp":"17896441","content":"e288cdcf"},"/docs/ignite3/3.0.0/sql-tuning-c82":{"__comp":"17896441","content":"d95c5914"},"/docs/ignite3/3.0.0/sql-tuning/using-explain-887":{"__comp":"17896441","content":"83719db0"},"/docs/ignite3/3.1.0-252":{"__comp":"a7bd4aaa","__props":"aea2f960"},"/docs/ignite3/3.1.0-e4d":{"__comp":"a94703ab"},"/docs/ignite3/3.1.0-aef":{"__comp":"17896441","content":"4edc808e"},"/docs/ignite3/3.1.0/api-reference-5a3":{"__comp":"17896441","content":"0b3cdf12"},"/docs/ignite3/3.1.0/api-reference/api-e34":{"__comp":"17896441","content":"c98fd205"},"/docs/ignite3/3.1.0/api-reference/api/cpp-api-reference-043":{"__comp":"17896441","content":"5ced4073"},"/docs/ignite3/3.1.0/api-reference/api/dotnet-api-reference-4d4":{"__comp":"17896441","content":"a3771ee6"},"/docs/ignite3/3.1.0/api-reference/api/java-api-reference-e58":{"__comp":"17896441","content":"6ff241e2"},"/docs/ignite3/3.1.0/api-reference/native-clients-5c4":{"__comp":"17896441","content":"dad9a2fd"},"/docs/ignite3/3.1.0/api-reference/native-clients/cpp-b35":{"__comp":"17896441","content":"a1b4f2ab"},"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/client-api-73f":{"__comp":"17896441","content":"cd6ed4c4"},"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/compute-api-458":{"__comp":"17896441","content":"967c1bfd"},"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/network-api-141":{"__comp":"17896441","content":"70598898"},"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/sql-api-65d":{"__comp":"17896441","content":"01a4d6cc"},"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/tables-api-aec":{"__comp":"17896441","content":"b99fd215"},"/docs/ignite3/3.1.0/api-reference/native-clients/cpp/transactions-api-6f6":{"__comp":"17896441","content":"fcc8bf93"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet-69b":{"__comp":"17896441","content":"b01f8e23"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/ado-net-api-3a3":{"__comp":"17896441","content":"25efb993"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/client-api-a0a":{"__comp":"17896441","content":"cf4f3c50"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/compute-api-96c":{"__comp":"17896441","content":"56216d1a"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/data-streamer-api-d0c":{"__comp":"17896441","content":"77a23d4b"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/linq-api-e07":{"__comp":"17896441","content":"d7a33538"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/network-api-5e5":{"__comp":"17896441","content":"dcbc23ab"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/sql-api-86c":{"__comp":"17896441","content":"c564e63a"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/tables-api-f11":{"__comp":"17896441","content":"f9e4bc23"},"/docs/ignite3/3.1.0/api-reference/native-clients/dotnet/transactions-api-ce6":{"__comp":"17896441","content":"3f98ac4d"},"/docs/ignite3/3.1.0/api-reference/native-clients/java-baa":{"__comp":"17896441","content":"8452ee8f"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/catalog-api-6b8":{"__comp":"17896441","content":"f7a2bd99"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/client-api-b09":{"__comp":"17896441","content":"cfa06b25"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/compute-api-1fb":{"__comp":"17896441","content":"ea9d2f00"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/criteria-api-0d6":{"__comp":"17896441","content":"a4bdb400"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/data-streamer-api-b06":{"__comp":"17896441","content":"88642a14"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/network-api-693":{"__comp":"17896441","content":"6d99e875"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/security-api-249":{"__comp":"17896441","content":"6b5309c4"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/server-api-d42":{"__comp":"17896441","content":"da66ee89"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/sql-api-c86":{"__comp":"17896441","content":"a734c28f"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/tables-api-f3e":{"__comp":"17896441","content":"9185a77c"},"/docs/ignite3/3.1.0/api-reference/native-clients/java/transactions-api-e3b":{"__comp":"17896441","content":"e6e12c77"},"/docs/ignite3/3.1.0/api-reference/sql-only-apis-b52":{"__comp":"17896441","content":"68533010"},"/docs/ignite3/3.1.0/api-reference/sql-only-apis/jdbc-4af":{"__comp":"17896441","content":"01605f1b"},"/docs/ignite3/3.1.0/api-reference/sql-only-apis/odbc-384":{"__comp":"17896441","content":"0eb0485d"},"/docs/ignite3/3.1.0/api-reference/sql-only-apis/python-523":{"__comp":"17896441","content":"31dfd8c3"},"/docs/ignite3/3.1.0/configure-and-operate-374":{"__comp":"17896441","content":"01966bdf"},"/docs/ignite3/3.1.0/configure-and-operate/configuration-bf2":{"__comp":"17896441","content":"6dd34219"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-authentication-1ac":{"__comp":"17896441","content":"0dba3038"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-and-nodes-3c4":{"__comp":"17896441","content":"0ed4f4b9"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-cluster-security-fef":{"__comp":"17896441","content":"31fb6dea"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-ssl-tls-071":{"__comp":"17896441","content":"8f944727"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-078":{"__comp":"17896441","content":"0c117f5c"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-overview-3e4":{"__comp":"17896441","content":"7bd5cb78"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-persistent-e70":{"__comp":"17896441","content":"46a2bd78"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-rocksdb-be0":{"__comp":"17896441","content":"10d5c8a2"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/config-storage-volatile-fc0":{"__comp":"17896441","content":"38c4fee5"},"/docs/ignite3/3.1.0/configure-and-operate/configuration/metrics-configuration-69e":{"__comp":"17896441","content":"6686d628"},"/docs/ignite3/3.1.0/configure-and-operate/installation-693":{"__comp":"17896441","content":"bb56423f"},"/docs/ignite3/3.1.0/configure-and-operate/installation/install-deb-rpm-a06":{"__comp":"17896441","content":"a6ff32af"},"/docs/ignite3/3.1.0/configure-and-operate/installation/install-docker-070":{"__comp":"17896441","content":"689fd026"},"/docs/ignite3/3.1.0/configure-and-operate/installation/install-kubernetes-0e3":{"__comp":"17896441","content":"1c5cff81"},"/docs/ignite3/3.1.0/configure-and-operate/installation/install-zip-f46":{"__comp":"17896441","content":"39417523"},"/docs/ignite3/3.1.0/configure-and-operate/monitoring-5e8":{"__comp":"17896441","content":"5745cf5f"},"/docs/ignite3/3.1.0/configure-and-operate/monitoring/available-metrics-375":{"__comp":"17896441","content":"bf32d4f4"},"/docs/ignite3/3.1.0/configure-and-operate/monitoring/config-metrics-707":{"__comp":"17896441","content":"86fea04b"},"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-8ba":{"__comp":"17896441","content":"714f451d"},"/docs/ignite3/3.1.0/configure-and-operate/monitoring/metrics-system-views-3af":{"__comp":"17896441","content":"66cd9110"},"/docs/ignite3/3.1.0/configure-and-operate/operations-4a7":{"__comp":"17896441","content":"bcb7ad38"},"/docs/ignite3/3.1.0/configure-and-operate/operations/colocation-18c":{"__comp":"17896441","content":"e910cb7c"},"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-821":{"__comp":"17896441","content":"1b5d77aa"},"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-partitions-c4b":{"__comp":"17896441","content":"fd10d9c3"},"/docs/ignite3/3.1.0/configure-and-operate/operations/disaster-recovery-system-groups-94a":{"__comp":"17896441","content":"b0221735"},"/docs/ignite3/3.1.0/configure-and-operate/operations/handle-exceptions-bd9":{"__comp":"17896441","content":"9ac7fe78"},"/docs/ignite3/3.1.0/configure-and-operate/operations/lifecycle-f06":{"__comp":"17896441","content":"796ebb42"},"/docs/ignite3/3.1.0/configure-and-operate/reference-7c9":{"__comp":"17896441","content":"ad0d46b8"},"/docs/ignite3/3.1.0/configure-and-operate/reference/cli-configuration-afd":{"__comp":"17896441","content":"90a0f442"},"/docs/ignite3/3.1.0/configure-and-operate/reference/cluster-configuration-3f2":{"__comp":"17896441","content":"4436c0ec"},"/docs/ignite3/3.1.0/configure-and-operate/reference/node-configuration-7b6":{"__comp":"17896441","content":"cb5d1ef8"},"/docs/ignite3/3.1.0/configure-and-operate/reference/storage-profiles-7d6":{"__comp":"17896441","content":"9bbb96d9"},"/docs/ignite3/3.1.0/develop-8ea":{"__comp":"17896441","content":"6cc25ccb"},"/docs/ignite3/3.1.0/develop/connect-to-ignite-95f":{"__comp":"17896441","content":"6b7ab3e3"},"/docs/ignite3/3.1.0/develop/connect-to-ignite/jdbc-341":{"__comp":"17896441","content":"91920555"},"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-7da":{"__comp":"17896441","content":"29e18771"},"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-connection-string-ac8":{"__comp":"17896441","content":"8826f367"},"/docs/ignite3/3.1.0/develop/connect-to-ignite/odbc-querying-data-fe6":{"__comp":"17896441","content":"4643c4f2"},"/docs/ignite3/3.1.0/develop/connect-to-ignite/python-950":{"__comp":"17896441","content":"b1ab1304"},"/docs/ignite3/3.1.0/develop/ignite-clients-1e3":{"__comp":"17896441","content":"a150ce1d"},"/docs/ignite3/3.1.0/develop/ignite-clients/cpp-client-0cd":{"__comp":"17896441","content":"071c34d4"},"/docs/ignite3/3.1.0/develop/ignite-clients/dotnet-client-368":{"__comp":"17896441","content":"aa014cab"},"/docs/ignite3/3.1.0/develop/ignite-clients/java-client-14b":{"__comp":"17896441","content":"ee0a6a95"},"/docs/ignite3/3.1.0/develop/integrate-1e1":{"__comp":"17896441","content":"16d50cfe"},"/docs/ignite3/3.1.0/develop/integrate/spring-boot-1a5":{"__comp":"17896441","content":"2f89ca13"},"/docs/ignite3/3.1.0/develop/integrate/spring-data-57b":{"__comp":"17896441","content":"654e3e67"},"/docs/ignite3/3.1.0/develop/work-with-data-258":{"__comp":"17896441","content":"1c440c53"},"/docs/ignite3/3.1.0/develop/work-with-data/code-deployment-e63":{"__comp":"17896441","content":"f9e65627"},"/docs/ignite3/3.1.0/develop/work-with-data/compute-a92":{"__comp":"17896441","content":"0f12c4b6"},"/docs/ignite3/3.1.0/develop/work-with-data/events-ee0":{"__comp":"17896441","content":"14965a6a"},"/docs/ignite3/3.1.0/develop/work-with-data/events-list-490":{"__comp":"17896441","content":"42222ea0"},"/docs/ignite3/3.1.0/develop/work-with-data/java-client-logging-1e5":{"__comp":"17896441","content":"dd4c3c7d"},"/docs/ignite3/3.1.0/develop/work-with-data/java-to-tables-7f6":{"__comp":"17896441","content":"69dbdcb6"},"/docs/ignite3/3.1.0/develop/work-with-data/serialization-5cd":{"__comp":"17896441","content":"948ed64f"},"/docs/ignite3/3.1.0/develop/work-with-data/streaming-9f7":{"__comp":"17896441","content":"2c69403e"},"/docs/ignite3/3.1.0/develop/work-with-data/table-api-d22":{"__comp":"17896441","content":"32c93f0c"},"/docs/ignite3/3.1.0/develop/work-with-data/transactions-eb1":{"__comp":"17896441","content":"2b2b4e7a"},"/docs/ignite3/3.1.0/getting-started-aa1":{"__comp":"17896441","content":"15d99295"},"/docs/ignite3/3.1.0/getting-started/best-practices-8a2":{"__comp":"17896441","content":"66b63dfc"},"/docs/ignite3/3.1.0/getting-started/embedded-mode-6f8":{"__comp":"17896441","content":"cfc81aaa"},"/docs/ignite3/3.1.0/getting-started/intro-4bf":{"__comp":"17896441","content":"6dfec84f"},"/docs/ignite3/3.1.0/getting-started/key-value-api-f4c":{"__comp":"17896441","content":"840d3d48"},"/docs/ignite3/3.1.0/getting-started/migrate-from-3-0-to-3-1-f75":{"__comp":"17896441","content":"29562505"},"/docs/ignite3/3.1.0/getting-started/migrate-from-ignite-2-bb5":{"__comp":"17896441","content":"e4ab0479"},"/docs/ignite3/3.1.0/getting-started/quick-start-989":{"__comp":"17896441","content":"588bd741"},"/docs/ignite3/3.1.0/getting-started/start-cluster-a25":{"__comp":"17896441","content":"696e0280"},"/docs/ignite3/3.1.0/getting-started/work-with-sql-e6b":{"__comp":"17896441","content":"51b5f6a1"},"/docs/ignite3/3.1.0/sql-137":{"__comp":"17896441","content":"f6ab33a6"},"/docs/ignite3/3.1.0/sql/advanced-bb9":{"__comp":"17896441","content":"d2778e29"},"/docs/ignite3/3.1.0/sql/advanced/explain-statement-3a9":{"__comp":"17896441","content":"1d166f75"},"/docs/ignite3/3.1.0/sql/advanced/performance-tuning-adc":{"__comp":"17896441","content":"e30f13ec"},"/docs/ignite3/3.1.0/sql/fundamentals-0f7":{"__comp":"17896441","content":"14ca7f3e"},"/docs/ignite3/3.1.0/sql/fundamentals/engine-architecture-81f":{"__comp":"17896441","content":"f0a4d6aa"},"/docs/ignite3/3.1.0/sql/reference-f6c":{"__comp":"17896441","content":"60b12218"},"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions-846":{"__comp":"17896441","content":"3cf17eef"},"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/data-types-926":{"__comp":"17896441","content":"69bfbf1a"},"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operational-commands-b81":{"__comp":"17896441","content":"5d2daac0"},"/docs/ignite3/3.1.0/sql/reference/data-types-and-functions/operators-and-functions-b08":{"__comp":"17896441","content":"6861f3ae"},"/docs/ignite3/3.1.0/sql/reference/language-definition-c80":{"__comp":"17896441","content":"c6f94207"},"/docs/ignite3/3.1.0/sql/reference/language-definition/ddl-b26":{"__comp":"17896441","content":"c851e8ef"},"/docs/ignite3/3.1.0/sql/reference/language-definition/distribution-zones-9ef":{"__comp":"17896441","content":"555c49dc"},"/docs/ignite3/3.1.0/sql/reference/language-definition/dml-fa7":{"__comp":"17896441","content":"390e6ec8"},"/docs/ignite3/3.1.0/sql/reference/language-definition/grammar-reference-6bf":{"__comp":"17896441","content":"ddb6bda5"},"/docs/ignite3/3.1.0/sql/reference/language-definition/transactions-ee6":{"__comp":"17896441","content":"24239f0f"},"/docs/ignite3/3.1.0/sql/reference/sql-conformance-014":{"__comp":"17896441","content":"55bb5782"},"/docs/ignite3/3.1.0/sql/reference/sql-conformance/keywords-719":{"__comp":"17896441","content":"1ffcbc41"},"/docs/ignite3/3.1.0/sql/reference/sql-conformance/overview-fb0":{"__comp":"17896441","content":"20e3d2e5"},"/docs/ignite3/3.1.0/sql/working-with-sql-a7f":{"__comp":"17896441","content":"6449194f"},"/docs/ignite3/3.1.0/sql/working-with-sql/execute-queries-b52":{"__comp":"17896441","content":"3293c63f"},"/docs/ignite3/3.1.0/sql/working-with-sql/system-views-161":{"__comp":"17896441","content":"712f9ec4"},"/docs/ignite3/3.1.0/tools-0ab":{"__comp":"17896441","content":"46d70a83"},"/docs/ignite3/3.1.0/tools/cli-commands-c40":{"__comp":"17896441","content":"f043e5a8"},"/docs/ignite3/3.1.0/tools/glossary-637":{"__comp":"17896441","content":"24058a50"},"/docs/ignite3/3.1.0/tools/rest-api-a25":{"__comp":"17896441","content":"00310d16"},"/docs/ignite3/3.1.0/understand-b21":{"__comp":"17896441","content":"5c36b491"},"/docs/ignite3/3.1.0/understand/architecture-0dc":{"__comp":"17896441","content":"18c7933a"},"/docs/ignite3/3.1.0/understand/architecture/architecture-overview-a58":{"__comp":"17896441","content":"2e4f0f2d"},"/docs/ignite3/3.1.0/understand/architecture/security-413":{"__comp":"17896441","content":"b89de411"},"/docs/ignite3/3.1.0/understand/architecture/storage-architecture-4d8":{"__comp":"17896441","content":"630993fc"},"/docs/ignite3/3.1.0/understand/architecture/storage-engines-3a0":{"__comp":"17896441","content":"d02d3d43"},"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aimem-c3c":{"__comp":"17896441","content":"cbbcdc53"},"/docs/ignite3/3.1.0/understand/architecture/storage-engines/aipersist-46f":{"__comp":"17896441","content":"994e0b8f"},"/docs/ignite3/3.1.0/understand/architecture/storage-engines/rocksdb-669":{"__comp":"17896441","content":"1bfb13ba"},"/docs/ignite3/3.1.0/understand/core-concepts-599":{"__comp":"17896441","content":"375301b3"},"/docs/ignite3/3.1.0/understand/core-concepts/compute-and-events-4c8":{"__comp":"17896441","content":"f2461985"},"/docs/ignite3/3.1.0/understand/core-concepts/data-partitioning-730":{"__comp":"17896441","content":"e6238dca"},"/docs/ignite3/3.1.0/understand/core-concepts/distribution-and-colocation-ad0":{"__comp":"17896441","content":"d5d3293e"},"/docs/ignite3/3.1.0/understand/core-concepts/tables-and-schemas-487":{"__comp":"17896441","content":"936721b0"},"/docs/ignite3/3.1.0/understand/core-concepts/transactions-and-mvcc-8ca":{"__comp":"17896441","content":"8e496006"},"/docs/ignite3/3.1.0/understand/core-concepts/what-is-ignite-710":{"__comp":"17896441","content":"ffa03752"},"/docs/ignite3/3.1.0/understand/performance-c1c":{"__comp":"17896441","content":"42f764c6"},"/docs/ignite3/3.1.0/understand/performance/explain-operators-44d":{"__comp":"17896441","content":"bc873ee7"},"/docs/ignite3/3.1.0/understand/performance/using-explain-f69":{"__comp":"17896441","content":"2e3ac162"}}')},86025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>o});var r=n(96540),i=n(44586),a=n(16654);function o(){const{siteConfig:e}=(0,i.A)(),{baseUrl:t,url:n}=e,o=e.future.experimental_router,s=(0,r.useCallback)((e,r)=>function({siteUrl:e,baseUrl:t,url:n,options:{forcePrependBaseUrl:r=!1,absolute:i=!1}={},router:o}){if(!n||n.startsWith("#")||(0,a.z)(n))return n;if("hash"===o)return n.startsWith("/")?`.${n}`:`./${n}`;if(r)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:o}),[n,t,o]);return{withBaseUrl:s}}function s(e,t={}){const{withBaseUrl:n}=o();return n(e,t)}},86841:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(53103);function i(e,t,n){const a=[];for(const o of t){const n=e.toLowerCase().indexOf(o);if(n>=0){n>0&&a.push(i(e.substr(0,n),t)),a.push(`${(0,r.Z)(e.substr(n,o.length))}`);const s=n+o.length;s${(0,r.Z)(e)}`:(0,r.Z)(e):a.join("")}},86921:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function i(e){const t={};return function e(n,i){Object.entries(n).forEach(([n,a])=>{const o=i?`${i}.${n}`:n;r(a)?e(a,o):t[o]=a})}(e),t}},89532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>o,dV:()=>l,fM:()=>u});var r=n(96540),i=n(205),a=n(74848);function o(e){const t=(0,r.useRef)(e);return(0,i.A)(()=>{t.current=e},[e]),(0,r.useCallback)((...e)=>t.current(...e),[])}function s(e){const t=(0,r.useRef)();return(0,i.A)(()=>{t.current=e}),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort((e,t)=>e[0].localeCompare(t[0])),(0,r.useMemo)(()=>e,t.flat())}function u(e){return({children:t})=>(0,a.jsx)(a.Fragment,{children:e.reduceRight((e,t)=>(0,a.jsx)(t,{children:e}),t)})}},92303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(96540),i=n(6125);function a(){return(0,r.useContext)(i.o)}},95293:(e,t,n)=>{"use strict";n.d(t,{G:()=>S,a:()=>w});var r=n(96540),i=n(92303),a=n(89532),o=n(70679),s=n(6342),l=n(74848);function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function u(e){return function(e,t){const n=window.matchMedia(e);return n.addEventListener("change",t),()=>n.removeEventListener("change",t)}("(prefers-color-scheme: dark)",()=>e(c()))}const d=r.createContext(void 0),p=(0,o.Wf)("theme"),f="system",g=e=>"dark"===e?"dark":"light",h=e=>null===e||e===f?null:g(e),m={get:()=>g(document.documentElement.getAttribute("data-theme")),set:e=>{document.documentElement.setAttribute("data-theme",g(e))}},b={get:()=>h(document.documentElement.getAttribute("data-theme-choice")),set:e=>{document.documentElement.setAttribute("data-theme-choice",h(e)??f)}},y=e=>{null===e?p.del():p.set(g(e))};function v(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),{colorMode:a,setColorModeState:o,colorModeChoice:l,setColorModeChoiceState:d}=function(){const{colorMode:{defaultMode:e}}=(0,s.p)(),t=(0,i.A)(),[n,a]=(0,r.useState)(t?m.get():e),[o,l]=(0,r.useState)(t?b.get():null);return(0,r.useEffect)(()=>{a(m.get()),l(b.get())},[]),{colorMode:n,setColorModeState:a,colorModeChoice:o,setColorModeChoiceState:l}}();(0,r.useEffect)(()=>{t&&p.del()},[t]);const f=(0,r.useCallback)((t,r={})=>{const{persist:i=!0}=r;if(null===t){const t=n?c():e;m.set(t),o(t),b.set(null),d(null)}else m.set(t),b.set(t),o(t),d(t);i&&y(t)},[o,d,n,e]);return(0,r.useEffect)(()=>p.listen(e=>{f(h(e.newValue))}),[f]),(0,r.useEffect)(()=>{if(null===l&&n)return u(e=>{o(e),m.set(e)})},[n,l,o]),(0,r.useMemo)(()=>({colorMode:a,colorModeChoice:l,setColorMode:f,get isDarkTheme(){return"dark"===a},setLightTheme(){f("light")},setDarkTheme(){f("dark")}}),[a,l,f])}function w({children:e}){const t=v();return(0,l.jsx)(d.Provider,{value:t,children:e})}function S(){const e=(0,r.useContext)(d);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},96540:(e,t,n)=>{"use strict";e.exports=n(29869)},96966:()=>{Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}},96976:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},98587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==t.indexOf(r))continue;n[r]=e[r]}return n}n.d(t,{A:()=>r})},99169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>o});var r=n(96540),i=n(35947),a=n(44586);function o(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)(()=>function({baseUrl:e,routes:t}){function n(t){return t.path===e&&!0===t.exact}function r(t){return t.path===e&&!t.exact}return function e(t){if(0===t.length)return;return t.find(n)||e(t.filter(r).flatMap(e=>e.routes??[]))}(t)}({routes:i.A,baseUrl:e}),[e])}}},e=>{e.O(0,[1869],()=>{return t=78600,e(e.s=t);var t});e.O()}]); \ No newline at end of file diff --git a/docs/ignite3/assets/js/main.189970e9.js.LICENSE.txt b/docs/ignite3/assets/js/main.189970e9.js.LICENSE.txt deleted file mode 100644 index a47a1617f8..0000000000 --- a/docs/ignite3/assets/js/main.189970e9.js.LICENSE.txt +++ /dev/null @@ -1,136 +0,0 @@ -/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress - * @license MIT */ - -/*! - * lunr.Builder - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.Set - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.TokenSet - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.Vector - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.stemmer - * Copyright (C) 2020 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - */ - -/*! - * lunr.stopWordFilter - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.tokenizer - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.trimmer - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - */ - -/*!*************************************************** -* mark.js v8.11.1 -* https://markjs.io/ -* Copyright (c) 2014–2018, Julian Kühnel -* Released under the MIT license https://git.io/vwTVl -*****************************************************/ - -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @license React - * react-dom-client.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * @license React - * react-dom.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * @license React - * scheduler.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - */ - -/** @license React v16.13.1 - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ diff --git a/docs/ignite3/assets/js/runtime~main.4360c1c4.js b/docs/ignite3/assets/js/runtime~main.4360c1c4.js deleted file mode 100644 index f03140584c..0000000000 --- a/docs/ignite3/assets/js/runtime~main.4360c1c4.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,a,f,d,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={exports:{}};return b[e].call(f.exports,f,f.exports,r),f.exports}r.m=b,e=[],r.O=(a,f,d,c)=>{if(!f){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every(e=>r.O[e](f[o]))?f.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[f,d,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;("object"==typeof t||"function"==typeof t)&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach(a=>b[a]=()=>e[a]);return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((a,f)=>(r.f[f](e,a),a),[])),r.u=e=>"assets/js/"+({9:"7ea0a1cf",19:"14ca7f3e",67:"f7a2bd99",131:"6e1e49fb",148:"2dd8807d",167:"77a23d4b",179:"936721b0",180:"f522cffe",186:"eff8d8a9",202:"f0a4d6aa",213:"83719db0",270:"c4101606",295:"25653805",308:"4edc808e",325:"88642a14",398:"630993fc",404:"3293c63f",505:"01a4d6cc",543:"f9e4bc23",545:"fd10d9c3",581:"69dbdcb6",607:"cf4f3c50",666:"2f89ca13",673:"1b5d77aa",675:"fcc8bf93",720:"01605f1b",746:"00310d16",748:"6d14130f",797:"dcbc23ab",960:"14965a6a",965:"1d166f75",975:"485437b7",1019:"f043e5a8",1029:"c0475018",1079:"24d94e02",1175:"8e496006",1188:"df80b230",1232:"994e0b8f",1235:"a7456010",1326:"430edd65",1411:"a734c28f",1516:"cd6ed4c4",1590:"2abe8a17",1597:"eb76c95c",1605:"e4ab0479",1665:"bcb7ad38",1752:"dd1a5b79",1785:"407a0507",1804:"689fd026",1824:"148ac273",1926:"254bafb3",1929:"4fffa35c",1965:"b1ab1304",1986:"d902eba8",2035:"0eb0485d",2108:"6d99e875",2138:"1a4e3797",2209:"e0d8b5f8",2233:"6686d628",2252:"5152a8e0",2265:"7faacd1a",2272:"a4bdb400",2276:"32c93f0c",2313:"e30f13ec",2329:"4f4c954e",2355:"967c1bfd",2418:"f2461985",2445:"071c34d4",2446:"24058a50",2521:"c2c5a8d2",2527:"9a925e23",2561:"6dfec84f",2569:"60b12218",2645:"a150ce1d",2758:"796ebb42",2808:"5745cf5f",2846:"25efb993",2881:"42222ea0",2919:"dd4c3c7d",3001:"0c117f5c",3039:"d95c5914",3092:"59074688",3124:"46d70a83",3126:"a06ae79b",3144:"654e3e67",3149:"ee8364d1",3164:"8f944727",3173:"696e0280",3187:"86fea04b",3280:"2e3ac162",3309:"2c69403e",3346:"42f764c6",3425:"6861f3ae",3433:"56216d1a",3500:"fddde30a",3517:"8d621382",3574:"fb00ac63",3614:"6cc25ccb",3821:"1aa4865b",3837:"f6ab33a6",3908:"76682ea2",3928:"dad9a2fd",4005:"7a459efc",4007:"1ffcbc41",4026:"0e52afe7",4091:"61eaa059",4182:"19ff637c",4324:"588bd741",4383:"6ff241e2",4393:"ac3be0c3",4414:"a1b4f2ab",4430:"c6f94207",4443:"e6238dca",4518:"9bbb96d9",4581:"9af10537",4583:"1df93b7f",4595:"54b9d659",4641:"5d2daac0",4690:"ea9d2f00",4695:"56998700",4734:"cb32231c",4738:"38c4fee5",4766:"2e631686",4821:"948ed64f",4889:"29e18771",4921:"138e0e15",5024:"e288cdcf",5083:"66b63dfc",5190:"b1ef1c36",5194:"bf32d4f4",5262:"b0221735",5291:"68533010",5318:"c851e8ef",5348:"5c36b491",5373:"9ac7fe78",5405:"7a0d0e36",5423:"0ea0f99b",5448:"8f9fabaf",5460:"4c300737",5472:"712f9ec4",5558:"c98fd205",5606:"2e4f0f2d",5641:"ee0a6a95",5687:"f99b384c",5742:"aba21aa0",5853:"bfca4c52",5859:"91920555",6007:"b96d81e3",6064:"0b3cdf12",6129:"5bd6484a",6147:"55bb5782",6193:"be3682b6",6210:"9185a77c",6299:"ffa03752",6324:"5ba93427",6334:"2b2b4e7a",6346:"6b7ab3e3",6387:"264dac2b",6391:"555c49dc",6459:"46a2bd78",6527:"ede2c0d3",6534:"c5beb181",6537:"d2778e29",6567:"3cf17eef",6626:"18c7933a",6647:"3f98ac4d",6667:"c564e63a",6695:"b89de411",6717:"0f12c4b6",6728:"a6ff32af",6755:"8826f367",6824:"6449194f",6855:"73aef688",6861:"b9041da1",6874:"a3771ee6",6891:"6453b56c",6922:"52ea876c",6927:"16d50cfe",6946:"1c5cff81",6987:"cb5d1ef8",7076:"70598898",7098:"a7bd4aaa",7164:"cfa06b25",7313:"0d1c3a24",7360:"b01f8e23",7363:"c96ce734",7366:"6dd34219",7419:"24239f0f",7505:"b99fd215",7511:"ddb6bda5",7543:"1f9d746e",7577:"da66ee89",7607:"8f4c7ad5",7639:"d02d3d43",7687:"31fb6dea",7889:"20e3d2e5",7901:"6105dffd",8054:"04b7cdab",8075:"714f451d",8125:"f9e65627",8134:"6ce9454c",8178:"840d3d48",8201:"01966bdf",8275:"66cd9110",8345:"cfc81aaa",8351:"e910cb7c",8362:"5ced4073",8392:"86aa3622",8401:"17896441",8424:"0dba3038",8494:"8452ee8f",8498:"c196937a",8610:"69bfbf1a",8622:"2e7ecfd5",8653:"1bfb13ba",8688:"f838f9b1",8695:"bb56423f",8723:"0ed4f4b9",8767:"4643c4f2",8772:"6b5309c4",8865:"375301b3",8918:"b7991eff",8943:"c9838793",8983:"15d99295",9042:"aa014cab",9048:"a94703ab",9189:"aab940e4",9196:"51b5f6a1",9239:"39417523",9242:"cbbcdc53",9289:"aea2f960",9298:"d5d3293e",9305:"bc873ee7",9399:"7bd5cb78",9435:"fe1d83c2",9459:"90a0f442",9496:"1c440c53",9568:"390e6ec8",9589:"10d5c8a2",9647:"5e95c892",9655:"31dfd8c3",9665:"d7a33538",9759:"29562505",9768:"ad0d46b8",9883:"e6e12c77",9901:"4436c0ec"}[e]||e)+"."+{9:"fe11d1c4",19:"d4579383",67:"c60ac965",131:"1d5ea727",148:"10f9913f",165:"fff4bec1",167:"fc47d9d0",179:"9816993c",180:"aa74041b",186:"a0964b93",202:"cab1e361",213:"f2af8bcc",270:"aca8d35b",291:"a9d16ea0",295:"dbeadb34",308:"44fdcf04",325:"9fffa0ca",398:"fec91443",404:"cfba7f5e",489:"c6a2a19d",505:"5fce4382",543:"d4d62491",545:"5d6d9d7f",581:"5d839540",607:"692892a0",617:"6d001882",666:"e2eed46d",673:"875e262c",675:"d2ca1d25",720:"5cdc9d7f",746:"657729fb",748:"a1e2cabf",797:"468aa6c2",960:"3e457c4c",965:"09cb10d9",975:"6f0f74de",1e3:"56fb64de",1019:"2ce62d2b",1029:"f1ed6d03",1079:"71076815",1175:"2170c59f",1188:"c282501d",1203:"e2b2e42b",1232:"d38139f0",1235:"1ed48990",1326:"cecc5225",1411:"bd12a443",1516:"4b3e55a5",1590:"6e8be02a",1597:"3897385f",1605:"565582b8",1665:"22a77969",1741:"d5346cea",1746:"99717298",1752:"39fe198c",1785:"aa2fdacf",1804:"91f08851",1824:"faf51ddf",1926:"5367736b",1929:"e2bec440",1965:"071208fe",1986:"26425124",2035:"0dd9ee5c",2108:"5cb33887",2130:"dc8e26e2",2138:"f8d42177",2209:"c4d1b12f",2233:"4981666f",2237:"8e54009b",2252:"5e3193d6",2265:"3a176262",2272:"55257d50",2276:"e7550de4",2279:"9f4f9e3f",2291:"51f206bb",2313:"aaebf2c7",2325:"8d5ea408",2329:"1c1bc021",2334:"1d81fc96",2355:"113deaa7",2418:"d7dd98dc",2445:"1660ba59",2446:"7cbc7b7d",2521:"6be2a0c4",2527:"c8e1a236",2561:"ca7212ec",2569:"1c0eb269",2645:"e107ce06",2758:"3a1e0859",2808:"077c7aea",2821:"bd5e7898",2846:"08deb671",2881:"16593ddd",2919:"ab668eea",3001:"875a865a",3039:"f2adaf2f",3092:"f156df34",3124:"0aad90ab",3126:"e556161c",3144:"ccbfafe1",3149:"3d752467",3164:"ca012add",3173:"b2aed5b1",3187:"2a7ac518",3280:"b259df81",3309:"cb893cf4",3346:"c5b390c3",3425:"34cb2dcf",3433:"b80bcfb6",3488:"5b9d1a9b",3490:"24067e8b",3500:"ff2997da",3517:"def80860",3574:"44cf6122",3614:"988e4a2c",3624:"a86e154a",3815:"b4a66086",3821:"f2ef20e6",3837:"cb490e08",3908:"45850241",3928:"e4119e3e",4005:"df153344",4007:"03cf6d95",4026:"6e26a64f",4091:"7c0fe16f",4182:"c2caaa65",4250:"57b5d622",4324:"ebb0b23f",4379:"1f436998",4383:"1557af70",4393:"a1af6199",4414:"ba1878a3",4430:"a6c30d83",4443:"29038b27",4518:"fd76e4c3",4581:"07a37069",4583:"ff8acf91",4595:"2476cb2e",4616:"78241031",4641:"55498b05",4690:"8641ca4b",4695:"6663e703",4734:"0f91af19",4738:"cb640014",4766:"c2a58dfc",4802:"58e42687",4809:"c9ea89c3",4821:"2804041f",4889:"68a34d71",4921:"8f77a57c",4981:"c23e10bb",5024:"b9f473c3",5083:"26600d95",5190:"6202244d",5194:"8267204e",5262:"bcac1d8a",5291:"cbba2513",5318:"ddc8e531",5348:"48cc296e",5373:"549f81d6",5405:"7b6e91b4",5423:"0e0d523d",5448:"37d12b3b",5460:"cd830652",5472:"da4cbdad",5480:"1166b1c8",5558:"7a150089",5595:"b6aa6a0b",5606:"7a87b667",5641:"2848d885",5687:"d83d49ad",5741:"7dda7174",5742:"05e67f11",5853:"8a1266bb",5859:"5c84e5e0",5901:"c47593aa",5955:"b054da40",5996:"9587e8ec",6007:"182ccbcf",6064:"493963ba",6129:"81bcd26f",6147:"277f34db",6193:"94c0bcbc",6210:"4330d176",6241:"864875ca",6299:"f27940fe",6319:"ffb5978b",6324:"8990d848",6334:"4b4e7b0e",6346:"34f748c3",6366:"ba8977a9",6387:"9cbca246",6391:"36690bfd",6459:"b1b37c48",6527:"a87c16c3",6534:"1946bd17",6537:"9a667de9",6567:"ea2e6002",6626:"9805f683",6647:"c4abe492",6667:"0fc94840",6695:"c5b1cec5",6717:"a2cea451",6728:"f2ce670d",6755:"3c8ad808",6824:"e36caf49",6855:"15e5a91a",6861:"fa08d7d0",6874:"a654e4cc",6891:"98e7cfdc",6922:"9af03ca1",6927:"8faa975a",6946:"7127c5f6",6987:"bb7711ee",6992:"37b245bf",7076:"c51cb51a",7098:"aeac2f42",7164:"bac15879",7313:"95af2c1a",7360:"6cc26a00",7363:"26e0b28f",7366:"832988e0",7419:"4e374171",7505:"800913a9",7511:"465f5089",7543:"00d18d54",7577:"f2ee4653",7592:"4d1daf60",7607:"b389d27c",7639:"7d8b8588",7687:"b944b1c2",7873:"a2d28d16",7889:"0b8dd3dc",7901:"26b1ce9a",7928:"805b7ce3",8054:"a8fc4450",8075:"75a7e814",8125:"4a4cba79",8134:"d3590cf7",8142:"fb719a93",8178:"96cff181",8201:"ad726cca",8249:"be7938da",8275:"b71aa02d",8345:"f71159d5",8351:"05e3bbd2",8362:"f9210559",8392:"8db1d0fc",8401:"5063c53b",8424:"0883f0ee",8494:"ead1f14d",8498:"4151a0e4",8610:"12120269",8622:"a577206d",8653:"3686dc10",8688:"e383cfeb",8695:"cc106303",8723:"be8267e7",8731:"a16ce170",8756:"f63e2499",8767:"92888adf",8772:"6ab228f7",8865:"07a6ee8b",8918:"d06db60d",8943:"52a208ba",8948:"1390d1b6",8983:"86e6461a",9032:"011112a4",9042:"b00631e6",9048:"25e8b3aa",9189:"019936bb",9196:"38609390",9239:"66cb1dde",9242:"fe33193e",9289:"1d15029d",9298:"cc836f76",9305:"7113f028",9399:"78a0588f",9412:"4a445ad3",9435:"de3189ac",9459:"bb76f16b",9496:"01f48e3a",9510:"7610b91c",9568:"159cb972",9589:"10332024",9647:"a55dc93c",9655:"e394cf0c",9665:"a22c084a",9717:"86769863",9759:"a45b3759",9768:"a515ac11",9883:"8801b6fc",9901:"715d7aa2"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},c="docs:",r.l=(e,a,f,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach(e=>e(f)),a)return a(f)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/docs/ignite3/",r.gca=function(e){return e={17896441:"8401",25653805:"295",29562505:"9759",39417523:"9239",56998700:"4695",59074688:"3092",68533010:"5291",70598898:"7076",91920555:"5859","7ea0a1cf":"9","14ca7f3e":"19",f7a2bd99:"67","6e1e49fb":"131","2dd8807d":"148","77a23d4b":"167","936721b0":"179",f522cffe:"180",eff8d8a9:"186",f0a4d6aa:"202","83719db0":"213",c4101606:"270","4edc808e":"308","88642a14":"325","630993fc":"398","3293c63f":"404","01a4d6cc":"505",f9e4bc23:"543",fd10d9c3:"545","69dbdcb6":"581",cf4f3c50:"607","2f89ca13":"666","1b5d77aa":"673",fcc8bf93:"675","01605f1b":"720","00310d16":"746","6d14130f":"748",dcbc23ab:"797","14965a6a":"960","1d166f75":"965","485437b7":"975",f043e5a8:"1019",c0475018:"1029","24d94e02":"1079","8e496006":"1175",df80b230:"1188","994e0b8f":"1232",a7456010:"1235","430edd65":"1326",a734c28f:"1411",cd6ed4c4:"1516","2abe8a17":"1590",eb76c95c:"1597",e4ab0479:"1605",bcb7ad38:"1665",dd1a5b79:"1752","407a0507":"1785","689fd026":"1804","148ac273":"1824","254bafb3":"1926","4fffa35c":"1929",b1ab1304:"1965",d902eba8:"1986","0eb0485d":"2035","6d99e875":"2108","1a4e3797":"2138",e0d8b5f8:"2209","6686d628":"2233","5152a8e0":"2252","7faacd1a":"2265",a4bdb400:"2272","32c93f0c":"2276",e30f13ec:"2313","4f4c954e":"2329","967c1bfd":"2355",f2461985:"2418","071c34d4":"2445","24058a50":"2446",c2c5a8d2:"2521","9a925e23":"2527","6dfec84f":"2561","60b12218":"2569",a150ce1d:"2645","796ebb42":"2758","5745cf5f":"2808","25efb993":"2846","42222ea0":"2881",dd4c3c7d:"2919","0c117f5c":"3001",d95c5914:"3039","46d70a83":"3124",a06ae79b:"3126","654e3e67":"3144",ee8364d1:"3149","8f944727":"3164","696e0280":"3173","86fea04b":"3187","2e3ac162":"3280","2c69403e":"3309","42f764c6":"3346","6861f3ae":"3425","56216d1a":"3433",fddde30a:"3500","8d621382":"3517",fb00ac63:"3574","6cc25ccb":"3614","1aa4865b":"3821",f6ab33a6:"3837","76682ea2":"3908",dad9a2fd:"3928","7a459efc":"4005","1ffcbc41":"4007","0e52afe7":"4026","61eaa059":"4091","19ff637c":"4182","588bd741":"4324","6ff241e2":"4383",ac3be0c3:"4393",a1b4f2ab:"4414",c6f94207:"4430",e6238dca:"4443","9bbb96d9":"4518","9af10537":"4581","1df93b7f":"4583","54b9d659":"4595","5d2daac0":"4641",ea9d2f00:"4690",cb32231c:"4734","38c4fee5":"4738","2e631686":"4766","948ed64f":"4821","29e18771":"4889","138e0e15":"4921",e288cdcf:"5024","66b63dfc":"5083",b1ef1c36:"5190",bf32d4f4:"5194",b0221735:"5262",c851e8ef:"5318","5c36b491":"5348","9ac7fe78":"5373","7a0d0e36":"5405","0ea0f99b":"5423","8f9fabaf":"5448","4c300737":"5460","712f9ec4":"5472",c98fd205:"5558","2e4f0f2d":"5606",ee0a6a95:"5641",f99b384c:"5687",aba21aa0:"5742",bfca4c52:"5853",b96d81e3:"6007","0b3cdf12":"6064","5bd6484a":"6129","55bb5782":"6147",be3682b6:"6193","9185a77c":"6210",ffa03752:"6299","5ba93427":"6324","2b2b4e7a":"6334","6b7ab3e3":"6346","264dac2b":"6387","555c49dc":"6391","46a2bd78":"6459",ede2c0d3:"6527",c5beb181:"6534",d2778e29:"6537","3cf17eef":"6567","18c7933a":"6626","3f98ac4d":"6647",c564e63a:"6667",b89de411:"6695","0f12c4b6":"6717",a6ff32af:"6728","8826f367":"6755","6449194f":"6824","73aef688":"6855",b9041da1:"6861",a3771ee6:"6874","6453b56c":"6891","52ea876c":"6922","16d50cfe":"6927","1c5cff81":"6946",cb5d1ef8:"6987",a7bd4aaa:"7098",cfa06b25:"7164","0d1c3a24":"7313",b01f8e23:"7360",c96ce734:"7363","6dd34219":"7366","24239f0f":"7419",b99fd215:"7505",ddb6bda5:"7511","1f9d746e":"7543",da66ee89:"7577","8f4c7ad5":"7607",d02d3d43:"7639","31fb6dea":"7687","20e3d2e5":"7889","6105dffd":"7901","04b7cdab":"8054","714f451d":"8075",f9e65627:"8125","6ce9454c":"8134","840d3d48":"8178","01966bdf":"8201","66cd9110":"8275",cfc81aaa:"8345",e910cb7c:"8351","5ced4073":"8362","86aa3622":"8392","0dba3038":"8424","8452ee8f":"8494",c196937a:"8498","69bfbf1a":"8610","2e7ecfd5":"8622","1bfb13ba":"8653",f838f9b1:"8688",bb56423f:"8695","0ed4f4b9":"8723","4643c4f2":"8767","6b5309c4":"8772","375301b3":"8865",b7991eff:"8918",c9838793:"8943","15d99295":"8983",aa014cab:"9042",a94703ab:"9048",aab940e4:"9189","51b5f6a1":"9196",cbbcdc53:"9242",aea2f960:"9289",d5d3293e:"9298",bc873ee7:"9305","7bd5cb78":"9399",fe1d83c2:"9435","90a0f442":"9459","1c440c53":"9496","390e6ec8":"9568","10d5c8a2":"9589","5e95c892":"9647","31dfd8c3":"9655",d7a33538:"9665",ad0d46b8:"9768",e6e12c77:"9883","4436c0ec":"9901"}[e]||e,r.p+r.u(e)},(()=>{r.b="undefined"!=typeof document&&document.baseURI||self.location.href;var e={5354:0,1869:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise((f,c)=>d=e[a]=[f,c]);f.push(d[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var c=f&&("load"===f.type?"missing":f.type),b=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,d[1](t)}},"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,c,[b,t,o]=f,n=0;if(b.some(a=>0!==e[a])){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n Apache Ignite 3 Documentation - - + + diff --git a/docs/ignite3/search.html b/docs/ignite3/search.html index e64bd8841a..42368476f0 100644 --- a/docs/ignite3/search.html +++ b/docs/ignite3/search.html @@ -4,8 +4,8 @@ Search the documentation - - + +