diff --git a/src/java/org/apache/cassandra/db/SchemaCQLHelper.java b/src/java/org/apache/cassandra/db/SchemaCQLHelper.java index 5d83a2beaf..ca9ef25e61 100644 --- a/src/java/org/apache/cassandra/db/SchemaCQLHelper.java +++ b/src/java/org/apache/cassandra/db/SchemaCQLHelper.java @@ -19,6 +19,7 @@ package org.apache.cassandra.db; import java.nio.ByteBuffer; +import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -46,34 +47,10 @@ public class SchemaCQLHelper // Types come first, as table can't be created without them Stream udts = SchemaCQLHelper.getUserTypesAsCQL(metadata, types, true); - return Stream.concat(udts, - reCreateStatements(metadata, - true, - true, - true, - true)); - } + Stream tableMatadata = Stream.of(SchemaCQLHelper.getTableMetadataAsCQL(metadata)); - public static Stream reCreateStatements(TableMetadata metadata, - boolean includeDroppedColumns, - boolean internals, - boolean ifNotExists, - boolean includeIndexes) - { - // Record re-create schema statements - Stream r = Stream.of(metadata) - .map((tm) -> SchemaCQLHelper.getTableMetadataAsCQL(tm, - includeDroppedColumns, - internals, - ifNotExists)); - - if (includeIndexes) - { - // Indexes applied as last, since otherwise they may interfere with column drops / re-additions - r = Stream.concat(r, SchemaCQLHelper.getIndexesAsCQL(metadata, ifNotExists)); - } - - return r; + Stream indexes = SchemaCQLHelper.getIndexesAsCQL(metadata, true); + return Stream.of(udts, tableMatadata, indexes).flatMap(Function.identity()); } /** @@ -83,20 +60,25 @@ public class SchemaCQLHelper * that will not contain everything needed for user types. */ @VisibleForTesting - public static String getTableMetadataAsCQL(TableMetadata metadata, - boolean includeDroppedColumns, - boolean internals, - boolean ifNotExists) + public static String getTableMetadataAsCQL(TableMetadata metadata) { if (metadata.isView()) { KeyspaceMetadata keyspaceMetadata = Schema.instance.getKeyspaceMetadata(metadata.keyspace); ViewMetadata viewMetadata = keyspaceMetadata.views.get(metadata.name).orElse(null); assert viewMetadata != null; - return viewMetadata.toCqlString(internals, ifNotExists); + /* + * first argument(withInternals) indicates to include table metadata id and clustering columns order, + * second argument(ifNotExists) instructs to include IF NOT EXISTS statement within creation statements. + */ + return viewMetadata.toCqlString(true, true); } - return metadata.toCqlString(includeDroppedColumns, internals, ifNotExists); + /* + * With addition to withInternals and ifNotExists arguments, includeDroppedColumns will include dropped + * columns as ALTER TABLE statements appended into the snapshot. + */ + return metadata.toCqlString(true, true, true); } /** @@ -162,7 +144,7 @@ public class SchemaCQLHelper private static UserType getType(TableMetadata metadata, Types types, ByteBuffer name) { return types.get(name) - .orElseThrow(() -> new IllegalStateException(String.format("user type %s is part of table %s definition but its definition was missing", + .orElseThrow(() -> new IllegalStateException(String.format("user type %s is part of table %s definition but its definition was missing", UTF8Type.instance.getString(name), metadata))); } diff --git a/src/java/org/apache/cassandra/schema/TableMetadata.java b/src/java/org/apache/cassandra/schema/TableMetadata.java index 7205b9488a..fcd1d58008 100644 --- a/src/java/org/apache/cassandra/schema/TableMetadata.java +++ b/src/java/org/apache/cassandra/schema/TableMetadata.java @@ -1149,17 +1149,17 @@ public class TableMetadata implements SchemaElement } public String toCqlString(boolean includeDroppedColumns, - boolean internals, + boolean withInternals, boolean ifNotExists) { CqlBuilder builder = new CqlBuilder(2048); - appendCqlTo(builder, includeDroppedColumns, internals, ifNotExists); + appendCqlTo(builder, includeDroppedColumns, withInternals, ifNotExists); return builder.toString(); } public void appendCqlTo(CqlBuilder builder, boolean includeDroppedColumns, - boolean internals, + boolean withInternals, boolean ifNotExists) { assert !isView(); @@ -1198,7 +1198,7 @@ public class TableMetadata implements SchemaElement builder.append(" WITH ") .increaseIndent(); - appendTableOptions(builder, internals); + appendTableOptions(builder, withInternals); builder.decreaseIndent(); @@ -1281,9 +1281,9 @@ public class TableMetadata implements SchemaElement .newLine(); } - void appendTableOptions(CqlBuilder builder, boolean internals) + void appendTableOptions(CqlBuilder builder, boolean withInternals) { - if (internals) + if (withInternals) builder.append("ID = ") .append(id.toString()) .newLine() diff --git a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java index 03dc0c5b1b..b74391b797 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java @@ -849,8 +849,7 @@ public class ViewSchemaTest extends ViewAbstractTest String view = createView(createView); ColumnFamilyStore mv = Keyspace.open(keyspace()).getColumnFamilyStore(view); - - assertTrue(SchemaCQLHelper.getTableMetadataAsCQL(mv.metadata(), true, true, true) + assertTrue(SchemaCQLHelper.getTableMetadataAsCQL(mv.metadata()) .startsWith(String.format(viewSnapshotSchema, keyspace(), view, diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/TupleTypeTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/TupleTypeTest.java index f9ef4cc253..c23a32a2a4 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/TupleTypeTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/TupleTypeTest.java @@ -300,7 +300,6 @@ public class TupleTypeTest extends CQLTester TupleType tupleType = testcase.type; createTable("CREATE TABLE %s (pk int, ck " + toCqlType(tupleType) + ", value int, PRIMARY KEY(pk, ck))" + " WITH CLUSTERING ORDER BY (ck "+order.name()+")"); - String cql = SchemaCQLHelper.getTableMetadataAsCQL(currentTableMetadata(), false, false, false); SortedMap map = new TreeMap<>(order.apply(tupleType)); int count = 0; for (ByteBuffer value : testcase.uniqueRows) diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageTest.java index 39b76c39aa..c918810d38 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageTest.java @@ -4638,7 +4638,7 @@ public class CompactStorageTest extends CQLTester ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table); - String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true); + String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()); String expected = "CREATE TABLE IF NOT EXISTS cql_test_keyspace_compact.test_table_compact (\n" + " pk1 varint,\n" + " pk2 ascii,\n" + @@ -4674,7 +4674,7 @@ public class CompactStorageTest extends CQLTester ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table); - String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true); + String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()); String expected = "CREATE TABLE IF NOT EXISTS cql_test_keyspace_counter.test_table_counter (\n" + " pk1 varint,\n" + " pk2 ascii,\n" + @@ -4699,7 +4699,7 @@ public class CompactStorageTest extends CQLTester ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName); - String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true); + String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()); String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" + " pk1 varint,\n" + " reg1 int,\n" + @@ -4721,7 +4721,7 @@ public class CompactStorageTest extends CQLTester " WITH COMPACT STORAGE"); ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName); - assertTrue(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true).contains( + assertTrue(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()).contains( "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" + " pk1 varint,\n" + " reg1 int,\n" + @@ -4743,7 +4743,7 @@ public class CompactStorageTest extends CQLTester ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName); - String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true); + String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()); String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" + " pk1 varint,\n" + " reg1 counter,\n" + @@ -4766,7 +4766,7 @@ public class CompactStorageTest extends CQLTester ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName); - String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true); + String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()); String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" + " pk1 varint,\n" + " ck1 int,\n" + @@ -4789,7 +4789,7 @@ public class CompactStorageTest extends CQLTester ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName); - String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true); + String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()); String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" + " pk1 varint,\n" + " ck1 int,\n" + diff --git a/test/unit/org/apache/cassandra/db/SchemaCQLHelperTest.java b/test/unit/org/apache/cassandra/db/SchemaCQLHelperTest.java index 5a6b69ef0f..03aa32de94 100644 --- a/test/unit/org/apache/cassandra/db/SchemaCQLHelperTest.java +++ b/test/unit/org/apache/cassandra/db/SchemaCQLHelperTest.java @@ -167,7 +167,7 @@ public class SchemaCQLHelperTest extends CQLTester " reg2 varint,\n" + " st1 varint static,\n" + " PRIMARY KEY (pk1, ck1)\n) WITH ID ="; - String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true); + String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()); assertThat(actual, allOf(startsWith(expected), @@ -208,7 +208,7 @@ public class SchemaCQLHelperTest extends CQLTester ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table); // when re-adding, column is present as both column and as dropped column record. - String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true); + String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()); String expected = "CREATE TABLE IF NOT EXISTS cql_test_keyspace_readded_columns.test_table_readded_columns (\n" + " pk1 varint,\n" + " ck1 varint,\n" + @@ -247,7 +247,7 @@ public class SchemaCQLHelperTest extends CQLTester ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table); - assertThat(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true), + assertThat(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()), startsWith( "CREATE TABLE IF NOT EXISTS cql_test_keyspace_create_table.test_table_create_table (\n" + " pk1 varint,\n" + @@ -294,7 +294,7 @@ public class SchemaCQLHelperTest extends CQLTester ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table); - assertThat(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true), + assertThat(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata()), containsString("CLUSTERING ORDER BY (cl1 ASC)\n" + " AND additional_write_policy = 'ALWAYS'\n" + " AND bloom_filter_fp_chance = 1.0\n" + diff --git a/test/unit/org/apache/cassandra/utils/CassandraGenerators.java b/test/unit/org/apache/cassandra/utils/CassandraGenerators.java index 4d51f5c122..169363a1aa 100644 --- a/test/unit/org/apache/cassandra/utils/CassandraGenerators.java +++ b/test/unit/org/apache/cassandra/utils/CassandraGenerators.java @@ -283,7 +283,7 @@ public final class CassandraGenerators { // to make sure the correct indents are taken, convert to CQL, then replace newlines with the indents // then prefix with the indents. - String cql = SchemaCQLHelper.getTableMetadataAsCQL((TableMetadata) value, true, true, false); + String cql = SchemaCQLHelper.getTableMetadataAsCQL((TableMetadata) value); cql = NEWLINE_PATTERN.matcher(cql).replaceAll(Matcher.quoteReplacement("\n " + spacer)); cql = "\n " + spacer + cql; value = cql;