From 00093c561c19fc65d3b751c758a043b1f47429c9 Mon Sep 17 00:00:00 2001 From: Evgeniy Kuvardin Date: Sat, 24 May 2025 20:37:28 +0300 Subject: [PATCH 1/4] Create classes of table options description --- .../src/main/java/tech/ydb/table/Session.java | 8 + .../description/TableOptionDescription.java | 412 ++++++++++++++++++ .../java/tech/ydb/table/impl/BaseSession.java | 88 ++++ .../java/tech/ydb/table/rpc/TableRpc.java | 10 + .../tech/ydb/table/rpc/grpc/GrpcTableRpc.java | 10 + .../DescribeTableOptionsSettings.java | 8 + 6 files changed, 536 insertions(+) create mode 100644 table/src/main/java/tech/ydb/table/description/TableOptionDescription.java create mode 100644 table/src/main/java/tech/ydb/table/settings/DescribeTableOptionsSettings.java diff --git a/table/src/main/java/tech/ydb/table/Session.java b/table/src/main/java/tech/ydb/table/Session.java index 50fdf56bb..83c20bc16 100644 --- a/table/src/main/java/tech/ydb/table/Session.java +++ b/table/src/main/java/tech/ydb/table/Session.java @@ -11,6 +11,7 @@ import tech.ydb.core.grpc.GrpcReadStream; import tech.ydb.core.impl.call.ProxyReadStream; import tech.ydb.table.description.TableDescription; +import tech.ydb.table.description.TableOptionDescription; import tech.ydb.table.query.DataQuery; import tech.ydb.table.query.DataQueryResult; import tech.ydb.table.query.ExplainDataQueryResult; @@ -25,6 +26,7 @@ import tech.ydb.table.settings.CopyTableSettings; import tech.ydb.table.settings.CopyTablesSettings; import tech.ydb.table.settings.CreateTableSettings; +import tech.ydb.table.settings.DescribeTableOptionsSettings; import tech.ydb.table.settings.DescribeTableSettings; import tech.ydb.table.settings.DropTableSettings; import tech.ydb.table.settings.ExecuteDataQuerySettings; @@ -88,6 +90,8 @@ CompletableFuture> executeDataQuery( CompletableFuture> explainDataQuery(String query, ExplainDataQuerySettings settings); + CompletableFuture> describeTableOptions(DescribeTableOptionsSettings settings); + /** * Consider using {@link Session#beginTransaction(TxMode, BeginTxSettings)} instead */ @@ -222,6 +226,10 @@ default CompletableFuture executeBulkUpsert(String tablePath, ListValue return executeBulkUpsert(tablePath, rows, new BulkUpsertSettings()); } + default CompletableFuture> describeTableOptions() { + return describeTableOptions(new DescribeTableOptionsSettings()); + } + default CompletableFuture> keepAlive() { return keepAlive(new KeepAliveSessionSettings()); } diff --git a/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java b/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java new file mode 100644 index 000000000..68e1c4a48 --- /dev/null +++ b/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java @@ -0,0 +1,412 @@ +package tech.ydb.table.description; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TableOptionDescription { + + private final List tableProfileDescriptions; + private final List storagePolicyPresets; + private final List compactionPolicyPresets; + private final List partitioningPolicyPresets; + private final List executionPolicyPresets; + private final List replicationPolicyPresets; + private final List cachingPolicyPresets; + + public TableOptionDescription(Builder builder) { + this.tableProfileDescriptions = builder.tableProfileDescriptions; + this.storagePolicyPresets = builder.storagePolicyPresets; + this.compactionPolicyPresets = builder.compactionPolicyPresets; + this.partitioningPolicyPresets = builder.partitioningPolicyPresets; + this.executionPolicyPresets = builder.executionPolicyPresets; + this.replicationPolicyPresets = builder.replicationPolicyPresets; + this.cachingPolicyPresets = builder.cachingPolicyPresets; + } + + public static TableOptionDescription.Builder newBuilder() { + return new TableOptionDescription.Builder(); + } + + public List getTableProfileDescriptions() { + return tableProfileDescriptions; + } + + public List getStoragePolicyPresets() { + return storagePolicyPresets; + } + + public List getCompactionPolicyPresets() { + return compactionPolicyPresets; + } + + public List getPartitioningPolicyPresets() { + return partitioningPolicyPresets; + } + + public List getExecutionPolicyPresets() { + return executionPolicyPresets; + } + + public List getReplicationPolicyPresets() { + return replicationPolicyPresets; + } + + public List getCachingPolicyPresets() { + return cachingPolicyPresets; + } + + public static class Builder { + private List tableProfileDescriptions; + private List storagePolicyPresets; + private List compactionPolicyPresets; + private List partitioningPolicyPresets; + private List executionPolicyPresets; + private List replicationPolicyPresets; + private List cachingPolicyPresets; + + public List getTableProfileDescriptions() { + return tableProfileDescriptions; + } + + public void setTableProfileDescriptions(ArrayList tableProfileDescriptions) { + this.tableProfileDescriptions = tableProfileDescriptions; + } + + public List getStoragePolicyPresets() { + return storagePolicyPresets; + } + + public void setStoragePolicyPresets(List storagePolicyPresets) { + this.storagePolicyPresets = storagePolicyPresets; + } + + public List getCompactionPolicyPresets() { + return compactionPolicyPresets; + } + + public void setCompactionPolicyPresets(List compactionPolicyPresets) { + this.compactionPolicyPresets = compactionPolicyPresets; + } + + public List getPartitioningPolicyPresets() { + return partitioningPolicyPresets; + } + + public void setPartitioningPolicyPresets(List partitioningPolicyPresets) { + this.partitioningPolicyPresets = partitioningPolicyPresets; + } + + public List getExecutionPolicyPresets() { + return executionPolicyPresets; + } + + public void setExecutionPolicyPresets(List executionPolicyPresets) { + this.executionPolicyPresets = executionPolicyPresets; + } + + public List getReplicationPolicyPresets() { + return replicationPolicyPresets; + } + + public void setReplicationPolicyPresets(List replicationPolicyPresets) { + this.replicationPolicyPresets = replicationPolicyPresets; + } + + public List getCachingPolicyPresets() { + return cachingPolicyPresets; + } + + public void setCachingPolicyPresets(List cachingPolicyPresets) { + this.cachingPolicyPresets = cachingPolicyPresets; + } + } + + public static class TableProfileDescription { + private final String name; + private final Map labels; + + private final String defaultStoragePolicy; + private final String defaultCompactionPolicy; + private final String defaultPartitioningPolicy; + private final String defaultExecutionPolicy; + private final String defaultReplicationPolicy; + private final String defaultCachingPolicy; + + private final List allowedStoragePolicy; + private final List allowedCompactionPolicy; + private final List allowedPartitioningPolicy; + private final List allowedExecutionPolicy; + private final List allowedReplicationPolicy; + private final List allowedCachingPolicy; + + public TableProfileDescription(Builder builder) { + this.name = builder.name; + this.labels = ImmutableMap.copyOf(builder.labels); + this.defaultStoragePolicy = builder.defaultStoragePolicy; + this.defaultCompactionPolicy = builder.defaultCompactionPolicy; + this.defaultPartitioningPolicy = builder.defaultPartitioningPolicy; + this.defaultExecutionPolicy = builder.defaultExecutionPolicy; + this.defaultReplicationPolicy = builder.defaultReplicationPolicy; + this.defaultCachingPolicy = builder.defaultCachingPolicy; + + this.allowedStoragePolicy = ImmutableList.copyOf(builder.allowedStoragePolicy); + this.allowedCompactionPolicy = ImmutableList.copyOf(builder.allowedCompactionPolicy); + this.allowedPartitioningPolicy = ImmutableList.copyOf(builder.allowedPartitioningPolicy); + this.allowedExecutionPolicy = ImmutableList.copyOf(builder.allowedExecutionPolicy); + this.allowedReplicationPolicy = ImmutableList.copyOf(builder.allowedReplicationPolicy); + this.allowedCachingPolicy = ImmutableList.copyOf(builder.allowedCachingPolicy); + } + + public static TableProfileDescription.Builder newBuilder() { + return new TableProfileDescription.Builder(); + } + + public String getName() { + return name; + } + + public Map getLabels() { + return labels; + } + + public String getDefaultStoragePolicy() { + return defaultStoragePolicy; + } + + public String getDefaultCompactionPolicy() { + return defaultCompactionPolicy; + } + + public String getDefaultPartitioningPolicy() { + return defaultPartitioningPolicy; + } + + public String getDefaultExecutionPolicy() { + return defaultExecutionPolicy; + } + + public String getDefaultReplicationPolicy() { + return defaultReplicationPolicy; + } + + public String getDefaultCachingPolicy() { + return defaultCachingPolicy; + } + + public List getAllowedStoragePolicy() { + return allowedStoragePolicy; + } + + public List getAllowedCompactionPolicy() { + return allowedCompactionPolicy; + } + + public List getAllowedPartitioningPolicy() { + return allowedPartitioningPolicy; + } + + public List getAllowedExecutionPolicy() { + return allowedExecutionPolicy; + } + + public List getAllowedReplicationPolicy() { + return allowedReplicationPolicy; + } + + public List getAllowedCachingPolicy() { + return allowedCachingPolicy; + } + + public static class Builder { + String name; + Map labels; + + String defaultStoragePolicy; + String defaultCompactionPolicy; + String defaultPartitioningPolicy; + String defaultExecutionPolicy; + String defaultReplicationPolicy; + String defaultCachingPolicy; + + List allowedStoragePolicy; + List allowedCompactionPolicy; + List allowedPartitioningPolicy; + List allowedExecutionPolicy; + List allowedReplicationPolicy; + List allowedCachingPolicy; + + public TableProfileDescription build() { + return new TableProfileDescription(this); + } + + public void setName(String name) { + this.name = name; + } + + public void setLabels(Map labels) { + this.labels = labels; + } + + public void setDefaultStoragePolicy(String defaultStoragePolicy) { + this.defaultStoragePolicy = defaultStoragePolicy; + } + + public void setDefaultCompactionPolicy(String defaultCompactionPolicy) { + this.defaultCompactionPolicy = defaultCompactionPolicy; + } + + public void setDefaultPartitioningPolicy(String defaultPartitioningPolicy) { + this.defaultPartitioningPolicy = defaultPartitioningPolicy; + } + + public void setDefaultExecutionPolicy(String defaultExecutionPolicy) { + this.defaultExecutionPolicy = defaultExecutionPolicy; + } + + public void setDefaultReplicationPolicy(String defaultReplicationPolicy) { + this.defaultReplicationPolicy = defaultReplicationPolicy; + } + + public void setDefaultCachingPolicy(String defaultCachingPolicy) { + this.defaultCachingPolicy = defaultCachingPolicy; + } + + public void setAllowedStoragePolicy(List allowedStoragePolicy) { + this.allowedStoragePolicy = allowedStoragePolicy; + } + + public void setAllowedCompactionPolicy(List allowedCompactionPolicy) { + this.allowedCompactionPolicy = allowedCompactionPolicy; + } + + public void setAllowedPartitioningPolicy(List allowedPartitioningPolicy) { + this.allowedPartitioningPolicy = allowedPartitioningPolicy; + } + + public void setAllowedExecutionPolicy(List allowedExecutionPolicy) { + this.allowedExecutionPolicy = allowedExecutionPolicy; + } + + public void setAllowedReplicationPolicy(List allowedReplicationPolicy) { + this.allowedReplicationPolicy = allowedReplicationPolicy; + } + + public void setAllowedCachingPolicy(List allowedCachingPolicy) { + this.allowedCachingPolicy = allowedCachingPolicy; + } + + } + } + + public static class StoragePolicyDescription { + private final String name; + private final Map labels; + + public StoragePolicyDescription(String name, Map labels) { + this.name = name; + this.labels = labels; + } + + public String getName() { + return name; + } + + public Map getLabels() { + return labels; + } + } + + public static class CompactionPolicyDescription { + private final String name; + private final Map labels; + + public CompactionPolicyDescription(String name, Map labels) { + this.name = name; + this.labels = labels; + } + + public String getName() { + return name; + } + + public Map getLabels() { + return labels; + } + } + + public static class PartitioningPolicyDescription { + private final String name; + private final Map labels; + + public PartitioningPolicyDescription(String name, Map labels) { + this.name = name; + this.labels = labels; + } + + public String getName() { + return name; + } + + public Map getLabels() { + return labels; + } + } + + public static class ExecutionPolicyDescription { + private final String name; + private final Map labels; + + public ExecutionPolicyDescription(String name, Map labels) { + this.name = name; + this.labels = labels; + } + + public String getName() { + return name; + } + + public Map getLabels() { + return labels; + } + } + + public static class ReplicationPolicyDescription { + private final String name; + private final Map labels; + + public ReplicationPolicyDescription(String name, Map labels) { + this.name = name; + this.labels = labels; + } + + public String getName() { + return name; + } + + public Map getLabels() { + return labels; + } + } + + public static class CachingPolicyDescription { + private final String name; + private final Map labels; + + public CachingPolicyDescription(String name, Map labels) { + this.name = name; + this.labels = labels; + } + + public String getName() { + return name; + } + + public Map getLabels() { + return labels; + } + } +} diff --git a/table/src/main/java/tech/ydb/table/impl/BaseSession.java b/table/src/main/java/tech/ydb/table/impl/BaseSession.java index 37698e2af..f8ceeef11 100644 --- a/table/src/main/java/tech/ydb/table/impl/BaseSession.java +++ b/table/src/main/java/tech/ydb/table/impl/BaseSession.java @@ -4,6 +4,7 @@ import java.net.URISyntaxException; import java.time.Duration; import java.time.Instant; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -49,6 +50,7 @@ import tech.ydb.table.description.TableColumn; import tech.ydb.table.description.TableDescription; import tech.ydb.table.description.TableIndex; +import tech.ydb.table.description.TableOptionDescription; import tech.ydb.table.description.TableTtl; import tech.ydb.table.query.DataQuery; import tech.ydb.table.query.DataQueryResult; @@ -70,6 +72,7 @@ import tech.ydb.table.settings.CreateSessionSettings; import tech.ydb.table.settings.CreateTableSettings; import tech.ydb.table.settings.DeleteSessionSettings; +import tech.ydb.table.settings.DescribeTableOptionsSettings; import tech.ydb.table.settings.DescribeTableSettings; import tech.ydb.table.settings.DropTableSettings; import tech.ydb.table.settings.ExecuteDataQuerySettings; @@ -665,6 +668,18 @@ public CompletableFuture> describeTable(String path, De .thenApply(res -> mapDescribeTable(res, settings)); } + @Override + public CompletableFuture> describeTableOptions(DescribeTableOptionsSettings settings) { + YdbTable.DescribeTableOptionsRequest request = YdbTable.DescribeTableOptionsRequest.newBuilder() + .setOperationParams(Operation.buildParams(settings.toOperationSettings())) + .build(); + + String traceId = getTraceIdOrGenerateNew(settings.getTraceId()); + final GrpcRequestSettings grpcRequestSettings = makeGrpcRequestSettings(settings.getTimeoutDuration(), traceId); + return tableRpc.describeTableOptions(request, grpcRequestSettings) + .thenApply(BaseSession::mapDescribeTableOptions); + } + private static TableTtl mapTtlSettings(YdbTable.TtlSettings ttl) { switch (ttl.getModeCase()) { case DATE_TYPE_COLUMN: @@ -898,6 +913,79 @@ private static YdbTable.TransactionSettings txSettings(Transaction.Mode transact return settings.build(); } + private static Result mapDescribeTableOptions(Result describeTableOptionsResult) { + if (!describeTableOptionsResult.isSuccess()) { + return describeTableOptionsResult.map(null); + } + + YdbTable.DescribeTableOptionsResult describeResult = describeTableOptionsResult.getValue(); + + TableOptionDescription.Builder builder = TableOptionDescription.newBuilder(); + + builder.setTableProfileDescriptions(new ArrayList<>()); + for (YdbTable.TableProfileDescription tableProfileDescription : describeResult.getTableProfilePresetsList()) { + TableOptionDescription.TableProfileDescription.Builder descBuilder = TableOptionDescription.TableProfileDescription.newBuilder(); + descBuilder.setName(tableProfileDescription.getName()); + descBuilder.setLabels(tableProfileDescription.getLabelsMap()); + + descBuilder.setDefaultStoragePolicy(tableProfileDescription.getDefaultStoragePolicy()); + descBuilder.setDefaultCompactionPolicy(tableProfileDescription.getDefaultCompactionPolicy()); + descBuilder.setDefaultPartitioningPolicy(tableProfileDescription.getDefaultPartitioningPolicy()); + descBuilder.setDefaultExecutionPolicy(tableProfileDescription.getDefaultExecutionPolicy()); + descBuilder.setDefaultReplicationPolicy(tableProfileDescription.getDefaultReplicationPolicy()); + descBuilder.setDefaultCachingPolicy(tableProfileDescription.getDefaultCachingPolicy()); + + descBuilder.setAllowedStoragePolicy(tableProfileDescription.getAllowedStoragePoliciesList()); + descBuilder.setAllowedCompactionPolicy(tableProfileDescription.getAllowedCompactionPoliciesList()); + descBuilder.setAllowedPartitioningPolicy(tableProfileDescription.getAllowedPartitioningPoliciesList()); + descBuilder.setAllowedExecutionPolicy(tableProfileDescription.getAllowedExecutionPoliciesList()); + descBuilder.setAllowedReplicationPolicy(tableProfileDescription.getAllowedReplicationPoliciesList()); + descBuilder.setAllowedCachingPolicy(tableProfileDescription.getAllowedCachingPoliciesList()); + + TableOptionDescription.TableProfileDescription description = new TableOptionDescription.TableProfileDescription(descBuilder); + builder.getTableProfileDescriptions().add(description); + } + + List storagePolicyDescription = new ArrayList<>(); + builder.setStoragePolicyPresets(storagePolicyDescription); + for (YdbTable.StoragePolicyDescription iter : describeResult.getStoragePolicyPresetsList()) { + storagePolicyDescription.add(new TableOptionDescription.StoragePolicyDescription(iter.getName(), iter.getLabelsMap())); + } + + List compactionPolicyDescription = new ArrayList<>(); + builder.setCompactionPolicyPresets(compactionPolicyDescription); + for (YdbTable.CompactionPolicyDescription iter : describeResult.getCompactionPolicyPresetsList()) { + compactionPolicyDescription.add(new TableOptionDescription.CompactionPolicyDescription(iter.getName(), iter.getLabelsMap())); + } + + List partitioningPolicyPresets = new ArrayList<>(); + builder.setPartitioningPolicyPresets(partitioningPolicyPresets); + for (YdbTable.PartitioningPolicyDescription iter : describeResult.getPartitioningPolicyPresetsList()) { + partitioningPolicyPresets.add(new TableOptionDescription.PartitioningPolicyDescription(iter.getName(), iter.getLabelsMap())); + } + + List executionPolicyDescriptions = new ArrayList<>(); + builder.setExecutionPolicyPresets(executionPolicyDescriptions); + for (YdbTable.ExecutionPolicyDescription iter : describeResult.getExecutionPolicyPresetsList()) { + executionPolicyDescriptions.add(new TableOptionDescription.ExecutionPolicyDescription(iter.getName(), iter.getLabelsMap())); + } + + List replicationPolicyPresets = new ArrayList<>(); + builder.setReplicationPolicyPresets(replicationPolicyPresets); + for (YdbTable.ReplicationPolicyDescription iter : describeResult.getReplicationPolicyPresetsList()) { + replicationPolicyPresets.add(new TableOptionDescription.ReplicationPolicyDescription(iter.getName(), iter.getLabelsMap())); + } + + List cachingPolicyPresets = new ArrayList<>(); + builder.setCachingPolicyPresets(cachingPolicyPresets); + for (YdbTable.CachingPolicyDescription iter : describeResult.getCachingPolicyPresetsList()) { + cachingPolicyPresets.add(new TableOptionDescription.CachingPolicyDescription(iter.getName(), iter.getLabelsMap())); + } + + return Result.success(new TableOptionDescription(builder)); + } + + protected CompletableFuture> executeDataQueryInternal( String query, YdbTable.TransactionControl txControl, Params params, ExecuteDataQuerySettings settings) { YdbTable.ExecuteDataQueryRequest.Builder request = YdbTable.ExecuteDataQueryRequest.newBuilder() diff --git a/table/src/main/java/tech/ydb/table/rpc/TableRpc.java b/table/src/main/java/tech/ydb/table/rpc/TableRpc.java index b49f2ddc5..54a2ee3dd 100644 --- a/table/src/main/java/tech/ydb/table/rpc/TableRpc.java +++ b/table/src/main/java/tech/ydb/table/rpc/TableRpc.java @@ -7,6 +7,7 @@ import tech.ydb.core.Status; import tech.ydb.core.grpc.GrpcReadStream; import tech.ydb.core.grpc.GrpcRequestSettings; +import tech.ydb.proto.table.YdbTable; import tech.ydb.proto.table.YdbTable.AlterTableRequest; import tech.ydb.proto.table.YdbTable.BeginTransactionRequest; import tech.ydb.proto.table.YdbTable.BeginTransactionResult; @@ -240,5 +241,14 @@ GrpcReadStream streamExecuteScanQuery(ExecuteSc * @return completable future with status of operation */ CompletableFuture bulkUpsert(BulkUpsertRequest request, GrpcRequestSettings settings); + + /** + * Describe table request. + * @param request request proto + * @param settings rpc call settings + * @return GrpcReadStream object that allows to start and cancel the stream + */ + CompletableFuture> describeTableOptions(YdbTable.DescribeTableOptionsRequest request, + GrpcRequestSettings settings); } diff --git a/table/src/main/java/tech/ydb/table/rpc/grpc/GrpcTableRpc.java b/table/src/main/java/tech/ydb/table/rpc/grpc/GrpcTableRpc.java index 76b0cc0f2..eaad07cc6 100644 --- a/table/src/main/java/tech/ydb/table/rpc/grpc/GrpcTableRpc.java +++ b/table/src/main/java/tech/ydb/table/rpc/grpc/GrpcTableRpc.java @@ -226,6 +226,16 @@ public CompletableFuture bulkUpsert(YdbTable.BulkUpsertRequest request, .thenApply(OperationBinder.bindSync(YdbTable.BulkUpsertResponse::getOperation)); } + @Override + public CompletableFuture> describeTableOptions( + YdbTable.DescribeTableOptionsRequest request, GrpcRequestSettings settings + ) { + return transport.unaryCall(TableServiceGrpc.getDescribeTableOptionsMethod(), settings, request) + .thenApply(OperationBinder.bindSync( + YdbTable.DescribeTableOptionsResponse::getOperation, YdbTable.DescribeTableOptionsResult.class + )); + } + @Override public String getDatabase() { return transport.getDatabase(); diff --git a/table/src/main/java/tech/ydb/table/settings/DescribeTableOptionsSettings.java b/table/src/main/java/tech/ydb/table/settings/DescribeTableOptionsSettings.java new file mode 100644 index 000000000..56e639cdd --- /dev/null +++ b/table/src/main/java/tech/ydb/table/settings/DescribeTableOptionsSettings.java @@ -0,0 +1,8 @@ +package tech.ydb.table.settings; + +/** + * + */ +public class DescribeTableOptionsSettings extends RequestSettings { + +} From e55f7be66c288480d3a0c4a8b9ecd33f896d43ee Mon Sep 17 00:00:00 2001 From: Evgeniy Kuvardin Date: Tue, 27 May 2025 23:49:00 +0300 Subject: [PATCH 2/4] Add tests --- .../src/main/java/tech/ydb/table/Session.java | 11 + .../description/TableOptionDescription.java | 86 ++++--- .../java/tech/ydb/table/impl/BaseSession.java | 70 ++++-- .../java/tech/ydb/table/rpc/TableRpc.java | 5 +- .../DescribeTableOptionsSettings.java | 4 +- .../test/java/tech/ydb/table/SessionStub.java | 7 + .../java/tech/ydb/table/TableRpcStub.java | 5 + .../table/integration/TableOptionTest.java | 232 ++++++++++++++++++ 8 files changed, 357 insertions(+), 63 deletions(-) create mode 100644 table/src/test/java/tech/ydb/table/integration/TableOptionTest.java diff --git a/table/src/main/java/tech/ydb/table/Session.java b/table/src/main/java/tech/ydb/table/Session.java index 83c20bc16..d2f3a2a56 100644 --- a/table/src/main/java/tech/ydb/table/Session.java +++ b/table/src/main/java/tech/ydb/table/Session.java @@ -90,6 +90,12 @@ CompletableFuture> executeDataQuery( CompletableFuture> explainDataQuery(String query, ExplainDataQuerySettings settings); + /** + * Get global table options settings + * + * @param settings settings + * @return global table options settings + */ CompletableFuture> describeTableOptions(DescribeTableOptionsSettings settings); /** @@ -226,6 +232,11 @@ default CompletableFuture executeBulkUpsert(String tablePath, ListValue return executeBulkUpsert(tablePath, rows, new BulkUpsertSettings()); } + /** + * Get table option settings + * + * @return fully described options settings + */ default CompletableFuture> describeTableOptions() { return describeTableOptions(new DescribeTableOptionsSettings()); } diff --git a/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java b/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java index 68e1c4a48..aa1e181a2 100644 --- a/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java +++ b/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java @@ -1,12 +1,17 @@ package tech.ydb.table.description; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; - import java.util.ArrayList; import java.util.List; import java.util.Map; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +/** + * Description of table options which is set globally in YDB + * + * @author Evgeny Kuvardin + */ public class TableOptionDescription { private final List tableProfileDescriptions; @@ -59,6 +64,9 @@ public List getCachingPolicyPresets() { return cachingPolicyPresets; } + /** + * Builder to construct {@link TableOptionDescription} + */ public static class Builder { private List tableProfileDescriptions; private List storagePolicyPresets; @@ -76,55 +84,34 @@ public void setTableProfileDescriptions(ArrayList table this.tableProfileDescriptions = tableProfileDescriptions; } - public List getStoragePolicyPresets() { - return storagePolicyPresets; - } - public void setStoragePolicyPresets(List storagePolicyPresets) { this.storagePolicyPresets = storagePolicyPresets; } - public List getCompactionPolicyPresets() { - return compactionPolicyPresets; - } - public void setCompactionPolicyPresets(List compactionPolicyPresets) { this.compactionPolicyPresets = compactionPolicyPresets; } - public List getPartitioningPolicyPresets() { - return partitioningPolicyPresets; - } - public void setPartitioningPolicyPresets(List partitioningPolicyPresets) { this.partitioningPolicyPresets = partitioningPolicyPresets; } - public List getExecutionPolicyPresets() { - return executionPolicyPresets; - } - public void setExecutionPolicyPresets(List executionPolicyPresets) { this.executionPolicyPresets = executionPolicyPresets; } - public List getReplicationPolicyPresets() { - return replicationPolicyPresets; - } - public void setReplicationPolicyPresets(List replicationPolicyPresets) { this.replicationPolicyPresets = replicationPolicyPresets; } - public List getCachingPolicyPresets() { - return cachingPolicyPresets; - } - public void setCachingPolicyPresets(List cachingPolicyPresets) { this.cachingPolicyPresets = cachingPolicyPresets; } } + /** + * Describe profile and associated settings to it + */ public static class TableProfileDescription { private final String name; private final Map labels; @@ -221,6 +208,9 @@ public List getAllowedCachingPolicy() { return allowedCachingPolicy; } + /** + * Builder to construct {@link TableProfileDescription} + */ public static class Builder { String name; Map labels; @@ -302,9 +292,16 @@ public void setAllowedCachingPolicy(List allowedCachingPolicy) { } } + /** + * Describe storage policy + *

+ * For example + * which codec is used + * where sored log an etc + */ public static class StoragePolicyDescription { private final String name; - private final Map labels; + private final Map labels; public StoragePolicyDescription(String name, Map labels) { this.name = name; @@ -320,9 +317,12 @@ public Map getLabels() { } } + /** + * Describe compaction policy + */ public static class CompactionPolicyDescription { private final String name; - private final Map labels; + private final Map labels; public CompactionPolicyDescription(String name, Map labels) { this.name = name; @@ -338,9 +338,15 @@ public Map getLabels() { } } + /** + * Describe partition policy + *

+ * For example + * split_threshold or is auto_split enabled + */ public static class PartitioningPolicyDescription { private final String name; - private final Map labels; + private final Map labels; public PartitioningPolicyDescription(String name, Map labels) { this.name = name; @@ -356,9 +362,15 @@ public Map getLabels() { } } + /** + * Describe execution policy + *

+ * For example + * pipeline_width or is bloom filter is used + */ public static class ExecutionPolicyDescription { private final String name; - private final Map labels; + private final Map labels; public ExecutionPolicyDescription(String name, Map labels) { this.name = name; @@ -374,9 +386,14 @@ public Map getLabels() { } } + /** + * Describe replication policy + *

+ * For example is followers enabled + */ public static class ReplicationPolicyDescription { private final String name; - private final Map labels; + private final Map labels; public ReplicationPolicyDescription(String name, Map labels) { this.name = name; @@ -392,9 +409,12 @@ public Map getLabels() { } } + /** + * Describe caching policy + */ public static class CachingPolicyDescription { private final String name; - private final Map labels; + private final Map labels; public CachingPolicyDescription(String name, Map labels) { this.name = name; diff --git a/table/src/main/java/tech/ydb/table/impl/BaseSession.java b/table/src/main/java/tech/ydb/table/impl/BaseSession.java index f8ceeef11..21cf6bf19 100644 --- a/table/src/main/java/tech/ydb/table/impl/BaseSession.java +++ b/table/src/main/java/tech/ydb/table/impl/BaseSession.java @@ -669,7 +669,8 @@ public CompletableFuture> describeTable(String path, De } @Override - public CompletableFuture> describeTableOptions(DescribeTableOptionsSettings settings) { + public CompletableFuture> describeTableOptions( + DescribeTableOptionsSettings settings) { YdbTable.DescribeTableOptionsRequest request = YdbTable.DescribeTableOptionsRequest.newBuilder() .setOperationParams(Operation.buildParams(settings.toOperationSettings())) .build(); @@ -913,7 +914,8 @@ private static YdbTable.TransactionSettings txSettings(Transaction.Mode transact return settings.build(); } - private static Result mapDescribeTableOptions(Result describeTableOptionsResult) { + private static Result mapDescribeTableOptions( + Result describeTableOptionsResult) { if (!describeTableOptionsResult.isSuccess()) { return describeTableOptionsResult.map(null); } @@ -924,67 +926,81 @@ private static Result mapDescribeTableOptions(Result()); for (YdbTable.TableProfileDescription tableProfileDescription : describeResult.getTableProfilePresetsList()) { - TableOptionDescription.TableProfileDescription.Builder descBuilder = TableOptionDescription.TableProfileDescription.newBuilder(); - descBuilder.setName(tableProfileDescription.getName()); - descBuilder.setLabels(tableProfileDescription.getLabelsMap()); - - descBuilder.setDefaultStoragePolicy(tableProfileDescription.getDefaultStoragePolicy()); - descBuilder.setDefaultCompactionPolicy(tableProfileDescription.getDefaultCompactionPolicy()); - descBuilder.setDefaultPartitioningPolicy(tableProfileDescription.getDefaultPartitioningPolicy()); - descBuilder.setDefaultExecutionPolicy(tableProfileDescription.getDefaultExecutionPolicy()); - descBuilder.setDefaultReplicationPolicy(tableProfileDescription.getDefaultReplicationPolicy()); - descBuilder.setDefaultCachingPolicy(tableProfileDescription.getDefaultCachingPolicy()); - - descBuilder.setAllowedStoragePolicy(tableProfileDescription.getAllowedStoragePoliciesList()); - descBuilder.setAllowedCompactionPolicy(tableProfileDescription.getAllowedCompactionPoliciesList()); - descBuilder.setAllowedPartitioningPolicy(tableProfileDescription.getAllowedPartitioningPoliciesList()); - descBuilder.setAllowedExecutionPolicy(tableProfileDescription.getAllowedExecutionPoliciesList()); - descBuilder.setAllowedReplicationPolicy(tableProfileDescription.getAllowedReplicationPoliciesList()); - descBuilder.setAllowedCachingPolicy(tableProfileDescription.getAllowedCachingPoliciesList()); - - TableOptionDescription.TableProfileDescription description = new TableOptionDescription.TableProfileDescription(descBuilder); + TableOptionDescription.TableProfileDescription.Builder descBuilder = + getDescBuilder(tableProfileDescription); + + TableOptionDescription.TableProfileDescription description = descBuilder.build(); builder.getTableProfileDescriptions().add(description); } List storagePolicyDescription = new ArrayList<>(); builder.setStoragePolicyPresets(storagePolicyDescription); for (YdbTable.StoragePolicyDescription iter : describeResult.getStoragePolicyPresetsList()) { - storagePolicyDescription.add(new TableOptionDescription.StoragePolicyDescription(iter.getName(), iter.getLabelsMap())); + storagePolicyDescription.add( + new TableOptionDescription.StoragePolicyDescription(iter.getName(), iter.getLabelsMap())); } List compactionPolicyDescription = new ArrayList<>(); builder.setCompactionPolicyPresets(compactionPolicyDescription); for (YdbTable.CompactionPolicyDescription iter : describeResult.getCompactionPolicyPresetsList()) { - compactionPolicyDescription.add(new TableOptionDescription.CompactionPolicyDescription(iter.getName(), iter.getLabelsMap())); + compactionPolicyDescription.add( + new TableOptionDescription.CompactionPolicyDescription(iter.getName(), iter.getLabelsMap())); } List partitioningPolicyPresets = new ArrayList<>(); builder.setPartitioningPolicyPresets(partitioningPolicyPresets); for (YdbTable.PartitioningPolicyDescription iter : describeResult.getPartitioningPolicyPresetsList()) { - partitioningPolicyPresets.add(new TableOptionDescription.PartitioningPolicyDescription(iter.getName(), iter.getLabelsMap())); + partitioningPolicyPresets.add( + new TableOptionDescription.PartitioningPolicyDescription(iter.getName(), iter.getLabelsMap())); } List executionPolicyDescriptions = new ArrayList<>(); builder.setExecutionPolicyPresets(executionPolicyDescriptions); for (YdbTable.ExecutionPolicyDescription iter : describeResult.getExecutionPolicyPresetsList()) { - executionPolicyDescriptions.add(new TableOptionDescription.ExecutionPolicyDescription(iter.getName(), iter.getLabelsMap())); + executionPolicyDescriptions.add( + new TableOptionDescription.ExecutionPolicyDescription(iter.getName(), iter.getLabelsMap())); } List replicationPolicyPresets = new ArrayList<>(); builder.setReplicationPolicyPresets(replicationPolicyPresets); for (YdbTable.ReplicationPolicyDescription iter : describeResult.getReplicationPolicyPresetsList()) { - replicationPolicyPresets.add(new TableOptionDescription.ReplicationPolicyDescription(iter.getName(), iter.getLabelsMap())); + replicationPolicyPresets.add( + new TableOptionDescription.ReplicationPolicyDescription(iter.getName(), iter.getLabelsMap())); } List cachingPolicyPresets = new ArrayList<>(); builder.setCachingPolicyPresets(cachingPolicyPresets); for (YdbTable.CachingPolicyDescription iter : describeResult.getCachingPolicyPresetsList()) { - cachingPolicyPresets.add(new TableOptionDescription.CachingPolicyDescription(iter.getName(), iter.getLabelsMap())); + cachingPolicyPresets.add( + new TableOptionDescription.CachingPolicyDescription(iter.getName(), iter.getLabelsMap())); } return Result.success(new TableOptionDescription(builder)); } + private static TableOptionDescription.TableProfileDescription.Builder getDescBuilder( + YdbTable.TableProfileDescription tableProfileDescription) { + TableOptionDescription.TableProfileDescription.Builder descBuilder = + TableOptionDescription.TableProfileDescription.newBuilder(); + descBuilder.setName(tableProfileDescription.getName()); + descBuilder.setLabels(tableProfileDescription.getLabelsMap()); + + descBuilder.setDefaultStoragePolicy(tableProfileDescription.getDefaultStoragePolicy()); + descBuilder.setDefaultCompactionPolicy(tableProfileDescription.getDefaultCompactionPolicy()); + descBuilder.setDefaultPartitioningPolicy(tableProfileDescription.getDefaultPartitioningPolicy()); + descBuilder.setDefaultExecutionPolicy(tableProfileDescription.getDefaultExecutionPolicy()); + descBuilder.setDefaultReplicationPolicy(tableProfileDescription.getDefaultReplicationPolicy()); + descBuilder.setDefaultCachingPolicy(tableProfileDescription.getDefaultCachingPolicy()); + + descBuilder.setAllowedStoragePolicy(tableProfileDescription.getAllowedStoragePoliciesList()); + descBuilder.setAllowedCompactionPolicy(tableProfileDescription.getAllowedCompactionPoliciesList()); + descBuilder.setAllowedPartitioningPolicy(tableProfileDescription.getAllowedPartitioningPoliciesList()); + descBuilder.setAllowedExecutionPolicy(tableProfileDescription.getAllowedExecutionPoliciesList()); + descBuilder.setAllowedReplicationPolicy(tableProfileDescription.getAllowedReplicationPoliciesList()); + descBuilder.setAllowedCachingPolicy(tableProfileDescription.getAllowedCachingPoliciesList()); + return descBuilder; + } + protected CompletableFuture> executeDataQueryInternal( String query, YdbTable.TransactionControl txControl, Params params, ExecuteDataQuerySettings settings) { diff --git a/table/src/main/java/tech/ydb/table/rpc/TableRpc.java b/table/src/main/java/tech/ydb/table/rpc/TableRpc.java index 54a2ee3dd..714e242ba 100644 --- a/table/src/main/java/tech/ydb/table/rpc/TableRpc.java +++ b/table/src/main/java/tech/ydb/table/rpc/TableRpc.java @@ -248,7 +248,8 @@ GrpcReadStream streamExecuteScanQuery(ExecuteSc * @param settings rpc call settings * @return GrpcReadStream object that allows to start and cancel the stream */ - CompletableFuture> describeTableOptions(YdbTable.DescribeTableOptionsRequest request, - GrpcRequestSettings settings); + CompletableFuture> describeTableOptions( + YdbTable.DescribeTableOptionsRequest request, + GrpcRequestSettings settings); } diff --git a/table/src/main/java/tech/ydb/table/settings/DescribeTableOptionsSettings.java b/table/src/main/java/tech/ydb/table/settings/DescribeTableOptionsSettings.java index 56e639cdd..f75c3aee3 100644 --- a/table/src/main/java/tech/ydb/table/settings/DescribeTableOptionsSettings.java +++ b/table/src/main/java/tech/ydb/table/settings/DescribeTableOptionsSettings.java @@ -1,8 +1,10 @@ package tech.ydb.table.settings; /** + * Setting for describe able options. * + * @author Evgeny Kuvardin */ -public class DescribeTableOptionsSettings extends RequestSettings { +public class DescribeTableOptionsSettings extends RequestSettings { } diff --git a/table/src/test/java/tech/ydb/table/SessionStub.java b/table/src/test/java/tech/ydb/table/SessionStub.java index 329e049e9..2d9eb0da0 100644 --- a/table/src/test/java/tech/ydb/table/SessionStub.java +++ b/table/src/test/java/tech/ydb/table/SessionStub.java @@ -9,6 +9,7 @@ import tech.ydb.core.grpc.GrpcReadStream; import tech.ydb.core.utils.FutureTools; import tech.ydb.table.description.TableDescription; +import tech.ydb.table.description.TableOptionDescription; import tech.ydb.table.query.DataQuery; import tech.ydb.table.query.DataQueryResult; import tech.ydb.table.query.ExplainDataQueryResult; @@ -23,6 +24,7 @@ import tech.ydb.table.settings.CopyTableSettings; import tech.ydb.table.settings.CopyTablesSettings; import tech.ydb.table.settings.CreateTableSettings; +import tech.ydb.table.settings.DescribeTableOptionsSettings; import tech.ydb.table.settings.DescribeTableSettings; import tech.ydb.table.settings.DropTableSettings; import tech.ydb.table.settings.ExecuteDataQuerySettings; @@ -127,6 +129,11 @@ public CompletableFuture> explainDataQuery( return notImplemented("explainDataQuery()"); } + @Override + public CompletableFuture> describeTableOptions(DescribeTableOptionsSettings settings) { + return notImplemented("describeTableOptions()"); + } + @Override @Deprecated public CompletableFuture> beginTransaction( diff --git a/table/src/test/java/tech/ydb/table/TableRpcStub.java b/table/src/test/java/tech/ydb/table/TableRpcStub.java index 97e7c4054..df44bb61f 100644 --- a/table/src/test/java/tech/ydb/table/TableRpcStub.java +++ b/table/src/test/java/tech/ydb/table/TableRpcStub.java @@ -179,6 +179,11 @@ public CompletableFuture bulkUpsert(YdbTable.BulkUpsertRequest request, return notImplemented("bulkUpsert()"); } + @Override + public CompletableFuture> describeTableOptions(YdbTable.DescribeTableOptionsRequest request, GrpcRequestSettings settings) { + return notImplemented("describeTableOptions()"); + } + @Override public String getDatabase() { return ""; diff --git a/table/src/test/java/tech/ydb/table/integration/TableOptionTest.java b/table/src/test/java/tech/ydb/table/integration/TableOptionTest.java new file mode 100644 index 000000000..513e38d99 --- /dev/null +++ b/table/src/test/java/tech/ydb/table/integration/TableOptionTest.java @@ -0,0 +1,232 @@ +package tech.ydb.table.integration; + +import org.junit.Assert; +import org.junit.ClassRule; + +import org.junit.Test; + +import tech.ydb.core.Result; +import tech.ydb.core.StatusCode; +import tech.ydb.table.Session; +import tech.ydb.table.SessionRetryContext; +import tech.ydb.table.description.TableOptionDescription; +import tech.ydb.table.impl.SimpleTableClient; +import tech.ydb.table.rpc.grpc.GrpcTableRpc; +import tech.ydb.table.settings.DescribeTableOptionsSettings; +import tech.ydb.test.junit4.GrpcTransportRule; + +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +/** + * Test connected to get described table options. + * + * @author Evgeny Kuvardin + */ +public class TableOptionTest { + + @ClassRule + public final static GrpcTransportRule ydbTransport = new GrpcTransportRule(); + + private final SimpleTableClient tableClient = SimpleTableClient.newClient( + GrpcTableRpc.useTransport(ydbTransport) + ).build(); + + private final SessionRetryContext ctx = SessionRetryContext.create(tableClient).build(); + + /** + * Test checks that call to describe table options works with the default settings + */ + @Test + public void tableOptionsTestShouldGetGlobalOptionsWithDefaultSettings() { + Result describeResult = ctx.supplyResult(Session::describeTableOptions).join(); + + Assert.assertTrue("Describe table options" + describeResult.getStatus(), describeResult.isSuccess()); + + TableOptionDescription tableOptionDescription = describeResult.getValue(); + + checkTableOptions(tableOptionDescription); + } + + /** + * Test checks that call to describe table options works with all set options + */ + @Test + public void tableOptionsTestShouldGetGlobalOptions() { + Result describeResult = ctx.supplyResult(session -> { + DescribeTableOptionsSettings settings = new DescribeTableOptionsSettings(); + settings.setTraceId("traceId"); + settings.setReportCostInfo(true); + settings.setTimeout(10, TimeUnit.SECONDS); + settings.setCancelAfter(Duration.ofSeconds(8)); + settings.setOperationTimeout(Duration.ofSeconds(8)); + return session.describeTableOptions(settings); + }).join(); + Assert.assertTrue("Describe table options" + describeResult.getStatus(), describeResult.isSuccess()); + + TableOptionDescription tableOptionDescription = describeResult.getValue(); + checkTableOptions(tableOptionDescription); + } + + /** + * Test checks that call to describe table options fails when we set client timeout as low as possible + * and request can't be completed in this time. + * We should catch StatusCode == CLIENT_DEADLINE_EXPIRED + */ + @Test + public void tableOptionsTestShouldFailedInOrderToTimeout() { + Result describeResult = ctx.supplyResult(session -> { + DescribeTableOptionsSettings settings = new DescribeTableOptionsSettings(); + settings.setTraceId("traceId"); + settings.setReportCostInfo(true); + settings.setTimeout(1, TimeUnit.NANOSECONDS); + return session.describeTableOptions(settings); + }).join(); + Assert.assertFalse("Describe table options" + describeResult.getStatus(), describeResult.isSuccess()); + Assert.assertEquals(StatusCode.CLIENT_DEADLINE_EXPIRED, describeResult.getStatus().getCode()); + } + + private void checkTableOptions(TableOptionDescription tableOptionDescription) { + checkStoragePresets(tableOptionDescription); + + checkPolicyPresets(tableOptionDescription); + + checkCompactionPolicyPresets(tableOptionDescription); + + checkExecutionPolicyPresets(tableOptionDescription); + + checkPartitioningPolicyPresets(tableOptionDescription); + + checkReplicationPolicyPresets(tableOptionDescription); + + checkTableProfileDescriptions(tableOptionDescription); + } + + + private void checkStoragePresets(TableOptionDescription tableOptionDescription) { + Assert.assertNotNull(tableOptionDescription.getStoragePolicyPresets()); + List storagePolicyDescription = tableOptionDescription.getStoragePolicyPresets(); + Assert.assertEquals(2, storagePolicyDescription.size()); + + + for (TableOptionDescription.StoragePolicyDescription v1 : storagePolicyDescription) { + if (v1.getName().equals("default")) { + checkDefaultStoragePolicy(v1); + } else { + checkLogLz4StoragePolicy(v1); + } + } + } + + private void checkTableProfileDescriptions(TableOptionDescription tableOptionDescription) { + Assert.assertNotNull(tableOptionDescription.getTableProfileDescriptions()); + List tableProfileDescriptions = tableOptionDescription.getTableProfileDescriptions(); + + Assert.assertFalse(tableProfileDescriptions.isEmpty()); + + Optional t = tableProfileDescriptions.stream().filter(p -> p.getName().equals("default")).findFirst(); + Assert.assertTrue(t.isPresent()); + TableOptionDescription.TableProfileDescription v = t.get(); + Assert.assertEquals("default", v.getName()); + Assert.assertNotNull(v.getLabels()); + Assert.assertEquals("default", v.getDefaultCachingPolicy()); + Assert.assertEquals("default", v.getDefaultCompactionPolicy()); + Assert.assertEquals("default", v.getDefaultExecutionPolicy()); + Assert.assertEquals("default", v.getDefaultPartitioningPolicy()); + Assert.assertEquals("default", v.getDefaultReplicationPolicy()); + Assert.assertEquals("default", v.getDefaultStoragePolicy()); + + Assert.assertNotNull(v.getAllowedCachingPolicy()); + Assert.assertTrue(v.getAllowedCachingPolicy().stream().anyMatch(p -> p.equals("default"))); + + Assert.assertNotNull(v.getAllowedCompactionPolicy()); + Assert.assertTrue(v.getAllowedCompactionPolicy().stream().anyMatch(p -> p.equals("default"))); + + Assert.assertNotNull(v.getAllowedExecutionPolicy()); + Assert.assertTrue(v.getAllowedExecutionPolicy().stream().anyMatch(p -> p.equals("default"))); + + Assert.assertNotNull(v.getAllowedPartitioningPolicy()); + Assert.assertTrue(v.getAllowedPartitioningPolicy().stream().anyMatch(p -> p.equals("default"))); + + Assert.assertNotNull(v.getAllowedReplicationPolicy()); + Assert.assertTrue(v.getAllowedReplicationPolicy().stream().anyMatch(p -> p.equals("default"))); + + Assert.assertNotNull(v.getAllowedStoragePolicy()); + Assert.assertTrue(v.getAllowedStoragePolicy().stream().anyMatch(p -> p.equals("default"))); + } + + private void checkReplicationPolicyPresets(TableOptionDescription tableOptionDescription) { + Assert.assertNotNull(tableOptionDescription.getReplicationPolicyPresets()); + List replicationPolicyPresets = tableOptionDescription.getReplicationPolicyPresets(); + + Assert.assertEquals(1, replicationPolicyPresets.size()); + Assert.assertEquals("default", replicationPolicyPresets.get(0).getName()); + Assert.assertNotNull(replicationPolicyPresets.get(0).getLabels()); + Assert.assertFalse(replicationPolicyPresets.get(0).getLabels().isEmpty()); + } + + private void checkPartitioningPolicyPresets(TableOptionDescription tableOptionDescription) { + Assert.assertNotNull(tableOptionDescription.getPartitioningPolicyPresets()); + List partitioningPolicyPresets = tableOptionDescription.getPartitioningPolicyPresets(); + + Assert.assertEquals(1, partitioningPolicyPresets.size()); + Assert.assertEquals("default", partitioningPolicyPresets.get(0).getName()); + Assert.assertNotNull(partitioningPolicyPresets.get(0).getLabels()); + Assert.assertFalse(partitioningPolicyPresets.get(0).getLabels().isEmpty()); + } + + private void checkExecutionPolicyPresets(TableOptionDescription tableOptionDescription) { + + Assert.assertNotNull(tableOptionDescription.getExecutionPolicyPresets()); + List executionPolicyPresets = tableOptionDescription.getExecutionPolicyPresets(); + + Assert.assertEquals(1, executionPolicyPresets.size()); + Assert.assertEquals("default", executionPolicyPresets.get(0).getName()); + Assert.assertNotNull(executionPolicyPresets.get(0).getLabels()); + Assert.assertFalse(executionPolicyPresets.get(0).getLabels().isEmpty()); + } + + private void checkCompactionPolicyPresets(TableOptionDescription tableOptionDescription) { + Assert.assertNotNull(tableOptionDescription.getCompactionPolicyPresets()); + List compactionPolicyPresets = tableOptionDescription.getCompactionPolicyPresets(); + + Assert.assertEquals(1, compactionPolicyPresets.size()); + Assert.assertEquals("default", compactionPolicyPresets.get(0).getName()); + Assert.assertNotNull(compactionPolicyPresets.get(0).getLabels()); + Assert.assertTrue(compactionPolicyPresets.get(0).getLabels().isEmpty()); + } + + private void checkPolicyPresets(TableOptionDescription tableOptionDescription) { + Assert.assertNotNull(tableOptionDescription.getCachingPolicyPresets()); + List cachingPolicyPresets = tableOptionDescription.getCachingPolicyPresets(); + + Assert.assertEquals(1, cachingPolicyPresets.size()); + Assert.assertEquals("default", cachingPolicyPresets.get(0).getName()); + Assert.assertNotNull(cachingPolicyPresets.get(0).getLabels()); + Assert.assertTrue(cachingPolicyPresets.get(0).getLabels().isEmpty()); + } + + private void checkLogLz4StoragePolicy(TableOptionDescription.StoragePolicyDescription storagePolicyDescription) { + Map map2 = storagePolicyDescription.getLabels(); + Assert.assertEquals("log_lz4", storagePolicyDescription.getName()); + Assert.assertEquals("hdd", map2.get("data")); + Assert.assertEquals("false", map2.get("in_memory")); + Assert.assertEquals("hdd", map2.get("log")); + Assert.assertEquals("hdd", map2.get("syslog")); + Assert.assertEquals("lz4", map2.get("codec")); + } + + private void checkDefaultStoragePolicy(TableOptionDescription.StoragePolicyDescription storagePolicyDescription) { + Assert.assertEquals("default", storagePolicyDescription.getName()); + Map map = storagePolicyDescription.getLabels(); + Assert.assertEquals("hdd", map.get("data")); + Assert.assertEquals("false", map.get("in_memory")); + Assert.assertEquals("hdd", map.get("log")); + Assert.assertEquals("hdd", map.get("syslog")); + Assert.assertEquals("none", map.get("codec")); + } + +} From dc6b9f640f0ae3812e67738731e1b212217d9402 Mon Sep 17 00:00:00 2001 From: Evgeniy Kuvardin Date: Wed, 28 May 2025 11:51:28 +0300 Subject: [PATCH 3/4] Remove ArrayList and simplify code --- table/src/main/java/tech/ydb/table/Session.java | 6 +++--- .../ydb/table/description/TableOptionDescription.java | 3 +-- table/src/main/java/tech/ydb/table/impl/BaseSession.java | 5 +++-- .../java/tech/ydb/table/integration/TableOptionTest.java | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/table/src/main/java/tech/ydb/table/Session.java b/table/src/main/java/tech/ydb/table/Session.java index d2f3a2a56..183f98a7b 100644 --- a/table/src/main/java/tech/ydb/table/Session.java +++ b/table/src/main/java/tech/ydb/table/Session.java @@ -91,10 +91,10 @@ CompletableFuture> executeDataQuery( CompletableFuture> explainDataQuery(String query, ExplainDataQuerySettings settings); /** - * Get global table options settings + * Get table option settings * * @param settings settings - * @return global table options settings + * @return fully described options settings */ CompletableFuture> describeTableOptions(DescribeTableOptionsSettings settings); @@ -233,7 +233,7 @@ default CompletableFuture executeBulkUpsert(String tablePath, ListValue } /** - * Get table option settings + * Get table option settings with default {@link DescribeTableOptionsSettings} * * @return fully described options settings */ diff --git a/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java b/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java index aa1e181a2..45b4ed33a 100644 --- a/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java +++ b/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java @@ -1,6 +1,5 @@ package tech.ydb.table.description; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -80,7 +79,7 @@ public List getTableProfileDescriptions() { return tableProfileDescriptions; } - public void setTableProfileDescriptions(ArrayList tableProfileDescriptions) { + public void setTableProfileDescriptions(List tableProfileDescriptions) { this.tableProfileDescriptions = tableProfileDescriptions; } diff --git a/table/src/main/java/tech/ydb/table/impl/BaseSession.java b/table/src/main/java/tech/ydb/table/impl/BaseSession.java index 21cf6bf19..af7abe515 100644 --- a/table/src/main/java/tech/ydb/table/impl/BaseSession.java +++ b/table/src/main/java/tech/ydb/table/impl/BaseSession.java @@ -924,13 +924,14 @@ private static Result mapDescribeTableOptions( TableOptionDescription.Builder builder = TableOptionDescription.newBuilder(); - builder.setTableProfileDescriptions(new ArrayList<>()); + List tableProfileDescriptions = new ArrayList<>(); + builder.setTableProfileDescriptions(tableProfileDescriptions); for (YdbTable.TableProfileDescription tableProfileDescription : describeResult.getTableProfilePresetsList()) { TableOptionDescription.TableProfileDescription.Builder descBuilder = getDescBuilder(tableProfileDescription); TableOptionDescription.TableProfileDescription description = descBuilder.build(); - builder.getTableProfileDescriptions().add(description); + tableProfileDescriptions.add(description); } List storagePolicyDescription = new ArrayList<>(); diff --git a/table/src/test/java/tech/ydb/table/integration/TableOptionTest.java b/table/src/test/java/tech/ydb/table/integration/TableOptionTest.java index 513e38d99..a0dfab1e0 100644 --- a/table/src/test/java/tech/ydb/table/integration/TableOptionTest.java +++ b/table/src/test/java/tech/ydb/table/integration/TableOptionTest.java @@ -38,7 +38,7 @@ public class TableOptionTest { private final SessionRetryContext ctx = SessionRetryContext.create(tableClient).build(); /** - * Test checks that call to describe table options works with the default settings + * The test checks that the call to describe table options works with the default settings. */ @Test public void tableOptionsTestShouldGetGlobalOptionsWithDefaultSettings() { @@ -52,7 +52,7 @@ public void tableOptionsTestShouldGetGlobalOptionsWithDefaultSettings() { } /** - * Test checks that call to describe table options works with all set options + * The test checks that the call to describe table options works with all set options */ @Test public void tableOptionsTestShouldGetGlobalOptions() { @@ -72,8 +72,8 @@ public void tableOptionsTestShouldGetGlobalOptions() { } /** - * Test checks that call to describe table options fails when we set client timeout as low as possible - * and request can't be completed in this time. + * The test checks that the call to describe table options fails when we set the client timeout as low as possible. + * and the request can't be completed in this time. * We should catch StatusCode == CLIENT_DEADLINE_EXPIRED */ @Test From f72bcc0d16342cef8453116e10f93a6efdf16a00 Mon Sep 17 00:00:00 2001 From: Evgeniy Kuvardin Date: Wed, 28 May 2025 16:20:41 +0300 Subject: [PATCH 4/4] Remove unused getter --- .../tech/ydb/table/description/TableOptionDescription.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java b/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java index 45b4ed33a..02c86b570 100644 --- a/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java +++ b/table/src/main/java/tech/ydb/table/description/TableOptionDescription.java @@ -75,10 +75,6 @@ public static class Builder { private List replicationPolicyPresets; private List cachingPolicyPresets; - public List getTableProfileDescriptions() { - return tableProfileDescriptions; - } - public void setTableProfileDescriptions(List tableProfileDescriptions) { this.tableProfileDescriptions = tableProfileDescriptions; }