blob: abca1d7618f3fe79727b57437f99a7173f0a788e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.internal.schema;
import java.util.Map;
import org.apache.ignite.schema.SchemaBuilders;
import org.apache.ignite.schema.definition.ColumnType;
import org.apache.ignite.schema.definition.SchemaObject;
import org.apache.ignite.schema.definition.TableDefinition;
import org.apache.ignite.schema.definition.builder.TableSchemaBuilder;
import org.junit.jupiter.api.Test;
/**
*
*/
public class SchemaConfigurationTest {
/**
*
*/
@Test
public void testInitialSchema() {
final TableSchemaBuilder builder = SchemaBuilders.tableBuilder(SchemaObject.DEFAULT_DATABASE_SCHEMA_NAME, "table1");
builder
.columns(
// Declaring columns in user order.
SchemaBuilders.column("id", ColumnType.INT64).build(),
SchemaBuilders.column("label", ColumnType.stringOf(2)).withDefaultValueExpression("AI").build(),
SchemaBuilders.column("name", ColumnType.string()).asNonNull().build(),
SchemaBuilders.column("data", ColumnType.blobOf(255)).asNullable().build(),
SchemaBuilders.column("affId", ColumnType.INT32).build()
)
.withPrimaryKey(
SchemaBuilders.primaryKey() // Declare index column in order.
.withColumns("id", "affId", "name")
.withAffinityColumns("affId") // Optional affinity declaration. If not set, all columns will be affinity cols.
.build()
)
// 'withIndex' single entry point allows extended index support.
// E.g. we may want to support Geo-index later with some plugin.
.withIndex(
SchemaBuilders.sortedIndex("idx_1_sorted")
.addIndexColumn("id").desc().done()
.addIndexColumn("name").asc().done()
.withHints(Map.of("INLINE_SIZE", "42", "INLINE_STRATEGY", "INLINE_HASH")) // In-line key-hash as well.
.build()
)
.withIndex(
SchemaBuilders.partialIndex("idx_2_partial")
.addIndexColumn("id").desc().done()
.addIndexColumn("name").asc().done()
.withExpression("id > 0")
.withHints(Map.of("INLINE_COLUMNS", "id"))
.build()
)
.withIndex(
SchemaBuilders.hashIndex("idx_3_hash")
.withColumns("id", "affId")
.build()
)
.build();
}
/**
*
*/
@Test
public void testSchemaModification() {
final TableDefinition table = SchemaBuilders.tableBuilder("PUBLIC", "table1")
.columns(
// Declaring columns in user order.
SchemaBuilders.column("id", ColumnType.INT64).build(),
SchemaBuilders.column("name", ColumnType.string()).build()
)
.withPrimaryKey("id")
.build();
table.toBuilder()
.addColumn(
SchemaBuilders.column("firstName", ColumnType.string())
.asNonNull()
.build()
)
.addKeyColumn( // It looks safe to add non-affinity column to key.
SchemaBuilders.column("subId", ColumnType.string())
.asNonNull()
.build()
)
.alterColumn("firstName")
.withNewName("lastName")
.withNewDefault("ivanov")
.asNullable()
.convertTo(ColumnType.stringOf(100))
.done()
.dropColumn("name") // Key column can't be dropped.
.addIndex(
SchemaBuilders.sortedIndex("sortedIdx")
.addIndexColumn("subId").done()
.withHints(Map.of("INLINE_SIZE", "73"))
.build()
)
.dropIndex("hash_idx")
.apply();
}
}