Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Monocleとかいうのがありまして

2.714 visualizaciones

Publicado el

2015/05/30 Lens&Prism勉強会

Publicado en: Software
  • Inicia sesión para ver los comentarios

Monocleとかいうのがありまして

  1. 1. Monocle とかいうのがありまして 2015/05/30 Naoki Aoyama (@aoiroaoino)
  2. 2. おまえ誰だよ? Naoki Aoyama Twitte/GtiHub: @aoiroaoino Maverick., inc Programmer(Scala, JavaScript) にゃーん
  3. 3. BSONとかいうのがありまして BSONは主にMongoDBのデータストレージ及びネッ トワーク転送フォーマットとして利用されている、 データ交換フォーマットである。 単純なデータ構 造や連想配列(MongoDBではオブジェクトまたは ドキュメントと表す)を示すバイナリ構造であ り、 名称はJSON由来であり"バイナリ型JSON"の略 語である。(wikipedia - BSON より)
  4. 4. http://mongodb.github.io/mongo-java-driver/3.0/bson/documents/ BSON type - Java type
  5. 5. 例えば、こんなBSONがありまして // bson1 { "id": 1, "name": "Aoino", "address": [ "Tokyo", "Ibaraki" ] } // bson2 [ 1, 2, 3 ]
  6. 6. BSONデータの作成 (in Java MongoDB Driver) val bson1 = new BsonDocument()
 .append("id", new BsonInt64(1)) .append("name", new BsonString("Aoino")) .append("address", new BsonArray(Arrays.asList( new BsonString("Tokyo"), new BsonString("Ibaraki"))) val bson2 = new BsonArray(Arrays.asList( new BsonInt32(1), new BsonInt32(2), new BsonInt32(3)))
  7. 7. BSONの操作 (in Java MongoDB Driver) scala> val reader = new BsonDocumentReader(bison1) reader: org.bson.BsonDocumentReader = org.bson.BsonDocumentReader@2d81357d scala> reader.readStartDocument() scala> reader.readName() res33: String = id scala> reader.readInt64() res34: Long = 1 scala> reader.readString() // あっ、readName()忘れた! res35: String = Aoino scala> reader.readName() res36: String = address scala> reader.readString() // BsonArrayに対してreadString()呼んじゃった! org.bson.BsonInvalidOperationException: readString can only be called when CurrentBSONType is STRING, not when CurrentBSONType is ARRAY. at org.bson.AbstractBsonReader.verifyBSONType(AbstractBsonReader.java:655) at org.bson.AbstractBsonReader.checkPreconditions(AbstractBsonReader.java:687) at org.bson.AbstractBsonReader.readString(AbstractBsonReader.java:428) ... 43 elided
  8. 8. チョットつらい…
  9. 9. Prismを定義してみる object BSONPrism { type BSONValue = org.bson.BsonValue type BSONArray = org.bson.BsonArray type BSONInt32 = org.bson.BsonInt32 type BSONInt64 = … val bsonArray = Prism[BSONValue, List[BSONValue]]{ case x: BSONArray => Option(x.getValues.toList) case _ => None }(new BSONArray(_)) val bsonInt32 = Prism[BSONValue, Int]{ case x: BSONInt32 => Option(x.getValue) case _ => None }(new BSONInt32(_)) … }
  10. 10. BSONの操作 [1] 
 (Scala + Monocle) (bsonDocument composeOptional index("id") composePrism bsonInt64 ).getOption(bson1) //=> Some(1) (bsonDocument composeOptional index("address") composePrism bsonArray composeOptional index(0) composePrism bsonString ).modify(_.toLowerCase)(bson1) //=> { "id" : { "$numberLong" : "1" }, "name" : "Aoino", "address" : ["tokyo", "Ibaraki"]} ※(1)
  11. 11. BSONの操作 [2] 
 (Scala + Monocle) (bsonArray composeOptional index(1) composePrism bsonInt32 ).set(999)(bson2) //=> BsonArray{values=[ BsonInt32{value=1},BsonInt32{value=999},BsonInt32{value=3}]} ※(2) (bsonArray composeTraversal each composePrism bsonInt32 ).modify(_ * 100)(bson2) //=> BsonArray{values=[ BsonInt32{value=100},BsonInt32{value=200},BsonInt32{value=300}]} ※(3)
  12. 12. https://github.com/julien-truffaut/Monocle/wiki/Release-note-1.0 Alias methods
  13. 13. \もっと短く書ける/ (bsonDocument ^|-? index("address") ^<-? bsonArray ^|-? index(0) ^<-? bsonString) .modify(_.toLowerCase)(bison1) //=> (1)に同じ (bsonArray ^|-? index(1) ^<-? bsonInt32 ).set(999)(bson) //=> ※(2)に同じ (bsonArray ^|->> each ^<-? bsonInt32 ).modify(_ * 1000)(bson) //=> ※(3)に同じ
  14. 14. まとめ MonocleでPrismを定義する方法 Prismを使っての操作方法 もしかしてJavaのライブラリ包む時に便利かも?

×