private static String formatFieldType(final FieldInfo field, final String keyField) { if (field.getName().equals("ROWTIME") || field.getName().equals("ROWKEY")) { return String.format("%-16s %s", schemaToTypeString(field.getSchema()), "(system)"); } else if (keyField != null && keyField.contains("." + field.getName())) { return String.format("%-16s %s", schemaToTypeString(field.getSchema()), "(key)"); } else { return schemaToTypeString(field.getSchema()); } }
private static SchemaInfo buildSchemaEntity(final Schema schema) { switch (schema.type()) { case ARRAY: case MAP: return new SchemaInfo( getSchemaTypeString(schema.type()), null, buildSchemaEntity(schema.valueSchema()) ); case STRUCT: return new SchemaInfo( getSchemaTypeString(schema.type()), schema.fields() .stream() .map( f -> new FieldInfo(f.name(), buildSchemaEntity(f.schema()))) .collect(Collectors.toList()), null ); default: return new SchemaInfo(getSchemaTypeString(schema.type()), null, null); } }
private void printSchema(final List<FieldInfo> fields, final String keyField) { final Table.Builder tableBuilder = new Table.Builder(); if (!fields.isEmpty()) { tableBuilder.withColumnHeaders("Field", "Type"); fields.forEach( f -> tableBuilder.withRow(f.getName(), formatFieldType(f, keyField))); tableBuilder.build().print(this); } }
@SuppressWarnings("ConstantConditions") private static String schemaToTypeString(final SchemaInfo schema) { // For now just dump the whole type out into 1 string. // In the future we should consider a more readable format switch (schema.getType()) { case ARRAY: return SchemaInfo.Type.ARRAY.name() + "<" + schemaToTypeString(schema.getMemberSchema().get()) + ">"; case MAP: return SchemaInfo.Type.MAP.name() + "<" + SchemaInfo.Type.STRING + ", " + schemaToTypeString(schema.getMemberSchema().get()) + ">"; case STRUCT: return schema.getFields().get() .stream() .map(f -> f.getName() + " " + schemaToTypeString(f.getSchema())) .collect(Collectors.joining(", ", SchemaInfo.Type.STRUCT.name() + "<", ">")); case STRING: return "VARCHAR(STRING)"; default: return schema.getType().name(); } }
private void shouldBuildCorrectPrimitiveField(final Schema primitiveSchema, final String schemaName) { final Schema schema = SchemaBuilder .struct() .field("field", primitiveSchema) .build(); final List<FieldInfo> entity = EntityUtil.buildSourceSchemaEntity(schema); assertThat(entity.size(), equalTo(1)); assertThat(entity.get(0).getName(), equalTo("field")); assertThat(entity.get(0).getSchema().getTypeName(), equalTo(schemaName)); assertThat(entity.get(0).getSchema().getFields(), equalTo(Optional.empty())); assertThat(entity.get(0).getSchema().getMemberSchema(), equalTo(Optional.empty())); }
@Test public void shouldBuildCorrectArrayField() { final Schema schema = SchemaBuilder .struct() .field("field", SchemaBuilder.array(SchemaBuilder.INT64_SCHEMA)) .build(); final List<FieldInfo> entity = EntityUtil.buildSourceSchemaEntity(schema); assertThat(entity.size(), equalTo(1)); assertThat(entity.get(0).getName(), equalTo("field")); assertThat(entity.get(0).getSchema().getTypeName(), equalTo("ARRAY")); assertThat(entity.get(0).getSchema().getFields(), equalTo(Optional.empty())); assertThat(entity.get(0).getSchema().getMemberSchema().get().getTypeName(), equalTo("BIGINT")); }
@Test public void shouldBuildCorrectMapField() { final Schema schema = SchemaBuilder .struct() .field("field", SchemaBuilder.map(Schema.STRING_SCHEMA, Schema.INT32_SCHEMA)) .build(); final List<FieldInfo> entity = EntityUtil.buildSourceSchemaEntity(schema); assertThat(entity.size(), equalTo(1)); assertThat(entity.get(0).getName(), equalTo("field")); assertThat(entity.get(0).getSchema().getTypeName(), equalTo("MAP")); assertThat(entity.get(0).getSchema().getFields(), equalTo(Optional.empty())); assertThat(entity.get(0).getSchema().getMemberSchema().get().getTypeName(), equalTo("INTEGER")); }
@Test public void shouldBuildMiltipleFieldsCorrectly() { final Schema schema = SchemaBuilder .struct() .field("field1", Schema.INT32_SCHEMA) .field("field2", Schema.INT64_SCHEMA) .build(); final List<FieldInfo> entity = EntityUtil.buildSourceSchemaEntity(schema); assertThat(entity.size(), equalTo(2)); assertThat(entity.get(0).getName(), equalTo("field1")); assertThat(entity.get(0).getSchema().getTypeName(), equalTo("INTEGER")); assertThat(entity.get(1).getName(), equalTo("field2")); assertThat(entity.get(1).getSchema().getTypeName(), equalTo("BIGINT")); } }
@Test public void shouldBuildCorrectStructField() { final Schema schema = SchemaBuilder .struct() .field( "field", SchemaBuilder. struct() .field("innerField", Schema.STRING_SCHEMA) .build()) .build(); final List<FieldInfo> entity = EntityUtil.buildSourceSchemaEntity(schema); assertThat(entity.size(), equalTo(1)); assertThat(entity.get(0).getName(), equalTo("field")); assertThat(entity.get(0).getSchema().getTypeName(), equalTo("STRUCT")); assertThat(entity.get(0).getSchema().getFields().get().size(), equalTo(1)); final FieldInfo inner = entity.get(0).getSchema().getFields().get().get(0); assertThat(inner.getSchema().getTypeName(), equalTo("STRING")); assertThat(entity.get(0).getSchema().getMemberSchema(), equalTo(Optional.empty())); }
assertThat(deserialized.get(0).getName(), equalTo("l1integer")); assertThat( deserialized.get(0).getSchema(), equalTo( new SchemaInfo(SchemaInfo.Type.INTEGER, null, null))); assertThat(deserialized.get(1).getName(), equalTo("l1struct")); final SchemaInfo structSchema = deserialized.get(1).getSchema(); assertThat(structSchema.getType(), equalTo(SchemaInfo.Type.STRUCT)); assertThat(structSchema.getMemberSchema(), equalTo(Optional.empty())); assertThat(structSchema.getFields().get().size(), equalTo(2)); assertThat(structSchema.getFields().get().get(0).getName(), equalTo("l2string")); assertThat( structSchema.getFields().get().get(0).getSchema(), equalTo( new SchemaInfo(SchemaInfo.Type.STRING, null, null))); assertThat(structSchema.getFields().get().get(1).getName(), equalTo("l2integer")); assertThat( structSchema.getFields().get().get(1).getSchema(), equalTo( new SchemaInfo(SchemaInfo.Type.INTEGER, null, null)));