diff --git a/CHANGELOG.md b/CHANGELOG.md index ebc804424..c32f7c0a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,10 @@ * Query: Added support of ApacheArrow for query execution * Tests: Updated testcontainers to 2.0.3 +## 2.3.34 ## +* Table: Fixed StoragePool mapping for CreateTable +* Core: Added method to customize x-build-info + ## 2.3.33 ## * Topic: Fixed race between decoder and function that publishes messages to user diff --git a/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java b/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java index 2715dc9f5..c38b5c8ca 100644 --- a/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java +++ b/query/src/test/java/tech/ydb/query/impl/QueryIntegrationTest.java @@ -612,7 +612,6 @@ public void testNoTxStatement() { Assert.assertEquals(StatusCode.PRECONDITION_FAILED, result.getStatus().getCode()); Issue issue = Issue.of(2012, "Constraint violated. Table: `" + ydbTransport.getDatabase() + "/" + TEST_TABLE + "`.", -// "Conflict with existing key.", Issue.Severity.ERROR ); Assert.assertArrayEquals(new Issue[] { issue }, result.getStatus().getIssues()); 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 04b0162f4..4ddba5159 100644 --- a/table/src/main/java/tech/ydb/table/impl/BaseSession.java +++ b/table/src/main/java/tech/ydb/table/impl/BaseSession.java @@ -348,23 +348,28 @@ private static YdbTable.TableIndex buildIndex(TableIndex index) { } private static YdbTable.ColumnFamily buildColumnFamily(ColumnFamily family) { - YdbTable.ColumnFamily.Compression compression; - switch (family.getCompression()) { - case COMPRESSION_NONE: - compression = YdbTable.ColumnFamily.Compression.COMPRESSION_NONE; - break; - case COMPRESSION_LZ4: - compression = YdbTable.ColumnFamily.Compression.COMPRESSION_LZ4; - break; - default: - compression = YdbTable.ColumnFamily.Compression.COMPRESSION_UNSPECIFIED; + YdbTable.ColumnFamily.Builder builder = YdbTable.ColumnFamily.newBuilder() + .setName(family.getName()); + if (family.getCompression() != null) { + switch (family.getCompression()) { + case COMPRESSION_NONE: + builder = builder.setCompression(YdbTable.ColumnFamily.Compression.COMPRESSION_NONE); + break; + case COMPRESSION_LZ4: + builder = builder.setCompression(YdbTable.ColumnFamily.Compression.COMPRESSION_LZ4); + break; + default: + // Nothing + break; + } } - return YdbTable.ColumnFamily.newBuilder() - .setCompression(compression) - .setData(YdbTable.StoragePool.newBuilder().setMedia(family.getData().getMedia())) - .setName(family.getName()) - .build(); + StoragePool data = family.getData(); + if (data != null && data.getMedia() != null && !data.getMedia().isEmpty()) { + builder.setData(YdbTable.StoragePool.newBuilder().setMedia(data.getMedia())); + } + + return builder.build(); } private static YdbTable.TtlSettings buildTtlSettings(TableTtl ttl) { @@ -441,9 +446,7 @@ public CompletableFuture createTable( } for (ColumnFamily family : description.getColumnFamilies()) { - if (!"default".equals(family.getName())) { - request.addColumnFamilies(buildColumnFamily(family)); - } + request.addColumnFamilies(buildColumnFamily(family)); } for (TableColumn column : description.getColumns()) { diff --git a/table/src/test/java/tech/ydb/table/impl/BaseSessionTest.java b/table/src/test/java/tech/ydb/table/impl/BaseSessionTest.java new file mode 100644 index 000000000..6b8ea28a6 --- /dev/null +++ b/table/src/test/java/tech/ydb/table/impl/BaseSessionTest.java @@ -0,0 +1,31 @@ +package tech.ydb.table.impl; + +import org.junit.Assert; +import org.junit.Test; + +import tech.ydb.table.description.ColumnFamily; + +/** + * + * @author Aleksandr Gorshenin {@literal } + */ +public class BaseSessionTest { + + /** + * Verifies that the {@link ColumnFamily.Compression} enum declares exactly the expected constants: + * {@code COMPRESSION_NONE} and {@code COMPRESSION_LZ4}. + *

