Commit 55f2fd4d authored by Romain Courteaud's avatar Romain Courteaud Committed by Alain Takoudjou

Reduce number of JOIN

parent 21c51eb3
......@@ -116,31 +116,36 @@ class AcknowledgementTool(BaseTool):
document_list = []
if user_name is not None:
portal = self.getPortalObject()
now = DateTime()
# First look at all event that define the current user as destination
all_document_list = [x for x in \
self.portal_catalog(portal_type = portal_type,
simulation_state = self.getPortalTransitInventoryStateList(),
# start_date = {'query':now,'range':'max'},
# stop_date = {'query':now,'range':'min'},
default_destination_reference=user_name)]
# Now we can look directly at acknowledgement document not approved yet
# so not in a final state
final_state_list = self.getPortalCurrentInventoryStateList()
query = NegatedQuery(Query(simulation_state=final_state_list))
all_document_list.extend([x for x in \
self.portal_catalog(portal_type = portal_type,
query=query,
# start_date = {'query':now,'range':'max'},
# stop_date = {'query':now,'range':'min'},
destination_reference=user_name)])
for document in all_document_list:
# We filter manually on dates until a good solution is found for
# searching by dates on the catalog
if (document.getStartDate() < now < (document.getStopDate()+1)):
acknowledged = document.isAcknowledged(user_name=user_name)
if not acknowledged:
document_list.append(document.getRelativeUrl())
person_value = portal.ERP5Site_getAuthenticatedMemberPersonValue(
user_name=user_name)
if person_value is None:
raise ValueError('No user found')
else:
now = DateTime()
# First look at all event that define the current user as destination
all_document_list = [x for x in \
self.portal_catalog(portal_type = portal_type,
simulation_state = self.getPortalTransitInventoryStateList(),
# start_date = {'query':now,'range':'max'},
# stop_date = {'query':now,'range':'min'},
default_destination_uid=person_value.getUid())]
# Now we can look directly at acknowledgement document not approved yet
# so not in a final state
final_state_list = self.getPortalCurrentInventoryStateList()
query = NegatedQuery(Query(simulation_state=final_state_list))
all_document_list.extend([x for x in \
self.portal_catalog(portal_type = portal_type,
query=query,
# start_date = {'query':now,'range':'max'},
# stop_date = {'query':now,'range':'min'},
default_destination_uid=person_value.getUid())])
for document in all_document_list:
# We filter manually on dates until a good solution is found for
# searching by dates on the catalog
if (document.getStartDate() < now < (document.getStopDate()+1)):
acknowledged = document.isAcknowledged(user_name=user_name)
if not acknowledged:
document_list.append(document.getRelativeUrl())
else:
raise ValueError('No user name given')
return document_list
......
  • What's the problem exactly with more JOINs ? Of course, the query was slower, but was it pathological to the point that filtering at ZODB level is faster ? Anyway, the following line crashes when stop_date is not defined:

              if (document.getStartDate() < now < (document.getStopDate()+1)):

    With Python 3, we'd have the same issue for start_date.

    /cc @seb @vpelletier @kazuhiko

  • The join which is avoided here is a category->catalog join, by replacing a $RELATION_$COLUMN with a $RELATION_uid condition. This is a good optimisation to me: ERP5 can quickly (or there is something seriously wrong in ERP5Site_getAuthenticatedMemberPersonValue) reach the most catalog-friendly value (an UID), so it should do that.

    I cannot comment on whether all destinations are necessarily Person documents - though it looks consistent with variable naming here.

  • Argg sorry for the noise. I had the feeling to see that this commit replaced catalog date comparison by Python. This commit is fine. I have a regression in my project but it seems to be elsewhere.

Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment