More efficient order querying when mask is set.
authorIain Patterson <me@iain.cx>
Thu, 7 Apr 2016 15:30:24 +0000 (11:30 -0400)
committerIain Patterson <me@iain.cx>
Thu, 7 Apr 2016 15:30:36 +0000 (11:30 -0400)
Use a join against the area and city instead of first finding all
contacts in the desired location.

lib/order.php

index 3e3556f..2476ef1 100644 (file)
@@ -42,7 +42,7 @@
     exit;
   }
 
-  function show_orders($requester_ids = null, $beneficiary_ids = null, $state_mask = null) {
+  function show_orders($city_id = null, $area_id = null, $requester_ids = null, $beneficiary_ids = null, $state_mask = null) {
     list($first_page, $per_page) = pagination();
     /* XXX: Use Propel methods. */
     if (isset($state_mask)) $order_ids = get_order_ids_by_state($state_mask);
     if (isset($beneficiary_ids)) $q->filterByBeneficiaryId($beneficiary_ids);
     # XXX: Doesn't work.
     #if (isset($state_mask)) $q->useOrderStateQuery()->addSelectQuery($latest_state, 'latestState')->where("order_id=latestState.order_id")->where("state & $state_mask")->endUse();
+    if (isset($city_id) || isset($area_id)) {
+      $q->joinWith('Order.Beneficiary');
+      $q->joinWith('Beneficiary.Address');
+      if (isset($area_id)) $q->where('Address.AreaId=?', $area_id);
+      if (isset($city_id)) {
+        $q->joinWith('Address.Area');
+        $q->where('Area.CityId=?', $city_id);
+      }
+    }
     if (isset($state_mask)) $q->filterById($order_ids);
     $orders = $q->orderByDate('desc')->orderById('desc')->paginate($first_page, $per_page);
     if (count($orders)) {
     if (isset($city_id)) $city = get_city_by_id($city_id);
     else if ($city_name) $city = get_city_by_name($city_name);
     if ($city) {
-      $contacts = get_city_contacts($city->getId(), $GLOBALS['ROLE_BENEFICIARY']);
-      $beneficiary_ids = array();
-      foreach ($contacts as $contact) $beneficiary_ids[] = $contact->getId();
-
       echo "<p>Orders in city " . $city->getLink(get_city_displayname($city)) . ":";
-      return show_orders(null, $beneficiary_ids, $state_mask);
+      return show_orders($city->getId(), null, null, null, $state_mask);
     }
     else echo "<p>No such city!</p>\n";
   }
@@ -81,7 +86,7 @@
     else if ($contact_name) $contact = get_contact_by_name($contact_name);
     if ($contact) {
       echo "<p>Orders from referrer " . $contact->getLink() . ":";
-      return show_orders($contact->getId(), null, $state_mask);
+      return show_orders(null, null, $contact->getId(), null, $state_mask);
     }
     else echo "<p>No such contact!</p>\n";
   }
@@ -91,7 +96,7 @@
     else if ($contact_name) $contact = get_contact_by_name($contact_name);
     if ($contact) {
       echo "<p>Orders to beneficiary " . $contact->getLink() . ":";
-      return show_orders(null, $contact->getId(), $state_mask);
+      return show_orders(null, null, null, $contact->getId(), $state_mask);
     }
     else echo "<p>No such contact!</p>\n";
   }
     if (isset($area_id)) $area = get_area_by_id($area_id);
     else if ($area_name) $area = get_area_by_name($area_name);
     if ($area) {
-      $contacts = get_area_contacts($area->getId(), $GLOBALS['ROLE_BENEFICIARY']);
-      $contact_ids = array();
-      foreach ($contacts as $contact) $contact_ids[] = $contact->getId();
-
       echo "<p>Orders in area " . $area->getLink() . ":";
-      return show_orders(null, $contact_ids, $state_mask);
+      return show_orders(null, $area->getId(), null, null, $state_mask);
     }
     else echo "<p>No such area!</p>\n";
   }
     }
   }
   else if (isset($id)) show_order($id);
-  else if ($state_mask) show_orders(null, null, $state_mask);
+  else if ($state_mask) show_orders(null, null, null, null, $state_mask);
 
   show_order_forms($city_id, $state_mask);
   show_add_new_order_form($city_id);