use of org.apache.ignite.configuration.NamedListView in project ignite-3 by apache.
the class SchemaUtils method columnMapper.
/**
* Prepares column mapper.
*
* @param oldDesc Old schema descriptor.
* @param oldTbl Old table configuration.
* @param newDesc New schema descriptor.
* @param newTbl New table configuration.
* @return Column mapper.
*/
public static ColumnMapper columnMapper(SchemaDescriptor oldDesc, TableView oldTbl, SchemaDescriptor newDesc, TableChange newTbl) {
ColumnMapper mapper = null;
NamedListView<? extends ColumnView> newTblColumns = newTbl.columns();
NamedListView<? extends ColumnView> oldTblColumns = oldTbl.columns();
// because removed keys are simply replaced with nulls
assert newTblColumns.size() >= oldTblColumns.size();
for (int i = 0; i < newTblColumns.size(); ++i) {
ColumnView newColView = newTblColumns.get(i);
// new value can be null if a column has been deleted
if (newColView == null) {
continue;
}
if (i < oldTblColumns.size()) {
ColumnView oldColView = oldTblColumns.get(i);
Column newCol = newDesc.column(newColView.name());
Column oldCol = oldDesc.column(oldColView.name());
if (newCol.schemaIndex() == oldCol.schemaIndex()) {
continue;
}
if (mapper == null) {
mapper = ColumnMapping.createMapper(newDesc);
}
mapper.add(newCol.schemaIndex(), oldCol.schemaIndex());
} else {
// if the new Named List is larger than the old one, it can only mean that a new column has been added
Column newCol = newDesc.column(newColView.name());
assert !newDesc.isKeyColumn(newCol.schemaIndex());
if (mapper == null) {
mapper = ColumnMapping.createMapper(newDesc);
}
mapper.add(newCol);
}
}
// since newTblColumns comes from a TableChange, it will contain nulls for removed columns
Optional<Column> droppedKeyCol = newTblColumns.namedListKeys().stream().filter(k -> newTblColumns.get(k) == null).map(oldDesc::column).filter(c -> oldDesc.isKeyColumn(c.schemaIndex())).findAny();
// TODO: configuration validators.
assert droppedKeyCol.isEmpty() : IgniteStringFormatter.format("Dropping of key column is forbidden: [schemaVer={}, col={}]", newDesc.version(), droppedKeyCol.get());
return mapper == null ? ColumnMapping.identityMapping() : mapper;
}
use of org.apache.ignite.configuration.NamedListView in project ignite-3 by apache.
the class ConfigurationChangerTest method testGetLatestNamedList.
/**
* Tests the {@link DynamicConfigurationChanger#getLatest} method by retrieving different Named List configuration values.
*/
@Test
public void testGetLatestNamedList() throws Exception {
ConfigurationChanger changer = createChanger(DefaultsConfiguration.KEY);
changer.start();
changer.initializeDefaults();
ConfigurationSource source = source(DefaultsConfiguration.KEY, (DefaultsChange change) -> change.changeChildrenList(children -> {
children.create("name1", child -> {
});
children.create("name2", child -> {
});
}));
changer.change(source).get(1, SECONDS);
for (String name : List.of("name1", "name2")) {
NamedListView<DefaultsChildView> childrenListView = changer.getLatest(List.of(node("def"), node("childrenList")));
DefaultsChildView childrenListElementView = childrenListView.get(name);
assertEquals("bar", childrenListElementView.defStr());
assertArrayEquals(new String[] { "xyz" }, childrenListElementView.arr());
childrenListElementView = changer.getLatest(List.of(node("def"), node("childrenList"), listNode(name)));
assertEquals("bar", childrenListElementView.defStr());
assertArrayEquals(new String[] { "xyz" }, childrenListElementView.arr());
String childrenListStrValueView = changer.getLatest(List.of(node("def"), node("childrenList"), listNode(name), node("defStr")));
assertEquals("bar", childrenListStrValueView);
String[] childrenListArrView = changer.getLatest(List.of(node("def"), node("childrenList"), listNode(name), node("arr")));
assertArrayEquals(new String[] { "xyz" }, childrenListArrView);
}
}
use of org.apache.ignite.configuration.NamedListView in project ignite-3 by apache.
the class ValidationUtilTest method validateNamedListNode.
@Test
public void validateNamedListNode() throws Exception {
var rootsNode = new SuperRoot(key -> null, Map.of(ValidatedRootConfiguration.KEY, root));
Validator<NamedListValidation, NamedListView<?>> validator = new Validator<>() {
@Override
public void validate(NamedListValidation annotation, ValidationContext<NamedListView<?>> ctx) {
assertEquals("root.elements", ctx.currentKey());
assertEquals(List.of(), ctx.getOldValue().namedListKeys());
assertEquals(List.of(), ctx.getNewValue().namedListKeys());
ctx.addIssue(new ValidationIssue("bar"));
}
};
Map<Class<? extends Annotation>, Set<Validator<?, ?>>> validators = Map.of(NamedListValidation.class, Set.of(validator));
List<ValidationIssue> issues = ValidationUtil.validate(rootsNode, rootsNode, null, new HashMap<>(), validators);
assertEquals(1, issues.size());
assertEquals("bar", issues.get(0).message());
}
use of org.apache.ignite.configuration.NamedListView in project ignite-3 by apache.
the class TableValidatorImplTest method testMisalignedColumnNamedListKeys.
/**
* Tests that column names and column keys inside a Named List must be equal.
*/
@Test
void testMisalignedColumnNamedListKeys(@InjectConfiguration(polymorphicExtensions = RocksDbDataRegionConfigurationSchema.class) DataStorageConfiguration dbCfg) {
NamedListView<TableView> oldValue = tablesCfg.tables().value();
TableConfiguration tableCfg = tablesCfg.tables().get("table");
CompletableFuture<Void> tableChangeFuture = tableCfg.columns().change(columnsChange -> columnsChange.create("ololo", columnChange -> columnChange.changeName("not ololo").changeType(columnTypeChange -> columnTypeChange.changeType("STRING")).changeNullable(true)));
assertThat(tableChangeFuture, willBe(nullValue(Void.class)));
ValidationContext<NamedListView<TableView>> ctx = mockContext(oldValue, dbCfg.value());
ArgumentCaptor<ValidationIssue> issuesCaptor = validate(ctx);
assertThat(issuesCaptor.getAllValues(), hasSize(1));
assertThat(issuesCaptor.getValue().message(), is(equalTo("Column name \"not ololo\" does not match its Named List key: \"ololo\"")));
}
use of org.apache.ignite.configuration.NamedListView in project ignite-3 by apache.
the class TableValidatorImplTest method testMisalignedIndexNamedListKeys.
/**
* Tests that index names and index keys inside a Named List must be equal.
*/
@Test
void testMisalignedIndexNamedListKeys(@InjectConfiguration(polymorphicExtensions = RocksDbDataRegionConfigurationSchema.class) DataStorageConfiguration dbCfg) {
NamedListView<TableView> oldValue = tablesCfg.tables().value();
TableConfiguration tableCfg = tablesCfg.tables().get("table");
CompletableFuture<Void> tableChangeFuture = tableCfg.indices().change(indicesChange -> indicesChange.create("ololo", indexChange -> indexChange.changeName("not ololo").convert(HashIndexChange.class).changeColNames("id")));
assertThat(tableChangeFuture, willBe(nullValue(Void.class)));
ValidationContext<NamedListView<TableView>> ctx = mockContext(oldValue, dbCfg.value());
ArgumentCaptor<ValidationIssue> issuesCaptor = validate(ctx);
assertThat(issuesCaptor.getAllValues(), hasSize(1));
assertThat(issuesCaptor.getValue().message(), is(equalTo("Index name \"not ololo\" does not match its Named List key: \"ololo\"")));
}
Aggregations