2017-04-11 3 views
2

私は開始日と終了日を持つZODBカタログクエリを持っています。 end_dateで結果をソートし、次にstart_dateでソートします。Plone - ZODBカタログクエリsort_on複数のインデックス?

end_dateまたはstart_dateのいずれかでソートすると問題ありません。

タプル(start_date,end_date)で試しましたが、運がありません。

これを達成する方法はありますか、後でカスタム論理を採用する必要がありますか?

+0

「Products.ZCatalog.Catalog」を見ると、この機能は存在しないため、ヒットセットのサイズとバッチサイズ/サイズのさまざまな組み合わせに対してあらゆる種類の奇数化(sic)を行うため、制限する。 –

+0

私はあなたの質問にフォーラムにリンクを投稿しましたが、私たちのフォーラム、community.plone.orgに投稿して回答を得られます。 –

+0

あなたの質問のタイトルと本文を編集してください:これはZODBについてではありません。 Plone(または他のZope 2)アプリケーションでProducts.ZCatalogのソートを行う方法について。 ZODBは単なるオブジェクト・パーシスタンス・レイヤーです。このような問合せ結果のソートはもちろん、問合せ機能は提供しません。私はあなたがZODBに言及するそれぞれのケースで "カタログクエリ"を意味すると思います。 – sdupton

答えて

3

一般的な回答は、カタログの脳全体の結果セットのポストホックでなければなりません。zope.sequencesortPyPI経由、ただしPloneに同梱)などを使用してください。

より複雑な答えは、あなたがする必要が知っている、あなたが何をしているかを知っていればあなただけダウンした最適化のウサギの穴である:あなたがそのあなたの頭脳を並べ替えるないときを確認してください

  1. をユーザーは、同じカタログインデックスと頭脳(メタデータ)を取得するために、少なくともキャッシュアフィニティのために同じインスタンスへのスティッキーセッションを取得します。
  2. ユーザーは、後続のバッチで戻ってくる必要がある場合は、ソートされた要求全体の要求(スレッドグローバル)に一意のセッションIDと一連のカタログRID(整数)値をキャッシュできます。もちろん、RIDはZCatalogの脳のレイジーシーケンスに再構成する必要があり、これにはいくつかのノウハウが必要です(またはソースを読む必要があります)。
  3. 最後に、大きな結果(数千個)のセットの場合、現在のバッチのポストホックソートによってn個のバッチの終わりまで正確に近似するアプリケーション固有の妥協案を作成することが合理的であることを提案しますnはlenに逆比例します(site.portal_catalog.uniqueValuesFor(indexnamehere))。大きな結果セットの場合、近似二次ソートの正確さは高バラツキの場合は高く、バラツキが低い場合は低くなります(2次バリューが同じ多くのアイテムはバッチサイズよりもはるかに大きいため、イライラすることがあります)。

特に大きな結果セットを扱っていない限り、最適化しないでください。

最適化する場合は、実際に優れた結果(プロファイルとベンチマーク)が得られていることを確認する必要があります。これを行う時間を投資することを正当化できない場合は、最適化を正当化することはできません。

+0

ありがとう!私はあなたの発言に従って私の質問を編集しました。プラス:この特定のケースでは、相対的に少数のアイテムを扱うので、私は 'zope.sequencesort 'で取り除くことができると思います。 –

関連する問題