From e0c753854db4ed1bcd3b0659a29b79f535c1aa08 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Tue, 29 Nov 2016 16:00:16 -0800 Subject: [PATCH] CRM-19690 - AbstractTokenSubscriber - Only evaluate tokens that are used This is more significant with mailing tokens because some of them are fairly sizeable/expensive. --- Civi/Token/AbstractTokenSubscriber.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Civi/Token/AbstractTokenSubscriber.php b/Civi/Token/AbstractTokenSubscriber.php index a7d21f1344..25137b6ac6 100644 --- a/Civi/Token/AbstractTokenSubscriber.php +++ b/Civi/Token/AbstractTokenSubscriber.php @@ -141,10 +141,21 @@ abstract class AbstractTokenSubscriber implements EventSubscriberInterface { if (!$this->checkActive($e->getTokenProcessor())) { return; } - // TODO: check if any tokens for $entity are actually used; short-circuit. + + $messageTokens = $e->getTokenProcessor()->getMessageTokens(); + if (!isset($messageTokens[$this->entity])) { + return; + } + + $activeTokens = array_intersect($messageTokens[$this->entity], array_keys($this->tokenNames)); + if (empty($activeTokens)) { + return; + } + $prefetch = $this->prefetch($e); + foreach ($e->getRows() as $row) { - foreach ($this->tokenNames as $field => $label) { + foreach ($activeTokens as $field) { $this->evaluateToken($row, $this->entity, $field, $prefetch); } } -- 2.25.1