2016-05-17 12 views
2

Я новичок в AVRO и, пожалуйста, извините меня, если это простой вопрос. У меня есть вариант использования, когда я использую схему AVRO для записи вызовов.Проверка данных в AVRO

Скажем, у меня есть Avro схемы

{ 
    "name": "abc", 
    "namepsace": "xyz", 
    "type": "record", 
    "fields": [ 
     {"name": "CustId", "type":"string"}, 
     {"name": "SessionId", "type":"string"}, 
    ] 
} 

Теперь, если вход как

{ 
    "CustId" : "abc1234" 
    "sessionID" : "000-0000-00000" 
} 

Я хочу использовать некоторые регулярные выражения валидаций для этих полей, и я хочу взять этот вход, только если речь идет о в определенном формате, показанном выше. Есть ли способ указать в схеме avro включить выражение регулярных выражений?

Любые другие форматы сериализации данных, которые поддерживают что-то вроде этого?

ответ

2

Для этого вы должны использовать пользовательский logical type. Затем вы включаете регулярные выражения непосредственно в схему.

Например, вот как можно было бы реализовать один в JavaScript:

var avro = require('avsc'), 
    util = require('util'); 

/** 
* Sample logical type that validates strings using a regular expression. 
* 
*/ 
function ValidatedString(attrs, opts) { 
    avro.types.LogicalType.call(this, attrs, opts); 
    this._pattern = new RegExp(attrs.pattern); 
} 
util.inherits(ValidatedString, avro.types.LogicalType); 

ValidatedString.prototype._fromValue = function (val) { 
    if (!this._pattern.test(val)) { 
    throw new Error('invalid string: ' + val); 
    } 
    return val; 
}; 

ValidatedString.prototype._toValue = ValidatedString.prototype._fromValue; 

И как вы будете использовать его:

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 

Вы можете прочитать больше о внедрении и использовании логических типов here.

Edit: Для реализации Java, я полагаю, вы хотите посмотреть на следующие классы:

  • LogicalType, основание вам нужно расширить.
  • Conversion, чтобы выполнить преобразование (или подтверждение в вашем случае) данных.
  • LogicalTypes и Conversions, несколько примеров существующих реализаций.
  • TestGenericLogicalTypes, соответствующие испытания, которые могут послужить полезной отправной точкой.
+0

Является ли это уникальной особенностью библиотеки javascript? – monkjack

+0

Реализация Java также поддерживает логические типы. Они были введены сравнительно недавно в спецификации, но, надеюсь, в ближайшее время появятся в большинстве реализаций. – mtth

+0

Это потрясающий пример. Является ли реализация Java выпущена сейчас? Можете ли вы указать мне на javadocs, если это возможно? Спасибо в Advance – user2166328