in baremaps-calcite/src/main/java/org/apache/baremaps/calcite/data/DataTableFactory.java [52:108]
public Table create(
SchemaPlus schema,
String name,
Map<String, Object> operand,
RelDataType rowType) {
String file = (String) operand.get("file");
if (file == null) {
throw new RuntimeException("A file should be specified");
}
try {
Memory<MappedByteBuffer> memory = new MemoryMappedDirectory(Paths.get(file));
ByteBuffer header = memory.header();
// For new tables, initialize with schema
if (rowType != null) {
// Create and serialize schema
Map<String, Object> schemaMap = new HashMap<>();
schemaMap.put("name", name);
schemaMap.put("columns", rowType.getFieldList().stream()
.map(field -> {
Map<String, Object> column = new HashMap<>();
column.put("name", field.getName());
column.put("cardinality",
field.getType().isNullable() ? DataColumn.Cardinality.OPTIONAL.name()
: DataColumn.Cardinality.REQUIRED.name());
column.put("sqlTypeName", field.getType().getSqlTypeName().name());
return column;
})
.toList());
// Serialize and write schema to header
byte[] schemaBytes = new ObjectMapper().writeValueAsBytes(schemaMap);
header.putLong(0L);
header.putInt(schemaBytes.length);
header.put(schemaBytes);
}
// Read schema and create table
header.position(0);
long size = header.getLong();
int length = header.getInt();
byte[] bytes = new byte[length];
header.get(bytes);
DataTableSchema dataSchema =
DataTableSchema.read(new ByteArrayInputStream(bytes), TYPE_FACTORY);
DataRowType dataRowType = new DataRowType(dataSchema);
DataCollection<DataRow> dataCollection = AppendOnlyLog.<DataRow>builder()
.dataType(dataRowType)
.memory(memory)
.build();
return new DataModifiableTable(name, dataSchema, dataCollection, TYPE_FACTORY);
} catch (IOException e) {
throw new RuntimeException(e);
}
}