+ * This check matters because the values are used when mapping to and from the protobuf representation. Any change + * to the enum would break this test and signals that + * {@link BaseSession#buildColumnFamily(tech.ydb.table.description.ColumnFamily)} and + * {@link BaseSession#mapDescribeTable(tech.ydb.core.Result, tech.ydb.table.settings.DescribeTableSettings)} + * need to be updated as well. + */ + @Test + public void columnFamilyTest() { + Assert.assertArrayEquals(new ColumnFamily.Compression[] { + ColumnFamily.Compression.COMPRESSION_NONE, + ColumnFamily.Compression.COMPRESSION_LZ4 + }, ColumnFamily.Compression.values()); + } +} diff --git a/table/src/test/java/tech/ydb/table/impl/pool/FutureHelper.java b/table/src/test/java/tech/ydb/table/impl/pool/FutureHelper.java index 1476e98e5..75229d884 100644 --- a/table/src/test/java/tech/ydb/table/impl/pool/FutureHelper.java +++ b/table/src/test/java/tech/ydb/table/impl/pool/FutureHelper.java @@ -73,6 +73,4 @@ private void futureHasException(CompletableFuture future, String message) { Assert.assertNotNull("Test interrupted", ex); } } - - } diff --git a/table/src/test/java/tech/ydb/table/integration/DescribeTableTest.java b/table/src/test/java/tech/ydb/table/integration/DescribeTableTest.java index 4d6680425..ac306042c 100644 --- a/table/src/test/java/tech/ydb/table/integration/DescribeTableTest.java +++ b/table/src/test/java/tech/ydb/table/integration/DescribeTableTest.java @@ -1,5 +1,6 @@ package tech.ydb.table.integration; +import org.junit.After; import org.junit.Assert; import org.junit.ClassRule; import org.junit.Test; @@ -8,8 +9,12 @@ import tech.ydb.core.Status; import tech.ydb.core.StatusCode; import tech.ydb.table.SessionRetryContext; +import tech.ydb.table.description.ColumnFamily; +import tech.ydb.table.description.TableDescription; import tech.ydb.table.impl.SimpleTableClient; import tech.ydb.table.rpc.grpc.GrpcTableRpc; +import tech.ydb.table.values.PrimitiveType; +import tech.ydb.table.values.PrimitiveValue; import tech.ydb.test.junit4.GrpcTransportRule; /** @@ -17,12 +22,25 @@ * @author Aleksandr Gorshenin */ public class DescribeTableTest { + private static final String TABLE_NAME = "table_describe_test"; + private static final String TABLE_COPY_NAME = "table_describe_test_copy"; + @ClassRule public static final GrpcTransportRule YDB_TRANSPORT = new GrpcTransportRule(); + private static final SessionRetryContext CTX = SessionRetryContext.create(SimpleTableClient.newClient( GrpcTableRpc.useTransport(YDB_TRANSPORT) ).build()).build(); + private final String tablePath = YDB_TRANSPORT.getDatabase() + "/" + TABLE_NAME; + private final String tableCopyPath = YDB_TRANSPORT.getDatabase() + "/" + TABLE_COPY_NAME; + + @After + public void dropTable() { + CTX.supplyStatus(session -> session.dropTable(tablePath)).join(); + CTX.supplyStatus(session -> session.dropTable(tableCopyPath)).join(); + } + @Test public void wrongTypeTest() { String databasePath = YDB_TRANSPORT.getDatabase(); @@ -36,4 +54,42 @@ public void wrongTypeTest() { Assert.assertEquals("Entry " + entryName + " with type DIRECTORY is not a table", issues[0].getMessage()); Assert.assertEquals(Issue.Severity.ERROR, issues[0].getSeverity()); } + + @Test + public void copyTableTest() { + TableDescription createTable = TableDescription.newBuilder() + .addNonnullColumn("id", PrimitiveType.Int8) + .addNonnullColumn("version", PrimitiveType.Uint32) + .addNullableColumn("value", PrimitiveType.Text, PrimitiveValue.newText("123")) + .addColumnFamily(new ColumnFamily("default", null, ColumnFamily.Compression.COMPRESSION_LZ4)) + .addColumnFamily(new ColumnFamily("raw", null, null)) + .setPrimaryKeys("id", "version") + .build(); + + CTX.supplyStatus(session -> session.createTable(tablePath, createTable)).join() + .expectSuccess("cannot create table " + tablePath); + + TableDescription tableDesc = CTX.supplyResult(session -> session.describeTable(tablePath)).join().getValue(); + + Assert.assertEquals(2, tableDesc.getColumnFamilies().size()); + Assert.assertEquals(ColumnFamily.Compression.COMPRESSION_LZ4, findFamily(tableDesc, "default").getCompression()); + Assert.assertEquals(ColumnFamily.Compression.COMPRESSION_NONE, findFamily(tableDesc, "raw").getCompression()); + + CTX.supplyStatus(session -> session.createTable(tableCopyPath, tableDesc)).join() + .expectSuccess("cannot create table " + tableCopyPath); + + TableDescription copyDesc = CTX.supplyResult(session -> session.describeTable(tableCopyPath)).join().getValue(); + Assert.assertEquals(2, copyDesc.getColumnFamilies().size()); + Assert.assertEquals(ColumnFamily.Compression.COMPRESSION_LZ4, findFamily(copyDesc, "default").getCompression()); + Assert.assertEquals(ColumnFamily.Compression.COMPRESSION_NONE, findFamily(copyDesc, "raw").getCompression()); + } + + private ColumnFamily findFamily(TableDescription desc, String name) { + for (ColumnFamily family : desc.getColumnFamilies()) { + if (name.equals(family.getName())) { + return family; + } + } + throw new AssertionError("Expected column family with name " + name); + } }