Как создать логический тип AVRO для проверки данных с помощью регулярного выражения - PullRequest
0 голосов
/ 29 сентября 2019

Я новичок в 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 ...)");

    }
}

Большое спасибо ввперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...