2012年1月10日火曜日

Slim3 Source Code Reading #3の前に

本日、Slim3 Source Code Reading #3を開催します。

恐らく、今日はGetとTransactionを読む予定になると思いますが、
Queryについても読み進めておく必要がありそうです。

まず、Getから。
GetはDatastore.java835行目の
public static <M> M get(Class<M> modelClass, Key key)
から読み進める事になると思います。

getメソッドの中では、メンバに持っているDatastoreDelegate#getが呼び出されます。(838行目)
これは、putの時と同じです。

DatastoreDelegate#getはいくつかメソッドがありますが、
748行目→769行目→771行目でカレントのトランザクションを取得し、
カレントのトランザクションを利用して1099行目を呼び出します。

1099行目のgetも、中身は非同期のgetAsync()を呼び出すだけです。
return FutureUtil.getQuietly(async.getAsync(tx, modelMeta, key));

FutureUtil.getQuietly()はFuture#get()を呼び出し、非同期の結果を受け取る+例外をキャッチするのみですので、結局「非同期で処理されるのを待つ」という感じでしょうか。
(これは2回目で読んだPutと同じです)

async変数はAsyncDatastoreDelegateクラスなのでそちらに進みます。

AsyncDatastoreDelegate#getAsync()はAsyncDatastoreDelegate.javaの630行目に
あります。
この中では、560行目のgetAsync()をwrapしているだけです。
560行目のgetAsync()は、中で1439行目のgetAsMapAsync()を呼び出します。
ここでは、DatastoreUtil#getAsMapAsync()を呼び出しているだけです。
DatastoreUtil#getAsMapAsync()はAsyncDatastoreService.getを呼び出し、データストアから実際に読み取ります。

ここまでの流れです。

  • Datastore#get()からDatastoreDelegate#get()を呼び出す
    • 748→769→771で、カレントのトランザクションを取得し、1099行目
      • FutureUtil.getQuietly(async.getAsync())
        • AsyncDatastoreDelegate.javaの630→560
          • 1439行目のgetAsMapAsync()を呼び出す。
            • DatastoreUtil.getAsMapAsync()を呼び出す。
              • AsyncDatastoreService#get(tx, keys)
まとめると、カレントのトランザクションで非同期APIを呼び、データストアからエンティティを呼び出す。

エンティティ→modelへの変換はAsyncDatastoreDelegateの640行目で
行われています。
この時点で、データストアから読みだしたタイミングで値を編集するpostGet()も呼び出されます。

明日以降の授業の準備もあるので、今日はここまで。