読者です 読者をやめる 読者になる 読者になる

DatastoreOperations.EXPLAINの謎

#ajn3のぼくのライトニングwトーク、で話題になった"EXPLAIN"についてもう少し情報を出します。

基本的に調査中のものと思ってもらった方がよいのですが、開発サーバーでも本番でもこのサービス呼び出しは動作します。

行きはcom.google.apphosting.api.DatastorePb.Query、帰りはQueryExplanationです。


実際の呼び出しは下記のように行います。

// pbのqueryを引数とするので、とりあえずよんでおく。
com.google.apphosting.api.DatastorePb.Query request = new com.google.apphosting.api.DatastorePb.Query();
request.setApp(APPID);
request.setKind(KIND_NAME);

System.out.println(DatastoreOperations.RUN_QUERY.call(request).toFlatString());
QueryExplanation explanation = DatastoreOperations.EXPLAIN.call(request);

System.out.println(explanation.toFlatString());

System.out.println("= getNativeLimit =");
System.out.println(explanation.getNativeLimit());

System.out.println("= getNativeOffset =");
System.out.println(explanation.getNativeOffset());

System.out.println("= getMessageAppender =");
System.out.println(explanation.getMessageAppender());

// エラーになる(NLP) たぶんなんらかの条件に該当するqueryを発行する必要がある
System.out.println("= getMutableNativeIndex =");
System.out.println(explanation.getMutableNativeIndex(0));

// エラーになる(NLP) たぶんなんらかの条件に該当するqueryを発行する必要がある
System.out.println("= getNativeIndex =");
System.out.println(explanation.getNativeIndex(0));

ほかにも呼び出し可能なメソッドはありますが、めぼしいものだけ記載しています。


queryの発行対象は適切なkindとしていて、値もちゃんと戻ってきているのですが、

= getNativeLimit =
0
= getNativeOffset =
0
= getMessageAppender =
{}
= getNativeIndex =
// ここから先はエラーになる

という戻りです(query.toFlatStringは省略)。


soft schemeの情報を出すようにも見えるし、でもそれは(動かなかったりもするけど)getSchemeもあるし、会場から指摘があったようになんとなく実行計画のようにも見えなくはないです。

limitという言葉からはいわゆる「制約」を連想させますが、Mutableなものを取得可能であるというのも、実行計画とするのであれば違和感があります。


うーん、何かわかる人がいたら教えてください。