0

私の目標は、文字列として提供された属性に基づいてエンティティの絶対ランクを計算することです。私が使用している基本的なアプローチは、クエリを発行し、その結果を降順で並べ替えて、特定のエンティティの属性値よりも大きいすべての結果をカウントすることです。クエリは次のようになります

int rank = o.query(Entity.class).order(String.format("-%s",attribute)).
           .filter(String.format("%s >", attribute), something).count();

しかし、何かが行き詰まっている部分です。私がobjectifyの概念を理解している限り、特定のエンティティメンバーを照会することは問題外です。次のステップは、(醜いが開発時間の点では速い)if-constructを使用して特定のエンティティメンバーを識別するか、リフレクションの使用を開始する(少し醜いが開発時間の点では遅い)ことです。

いずれにせよ、私はこのタスクを達成するためのいくつかの明白なおよび/またはエレガントな方法を逃しているという感覚を残されています。助言がありますか?どうも。

4

1 に答える 1

1

私がこれを正しく理解していれば、最初のエンティティが必要で、残りのエンティティの数が必要ですか? これを行うには、次の 2 つの方法があります。

  1. 2 つのクエリを使用します。limit(1)最初のエンティティを返す >= で使用します。最初に開始しますが、2 番目と並行して非同期に実行されるように結果を具体化しないでください。
  2. の代わりにcount()、>= を使用してキーのみのクエリを実行します。フェッチを行う最初のキーを保持し、残りを手動で数えます。キーのみのクエリは、count() クエリと同じ (カウントあたりの操作数が少ない) コストがかかります。

私はおそらく#2で行くでしょう。いずれにせよ、カウントが大きくないことを願っています。そうしないと、多くの小さなデータストア操作を大量に処理し、アプリが高価になるからです!

于 2012-08-01T16:48:50.670 に答える