From ee0577e11bd10c16bd3d3f1b7d46f0bb33788921 Mon Sep 17 00:00:00 2001
From: Irina Peshinskaya <ipeshinskaya@sipwise.com>
Date: Wed, 18 Feb 2015 15:55:25 +0200
Subject: [PATCH] MT#11509 Optimize query

Further optimization described in the ticket.

Change-Id: Ie559a888a0e7fb8ed3ffc470349a2faab1b894ab
---
 bin/ngcp-fraud-daily-lock | 43 +++++++++++++++++++++------------------
 1 file changed, 23 insertions(+), 20 deletions(-)

diff --git a/bin/ngcp-fraud-daily-lock b/bin/ngcp-fraud-daily-lock
index f90402c..9062692 100755
--- a/bin/ngcp-fraud-daily-lock
+++ b/bin/ngcp-fraud-daily-lock
@@ -25,28 +25,31 @@ my $o = Sipwise::Provisioning::Billing->new();
 my $db = $o->{database};
 
 my $a = $db->sql_get_all_arrayref(<<"!");
-SELECT 'profile_limit' as type, cdr.source_account_id, SUM(cdr.source_customer_cost) AS daily_cost,
-       contracts.id,
-       billing_profiles.fraud_daily_limit, billing_profiles.fraud_daily_lock, billing_profiles.fraud_daily_notify
-FROM accounting.cdr
-JOIN billing.contracts ON cdr.source_account_id = contracts.id
-JOIN billing.billing_mappings ON contracts.id = billing_mappings.contract_id
-JOIN billing.billing_profiles 
-   ON (billing_profiles.id = 
-        (SELECT m.billing_profile_id
-         FROM billing.billing_mappings m
-         WHERE ((m.start_date IS NULL) OR (m.start_date <= NOW()))
-           AND ((m.end_date IS NULL) OR (m.end_date >= NOW()))
-           AND (m.contract_id = contracts.id)
-         ORDER BY m.start_date DESC LIMIT 1
-        )
+SELECT 'profile_limit' as type, cdr.source_account_id, SUM(cdr.source_customer_cost) AS daily_cost, bpinfo.contract_id,
+  bpinfo.fraud_daily_limit, bpinfo.fraud_daily_lock, bpinfo.fraud_daily_notify
+FROM ( 
+  SELECT contracts.id as contract_id,
+    billing_profiles.fraud_daily_limit, billing_profiles.fraud_daily_lock, billing_profiles.fraud_daily_notify
+  FROM billing.contracts 
+  JOIN billing.billing_mappings ON contracts.id = billing_mappings.contract_id
+  JOIN billing.billing_profiles 
+    ON (billing_profiles.id = 
+      (SELECT m.billing_profile_id
+        FROM billing.billing_mappings m
+        WHERE ((m.start_date IS NULL) OR (m.start_date <= NOW()))
+          AND ((m.end_date IS NULL) OR (m.end_date >= NOW()))
+          AND (m.contract_id = contracts.id)
+        ORDER BY m.start_date DESC LIMIT 1
       )
-WHERE (contracts.status = 'active')
-  AND (DATEDIFF(FROM_UNIXTIME(cdr.start_time), CURDATE()) = 0)
-  AND (billing_profiles.fraud_daily_limit IS NOT NULL)
-  AND (billing_profiles.fraud_daily_limit > 0)
+    )
+  WHERE (contracts.status = 'active')
+    AND (billing_profiles.fraud_daily_limit IS NOT NULL)
+    AND (billing_profiles.fraud_daily_limit > 0)
+) as bpinfo 
+JOIN accounting.cdr ON cdr.source_account_id = bpinfo.contract_id
+WHERE (DATEDIFF(FROM_UNIXTIME(cdr.start_time), CURDATE()) = 0)
 GROUP BY cdr.source_account_id
-HAVING (daily_cost > billing_profiles.fraud_daily_limit)
+HAVING (daily_cost > bpinfo.fraud_daily_limit)
 
 UNION ALL