Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,288 views

Published on

2015/05/30 Lens&Prism勉強会

Published in: Software
  • Be the first to comment

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のライブラリ包む時に便利かも?

×