Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Monocle
とかいうのがありまして
2015/05/30 Naoki Aoyama (@aoiroaoino)
おまえ誰だよ?
Naoki Aoyama
Twitte/GtiHub: @aoiroaoino
Maverick., inc
Programmer(Scala, JavaScript)
にゃーん
BSONとかいうのがありまして
BSONは主にMongoDBのデータストレージ及びネッ
トワーク転送フォーマットとして利用されている、
データ交換フォーマットである。 単純なデータ構
造や連想配列(MongoDBではオブジェクトまたは
ドキュメ...
http://mongodb.github.io/mongo-java-driver/3.0/bson/documents/
BSON type - Java type
例えば、こんなBSONがありまして
// bson1
{
"id": 1,
"name": "Aoino",
"address": [
"Tokyo",
"Ibaraki"
]
}
// bson2
[
1,
2,
3
]
BSONデータの作成
(in Java MongoDB Driver)
val bson1 = new BsonDocument()

.append("id", new BsonInt64(1))
.append("name", new Bs...
BSONの操作
(in Java MongoDB Driver)
scala> val reader = new BsonDocumentReader(bison1)
reader: org.bson.BsonDocumentReader = ...
チョットつらい…
Prismを定義してみる
object BSONPrism {
type BSONValue = org.bson.BsonValue
type BSONArray = org.bson.BsonArray
type BSONInt32 = o...
BSONの操作 [1] 

(Scala + Monocle)
(bsonDocument composeOptional index("id")
composePrism bsonInt64
).getOption(bson1)
//=> S...
BSONの操作 [2] 

(Scala + Monocle)
(bsonArray composeOptional index(1)
composePrism bsonInt32
).set(999)(bson2)
//=> BsonArra...
https://github.com/julien-truffaut/Monocle/wiki/Release-note-1.0
Alias methods
\もっと短く書ける/
(bsonDocument ^|-? index("address")
^<-? bsonArray
^|-? index(0)
^<-? bsonString)
.modify(_.toLowerCase)(bison1...
まとめ
MonocleでPrismを定義する方法
Prismを使っての操作方法
もしかしてJavaのライブラリ包む時に便利かも?
Nächste SlideShare
Wird geladen in …5
×

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

2.716 Aufrufe

Veröffentlicht am

2015/05/30 Lens&Prism勉強会

Veröffentlicht in: Software
  • Loggen Sie sich ein, um Kommentare anzuzeigen.

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

×