Я новичок в AVRO, пытаюсь создать собственный логический тип, который может проверять данные AVRO с использованием регулярных выражений, так же как и варианты использования из этого вопроса: Проверка данных в AVRO
var type = avro.parse({
name: 'Example',
type: 'record',
fields: [
{
name: 'custId',
type: 'string' // Normal (free-form) string.
},
{
name: 'sessionId',
type: {
type: 'string',
logicalType: 'validated-string',
pattern: '^\\d{3}-\\d{4}-\\d{5}$' // Validation pattern.
}
},
]
}, {logicalTypes: {'validated-string': ValidatedString}});
type.isValid({custId: 'abc', sessionId: '123-1234-12345'}); // true
type.isValid({custId: 'abc', sessionId: 'foobar'}); // false
Но пример написан на JS.Однако, как реализовать это с помощью Java, я закончу читать этот вопрос:
Как определить LogicalType в Avro.(java)
В настоящее время я расширяю пользовательский класс логического типа, как указано выше:
Следующий код JS в демонстрационном ответе может получить шаблон RegExp из схемы.
function ValidatedString(attrs, opts) {
avro.types.LogicalType.call(this, attrs, opts);
this._pattern = new RegExp(attrs.pattern);
}
Мой вопрос: как я могу расширить класс Conversion / LogicalType, как код JS?Насколько я понимаю, я создаю класс преобразования и логического типа, но как я могу использовать шаблон RegExp из файла схемы AVRO для проверки новых данных?
import org.apache.avro.LogicalType;
public class RegExpLogicalType extends LogicalType {
//The key to use as a reference to the type
public static final String REGEXP_LOGICAL_TYPE_NAME = "regexp";
public String regexp_pattern;
RegExpLogicalType() {
super(REGEXP_LOGICAL_TYPE_NAME);
}
private RegExpLogicalType(String regexp_pattern) {
super(REGEXP_LOGICAL_TYPE_NAME);
this.regexp_pattern = regexp_pattern;
}
}
public class RegExpConversion extends Conversion<ByteBuffer> {
private static final RegExpConversion INSTANCE = new RegExpConversion();
public static final RegExpConversion get(){ return INSTANCE; }
private RegExpConversion(){ super(); }
...
@Override
public ByteBuffer fromBytes(ByteBuffer value, Schema schema, LogicalType type) {
/* How can I get the RegExp pattern from the the Schema pre defined? */
String regexp_pattern = ?????;
/* So I can use the pattern to validate value in the following code */
if (Pattern.matches(regexp_pattern, new String(value.array(), StandardCharsets.UTF_8))) {
return value;
}
throw new IllegalArgumentException("Invalid pattern : " + value + " (must be ...)");
}
}
Большое спасибо ввперед.