in java/clickhouse-connector/src/main/java/com/epam/deltix/timebase/connector/clickhouse/algos/SchemaProcessor.java [119:166]
private List<ColumnDeclarationEx> getColumnDeclarations(RecordClassDescriptor...rcds) {
Map<String, ColumnDeclarationEx> allColumnNames = new HashMap<>();
List<ColumnDeclarationEx> columnDeclarations = new ArrayList<>();
if (schemaOptions.isIncludePartitionColumn()) {
ColumnDeclarationEx partition = new ColumnDeclarationEx(PARTITION_COLUMN_NAME,
new DateDataType(), true, false);
columnDeclarations.add(partition);
}
ColumnDeclarationEx timestamp = new ColumnDeclarationEx(TIMESTAMP_COLUMN_NAME,
new DateTime64DataType(9), false, false);
columnDeclarations.add(timestamp);
ColumnDeclarationEx instrument = new ColumnDeclarationEx(INSTRUMENT_COLUMN_NAME,
new StringDataType(), false, true);
columnDeclarations.add(instrument);
columnDeclarations.add(new ColumnDeclarationEx(TYPE_COLUMN_NAME, new StringDataType(), false, true));
for (RecordClassDescriptor descriptor : rcds) {
RecordLayout recordLayout = new RecordLayout(descriptor);
List<ColumnDeclarationEx> dataColumns = new ArrayList<>();
final NonStaticFieldLayout[] nonStaticFields = recordLayout.getNonStaticFields();
if (nonStaticFields == null)
continue;
for (NonStaticFieldLayout dataField : nonStaticFields) {
ColumnDeclarationEx columnDeclarationStream = getColumnDeclaration(descriptor, dataField);
dataColumns.add(columnDeclarationStream);
}
for (int i = 0; i < dataColumns.size(); i++) {
ColumnDeclarationEx column = dataColumns.get(i);
ColumnDeclarationEx columnProcessed = allColumnNames.get(column.getDbColumnName());
if (columnProcessed != null) {
if (!columnProcessed.getDbDataType().getSqlDefinition().equals(column.getDbDataType().getSqlDefinition())) {
throw new DuplicateKeyException(String.format("Type: %s generates multiple columns with the same name (%s) but different types. " +
"Try using splitByTypes or change columnNamingScheme", descriptor.getName(), column.getDbColumnName()));
}
} else {
columnDeclarations.add(column);
allColumnNames.put(column.getDbColumnName(), column);
}
}
}
return columnDeclarations;
}