use of org.apache.flink.table.api.ValidationException in project flink by apache.
the class KafkaConnectorOptionsUtil method createValueFormatProjection.
/**
* Creates an array of indices that determine which physical fields of the table schema to
* include in the value format.
*
* <p>See {@link KafkaConnectorOptions#VALUE_FORMAT}, {@link
* KafkaConnectorOptions#VALUE_FIELDS_INCLUDE}, and {@link
* KafkaConnectorOptions#KEY_FIELDS_PREFIX} for more information.
*/
public static int[] createValueFormatProjection(ReadableConfig options, DataType physicalDataType) {
final LogicalType physicalType = physicalDataType.getLogicalType();
Preconditions.checkArgument(physicalType.is(LogicalTypeRoot.ROW), "Row data type expected.");
final int physicalFieldCount = LogicalTypeChecks.getFieldCount(physicalType);
final IntStream physicalFields = IntStream.range(0, physicalFieldCount);
final String keyPrefix = options.getOptional(KEY_FIELDS_PREFIX).orElse("");
final ValueFieldsStrategy strategy = options.get(VALUE_FIELDS_INCLUDE);
if (strategy == ValueFieldsStrategy.ALL) {
if (keyPrefix.length() > 0) {
throw new ValidationException(String.format("A key prefix is not allowed when option '%s' is set to '%s'. " + "Set it to '%s' instead to avoid field overlaps.", VALUE_FIELDS_INCLUDE.key(), ValueFieldsStrategy.ALL, ValueFieldsStrategy.EXCEPT_KEY));
}
return physicalFields.toArray();
} else if (strategy == ValueFieldsStrategy.EXCEPT_KEY) {
final int[] keyProjection = createKeyFormatProjection(options, physicalDataType);
return physicalFields.filter(pos -> IntStream.of(keyProjection).noneMatch(k -> k == pos)).toArray();
}
throw new TableException("Unknown value fields strategy:" + strategy);
}
use of org.apache.flink.table.api.ValidationException in project flink by apache.
the class KafkaConnectorOptionsUtil method initializePartitioner.
/**
* Returns a class value with the given class name.
*/
private static <T> FlinkKafkaPartitioner<T> initializePartitioner(String name, ClassLoader classLoader) {
try {
Class<?> clazz = Class.forName(name, true, classLoader);
if (!FlinkKafkaPartitioner.class.isAssignableFrom(clazz)) {
throw new ValidationException(String.format("Sink partitioner class '%s' should extend from the required class %s", name, FlinkKafkaPartitioner.class.getName()));
}
@SuppressWarnings("unchecked") final FlinkKafkaPartitioner<T> kafkaPartitioner = InstantiationUtil.instantiate(name, FlinkKafkaPartitioner.class, classLoader);
return kafkaPartitioner;
} catch (ClassNotFoundException | FlinkException e) {
throw new ValidationException(String.format("Could not find and instantiate partitioner class '%s'", name), e);
}
}
use of org.apache.flink.table.api.ValidationException in project flink by apache.
the class KafkaConnectorOptionsUtilTest method testMissingKeyFormatProjection.
@Test
public void testMissingKeyFormatProjection() {
final DataType dataType = ROW(FIELD("id", INT()));
final Map<String, String> options = createTestOptions();
final Configuration config = Configuration.fromMap(options);
try {
createKeyFormatProjection(config, dataType);
fail();
} catch (ValidationException e) {
assertThat(e, hasMessage(equalTo("A key format 'key.format' requires the declaration of one or more " + "of key fields using 'key.fields'.")));
}
}
use of org.apache.flink.table.api.ValidationException in project flink by apache.
the class KafkaConnectorOptionsUtilTest method testInvalidKeyFormatFieldProjection.
@Test
public void testInvalidKeyFormatFieldProjection() {
final DataType dataType = ROW(FIELD("id", INT()), FIELD("name", STRING()));
final Map<String, String> options = createTestOptions();
options.put("key.fields", "non_existing");
final Configuration config = Configuration.fromMap(options);
try {
createKeyFormatProjection(config, dataType);
fail();
} catch (ValidationException e) {
assertThat(e, hasMessage(equalTo("Could not find the field 'non_existing' in the table schema for " + "usage in the key format. A key field must be a regular, " + "physical column. The following columns can be selected " + "in the 'key.fields' option:\n" + "[id, name]")));
}
}
use of org.apache.flink.table.api.ValidationException in project flink by apache.
the class KafkaConnectorOptionsUtilTest method testInvalidValueFormatProjection.
@Test
public void testInvalidValueFormatProjection() {
final DataType dataType = ROW(FIELD("k_id", INT()), FIELD("id", STRING()));
final Map<String, String> options = createTestOptions();
options.put("key.fields", "k_id");
options.put("key.fields-prefix", "k_");
final Configuration config = Configuration.fromMap(options);
try {
createValueFormatProjection(config, dataType);
fail();
} catch (ValidationException e) {
assertThat(e, hasMessage(equalTo("A key prefix is not allowed when option 'value.fields-include' " + "is set to 'ALL'. Set it to 'EXCEPT_KEY' instead to avoid field overlaps.")));
}
}
Aggregations