blob: 0b14363496866853284bef1d2d6b11f38b98552b [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.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.apache.ignite.internal.tostring.S;
import org.apache.ignite.internal.util.ArrayUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Full schema descriptor containing key columns chunk, value columns chunk, and schema version.
*/
public class SchemaDescriptor implements Serializable {
/** Table identifier.*/
private final UUID tableId;
/** Schema version. Incremented on each schema modification. */
private final int ver;
/** Key columns in serialization order. */
private final Columns keyCols;
/** Value columns in serialization order. */
private final Columns valCols;
/** Affinity columns. */
private final Column[] affCols;
/** Mapping 'Column name' -> Column. */
private final Map<String, Column> colMap;
/**
* @param tableId Table id.
* @param ver Schema version.
* @param keyCols Key columns.
* @param valCols Value columns.
*/
public SchemaDescriptor(UUID tableId, int ver, Column[] keyCols, Column[] valCols) {
this(tableId, ver, keyCols, null, valCols);
}
/**
* @param tableId Table id.
* @param ver Schema version.
* @param keyCols Key columns.
* @param affCols Affinity column names.
* @param valCols Value columns.
*/
public SchemaDescriptor(UUID tableId, int ver, Column[] keyCols, @Nullable String[] affCols, Column[] valCols) {
assert keyCols.length > 0 : "No key columns are conigured.";
assert valCols.length > 0 : "No value columns are conigured.";
this.tableId = tableId;
this.ver = ver;
this.keyCols = new Columns(0, keyCols);
this.valCols = new Columns(keyCols.length, valCols);
colMap = new HashMap<>(keyCols.length + valCols.length);
Arrays.stream(this.keyCols.columns()).forEach(c -> colMap.put(c.name(), c));
Arrays.stream(this.valCols.columns()).forEach(c -> colMap.put(c.name(), c));
// Preserving key chunk column order is not actually required.
// It is sufficient to has same column order for all nodes.
this.affCols = (ArrayUtils.nullOrEmpty(affCols)) ? keyCols :
Arrays.stream(affCols).map(colMap::get).toArray(Column[]::new);
}
/**
* @return Table identifier.
*/
public UUID tableId() {
return tableId;
}
/**
* @return Schema version.
*/
public int version() {
return ver;
}
/**
* @param idx Column index to check.
* @return {@code true} if the column belongs to the key chunk, {@code false} otherwise.
*/
public boolean isKeyColumn(int idx) {
return idx < keyCols.length();
}
/**
* @param colIdx Column index.
* @return Column instance.
*/
public Column column(int colIdx) {
return colIdx < keyCols.length() ? keyCols.column(colIdx) : valCols.column(colIdx - keyCols.length());
}
/**
* Gets columns names.
*
* @return Columns names.
*/
public Collection<String> columnNames() {
return colMap.keySet();
}
/**
* @return Key columns chunk.
*/
public Columns keyColumns() {
return keyCols;
}
/**
* @return Key affinity columns chunk.
*/
public Column[] affinityColumns() {
return affCols;
}
/**
* @return Value columns chunk.
*/
public Columns valueColumns() {
return valCols;
}
/**
* @return Total number of columns in schema.
*/
public int length() {
return keyCols.length() + valCols.length();
}
/**
* @param name Column name.
* @return Column.
*/
public @Nullable Column column(@NotNull String name) {
return colMap.get(name);
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(SchemaDescriptor.class, this);
}
}