2017-04-11 8 views
2

시작 날짜와 종료 날짜가있는 ZODB 카탈로그 쿼리가 있습니다. end_date에서 결과를 먼저 정렬 한 다음 start_date에서 결과를 정렬하고 싶습니다.Plone - ZODB 카탈로그 쿼리 sort_on 여러 색인?

end_date 또는 start_date에서 정렬하면 정상적으로 작동합니다.

튜플 (start_date,end_date)을 사용해 보았지만 행운이 없습니다.

이 방법이 있습니까? 아니면 나중에 사용자 지정 논리를 사용해야합니까?

+0

'Products.ZCatalog.Catalog'를 살펴보면,이 기능은 존재하지 않으며 히트 세트 크기 및 배치 크기/크기의 다양한 조합에 대해 모든 종류의 oddtimizations (sic)를 수행하기 때문에 쉽게 갱신 할 수 없습니다. 한도. –

+0

귀하의 질문에 포럼에 링크를 게시 했는데도 forum.contone.org에 게시하여 답변을 얻는 것이 더 나을 것입니다 –

+0

질문의 제목과 본문을 수정하십시오 : ZODB에 관한 것이 아니라 Plone (또는 다른 Zope 2) 응용 프로그램에서 Products.ZCatalog의 정렬을 수행하는 방법에 대해 설명합니다. ZODB는 단지 개체 영속 계층 일 뿐이며 쿼리 기능을 제공하지 않으며 이러한 쿼리 결과를 정렬하는 것은 물론입니다. ZODB에 대해 언급 할 때마다 "카탈로그 쿼리"를 의미한다고 생각합니다. – sdupton

답변

3

일반화 된 답변은 카탈로그 머리글의 전체 결과 집합을 post-hoc-sort로 처리해야하며 zope.sequencesort (PyPI을 통해 있지만 이미 Plone과 함께 제공됨) 또는 유사하게 사용하십시오.

더 복잡한 대답은 당신은 단지 당신이 필요 알고있는 경우에 가서 당신이 무엇을하고 있는지 알아야 최적화의 토끼 구멍이다 : 당신은 두뇌를 정렬 할 때

  1. 하는 것이 있는지 확인하십시오 귀하를 사용자는 동일한 카탈로그 인덱스와 두뇌 (메타 데이터)를 얻기 위해 적어도 캐시 친 화성을 위해 동일한 인스턴스에 대한 고정 세션을 얻습니다.
  2. 사용자는 이후의 일괄 처리에서 돌아오고 필요할 것으로 예상되는 경우 전체 정렬 된 요청에 대한 고유 한 세션 ID 및 일련의 카탈로그 RID (정수) 값을 요청 (스레드 전역)에 캐싱 할 수 있습니다. 물론, RID는 ZCatalog의 뇌의 게으른 시퀀스로 다시 구성되어야하며 이는 몇 가지 노하우가 필요합니다 (또는 소스를 읽는 것).
  3. 마지막으로 큰 결과 (수천) 세트의 경우, 현재 일괄 처리의 사후 정렬을 통해 n 일괄 처리의 끝까지 알맞은 응용 프로그램 별 절충안을 작성하는 것이 합리적이라고 제안 할 것입니다 여기서 n은 len에 반비례합니다 (site.portal_catalog.uniqueValuesFor (indexnamehere)). 큰 결과 집합의 경우 근사치 2 차 정렬의 정확성은 높은 변동성에 대해서는 높고 낮은 변동성에 대해서는 낮습니다 (2 차 값이 동일한 많은 항목은 배치 크기보다 훨씬 많으므로 실망스럽게 만듭니다).

특별히 큰 결과 집합을 처리하지 않는 한 최적화하지 마십시오.

최적화가 필요한 경우 실제로 결과가 우수하다는 것을 확인해야합니다 (프로필 및 벤치 마크). 이 작업을 수행하는 데 투자하는 것을 정당화 할 수 없다면 최적화를 정당화 할 수 없습니다.

+0

감사합니다! 귀하의 의견에 따라 제 질문을 편집했습니다. 플러스 : 나는이 특별한 경우에 상대적으로 작은 수의 항목을 다루기 때문에'zope.sequencesort '로 도망 갈 수 있다고 생각한다. –