2016-05-17 5 views
2

私はAVROを初めてお使いになり、簡単な質問があればよろしくお願いいたします。 レコードコールにAVROスキーマを使用しているユースケースがあります。AVROのデータ検証

のは、私が入力

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

のようなものである場合

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

は、今私は、これらのフィールドのためにいくつかの正規表現の検証を使用したいと私はそれが来た場合にのみ、この入力を取りたいアブロスキーマを持っているとしましょう特に上述のようなフォーマットである。正規表現を含めるためにavroスキーマで指定する方法はありますか?

これをサポートする他のデータシリアル化形式はどれですか?

答えて

2

この場合、カスタムlogical typeを使用できるはずです。その後、スキーマに直接正規表現を含めることになります。

たとえば、ここにあなたがJavaScriptで1を実装してみましょう:

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を実装し、使用方法の詳細を読むことができます。

編集:

  • LogicalType、あなたが拡張する必要がありますベース:Java実装のために、私はあなたが以下のクラスを見てみたいと考えています。
  • Conversion、データの変換(またはあなたのケースでの検証)を実行する。
  • LogicalTypesおよびConversionsは、既存の実装のいくつかの例です。
  • TestGenericLogicalTypes、有用な出発点を提供する可能性のある関連テスト。
+0

これはjavascriptライブラリに固有の機能ですか? – monkjack

+0

Java実装は既に論理型もサポートしています。比較的最近になって仕様に導入されましたが、間もなくほとんどの実装でうまくいくはずです。 – mtth

+0

これは素晴らしい例です。 Java実装は今リリースされていますか?可能であれば、javadocsを教えてください。ありがとうございました – user2166328