MDL-62117 enrol_paypal: Improve SQL efficiency

This commit is contained in:
Andrew Nicols
2018-05-11 09:30:10 +08:00
parent 023c3d4f0d
commit 3fa0cd9708
2 changed files with 169 additions and 84 deletions
+14 -12
View File
@@ -108,16 +108,17 @@ class provider implements
FROM {enrol_paypal} ep
JOIN {enrol} e ON ep.instanceid = e.id
JOIN {context} ctx ON e.courseid = ctx.instanceid AND ctx.contextlevel = :contextcourse
LEFT JOIN {user} u1 ON LOWER(u1.email) = ep.receiver_email
LEFT JOIN {user} u2 ON LOWER(u2.email) = ep.business
LEFT JOIN {user} u ON u.id = :emailuserid AND (
LOWER(u.email) = ep.receiver_email
OR
LOWER(u.email) = ep.business
)
WHERE ep.userid = :userid
OR u1.id = :receiverid
OR u2.id = :businessid";
OR u.id IS NOT NULL";
$params = [
'contextcourse' => CONTEXT_COURSE,
'userid' => $userid,
'receiverid' => $userid,
'businessid' => $userid,
'emailuserid' => $userid,
];
$contextlist->add_from_sql($sql, $params);
@@ -147,19 +148,20 @@ class provider implements
FROM {enrol_paypal} ep
JOIN {enrol} e ON ep.instanceid = e.id
JOIN {context} ctx ON e.courseid = ctx.instanceid AND ctx.contextlevel = :contextcourse
LEFT JOIN {user} u1 ON LOWER(u1.email) = ep.receiver_email
LEFT JOIN {user} u2 ON LOWER(u2.email) = ep.business
LEFT JOIN {user} u ON u.id = :emailuserid AND (
LOWER(u.email) = ep.receiver_email
OR
LOWER(u.email) = ep.business
)
WHERE ctx.id {$contextsql}
AND (ep.userid = :userid
OR u1.id = :receiverid
OR u2.id = :businessid)
OR u.id IS NOT NULL)
ORDER BY e.courseid";
$params = [
'contextcourse' => CONTEXT_COURSE,
'userid' => $user->id,
'receiverid' => $user->id,
'businessid' => $user->id,
'emailuserid' => $user->id,
];
$params += $contextparams;
+155 -72
View File
@@ -43,12 +43,18 @@ class enrol_paypal_privacy_provider_testcase extends \core_privacy\tests\provide
/** @var stdClass A user whose email address matches the business field in some of the PayPal transactions. */
protected $businessuser2;
/** @var stdClass A user whose email address matches the business field in some of the PayPal transactions. */
protected $businessuser3;
/** @var stdClass A user whose email address matches the receiver_email field in some of the PayPal transactions. */
protected $receiveruser1;
/** @var stdClass A user whose email address matches the receiver_email field in some of the PayPal transactions. */
protected $receiveruser2;
/** @var stdClass A user whose email address matches the receiver_email field in some of the PayPal transactions. */
protected $receiveruser3;
/** @var stdClass A user who is not enrolled in any course. */
protected $student0;
@@ -58,6 +64,9 @@ class enrol_paypal_privacy_provider_testcase extends \core_privacy\tests\provide
/** @var stdClass A student who is only enrolled in course2 with 2 transaction histories in the course. */
protected $student2;
/** @var stdClass A student who is only enrolled in course3 with 1 transaction histories in the course. */
protected $student3;
/** @var stdClass A student who is enrolled in both course1 and course2. */
protected $student12;
@@ -67,6 +76,9 @@ class enrol_paypal_privacy_provider_testcase extends \core_privacy\tests\provide
/** @var stdClass A test course with 2 enrolments for student2 and student12. */
protected $course2;
/** @var stdClass A test course with 2 enrolments for student2 and student12. */
protected $course3;
protected function setUp() {
global $DB;
@@ -77,14 +89,17 @@ class enrol_paypal_privacy_provider_testcase extends \core_privacy\tests\provide
$generator = $this->getDataGenerator();
// Create seller accounts.
$this->businessuser1 = $generator->create_user(['email' => '[email protected]']);
$this->businessuser2 = $generator->create_user(['email' => '[email protected]']);
$this->businessuser1 = $generator->create_user(['email' => 'business[email protected]']);
$this->businessuser2 = $generator->create_user(['email' => 'business[email protected]']);
$this->businessuser3 = $generator->create_user(['email' => '[email protected]']);
$this->receiveruser1 = $generator->create_user(['email' => '[email protected]']);
$this->receiveruser2 = $generator->create_user(['email' => '[email protected]']);
$this->receiveruser3 = $generator->create_user(['email' => '[email protected]']);
// Create courses.
$this->course1 = $generator->create_course();
$this->course2 = $generator->create_course();
$this->course3 = $generator->create_course();
// Create enrolment instances.
$paypalplugin = enrol_get_plugin('paypal');
@@ -97,96 +112,89 @@ class enrol_paypal_privacy_provider_testcase extends \core_privacy\tests\provide
['roleid' => $studentrole->id, 'courseid' => $this->course2->id]);
$enrolinstance2 = $DB->get_record('enrol', array('id' => $enrolinstanceid));
$enrolinstanceid = $paypalplugin->add_instance($this->course3,
['roleid' => $studentrole->id, 'courseid' => $this->course3->id]);
$enrolinstance3 = $DB->get_record('enrol', array('id' => $enrolinstanceid));
// Create students.
$this->student0 = $generator->create_user(); // This user will not be enrolled in any course.
$this->student1 = $generator->create_user();
$this->student2 = $generator->create_user();
$this->student3 = $generator->create_user();
$this->student12 = $generator->create_user();
// Enrol student1 in course1.
$paypalplugin->enrol_user($enrolinstance1, $this->student1->id, $studentrole->id);
$paypaldata = [
'business' => $this->businessuser1->email,
'receiver_email' => $this->receiveruser1->email,
'receiver_id' => 'SELLERSID',
'item_name' => $this->course1->fullname,
'courseid' => $this->course1->id,
'userid' => $this->student1->id,
'instanceid' => $enrolinstance1->id,
'payment_status' => 'Completed',
'txn_id' => 'STUDENT1-IN-COURSE1-00',
'payment_type' => 'instant',
'timeupdated' => time(),
];
$DB->insert_record('enrol_paypal', $paypaldata);
$this->create_enrol_paypal_record(
$this->businessuser1,
$this->receiveruser1,
$this->course1,
$this->student1,
$enrolinstance1,
'STUDENT1-IN-COURSE1-00',
time()
);
// Enrol student2 in course2.
$paypalplugin->enrol_user($enrolinstance2, $this->student2->id, $studentrole->id);
// This user has 2 transaction histories.
// Here is the first one.
$paypaldata = [
'business' => $this->businessuser1->email,
'receiver_email' => $this->receiveruser2->email,
'receiver_id' => 'SELLERSID',
'item_name' => $this->course2->fullname,
'courseid' => $this->course2->id,
'userid' => $this->student2->id,
'instanceid' => $enrolinstance2->id,
'payment_status' => 'Completed',
'txn_id' => 'STUDENT2-IN-COURSE2-00',
'payment_type' => 'instant',
'timeupdated' => time() - 86400, // Yesterday.
];
$DB->insert_record('enrol_paypal', $paypaldata);
$this->create_enrol_paypal_record(
$this->businessuser1,
$this->receiveruser2,
$this->course2,
$this->student2,
$enrolinstance2,
'STUDENT2-IN-COURSE2-00',
// Yesterday.
time() - DAYSECS
);
// And now, the second one.
$paypaldata = [
'business' => $this->businessuser1->email,
'receiver_email' => $this->receiveruser2->email,
'receiver_id' => 'SELLERSID',
'item_name' => $this->course2->fullname,
'courseid' => $this->course2->id,
'userid' => $this->student2->id,
'instanceid' => $enrolinstance2->id,
'payment_status' => 'Completed',
'txn_id' => 'STUDENT2-IN-COURSE2-01',
'payment_type' => 'instant',
'timeupdated' => time(),
];
$DB->insert_record('enrol_paypal', $paypaldata);
$this->create_enrol_paypal_record(
$this->businessuser1,
$this->receiveruser2,
$this->course2,
$this->student2,
$enrolinstance2,
'STUDENT2-IN-COURSE2-01',
time()
);
// Enrol student12 in course1 and course2.
// First in course1.
$paypalplugin->enrol_user($enrolinstance1, $this->student12->id, $studentrole->id);
$paypaldata = [
'business' => $this->businessuser2->email,
'receiver_email' => $this->receiveruser1->email,
'receiver_id' => 'SELLERSID',
'item_name' => $this->course1->fullname,
'courseid' => $this->course1->id,
'userid' => $this->student12->id,
'instanceid' => $enrolinstance1->id,
'payment_status' => 'Completed',
'txn_id' => 'STUDENT12-IN-COURSE1-00',
'payment_type' => 'instant',
'timeupdated' => time(),
];
$DB->insert_record('enrol_paypal', $paypaldata);
$this->create_enrol_paypal_record(
$this->businessuser2,
$this->receiveruser1,
$this->course1,
$this->student12,
$enrolinstance1,
'STUDENT12-IN-COURSE1-00',
time()
);
// Then in course2.
$paypalplugin->enrol_user($enrolinstance2, $this->student12->id, $studentrole->id);
$paypaldata = [
'business' => $this->businessuser2->email,
'receiver_email' => $this->receiveruser2->email,
'receiver_id' => 'SELLERSID',
'item_name' => $this->course2->fullname,
'courseid' => $this->course2->id,
'userid' => $this->student12->id,
'instanceid' => $enrolinstance2->id,
'payment_status' => 'Completed',
'txn_id' => 'STUDENT12-IN-COURSE2-00',
'payment_type' => 'instant',
'timeupdated' => time(),
];
$DB->insert_record('enrol_paypal', $paypaldata);
$this->create_enrol_paypal_record(
$this->businessuser2,
$this->receiveruser2,
$this->course2,
$this->student12,
$enrolinstance2,
'STUDENT12-IN-COURSE2-00',
time()
);
// Enrol student3 in course3 with businessuser3 as the receiver.
$paypalplugin->enrol_user($enrolinstance1, $this->student1->id, $studentrole->id);
$this->create_enrol_paypal_record(
$this->businessuser3,
$this->receiveruser3,
$this->course3,
$this->student3,
$enrolinstance3,
'STUDENT3-IN-COURSE3-00',
time()
);
}
/**
@@ -259,6 +267,51 @@ class enrol_paypal_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertContains($coursecontext2->id, $contextids);
}
/**
* Test for provider::get_contexts_for_userid with a user who is a receiver.
*/
public function test_get_contexts_for_userid_receiver() {
$coursecontext1 = context_course::instance($this->course1->id);
$coursecontext2 = context_course::instance($this->course2->id);
// Receiver User 1 is the Receiver of one course.
$contextlist = provider::get_contexts_for_userid($this->receiveruser1->id);
$this->assertCount(1, $contextlist);
$contextids = $contextlist->get_contextids();
$this->assertEquals([$coursecontext1->id], $contextids);
// Receiver User 2 is the Receiver of course.
$contextlist = provider::get_contexts_for_userid($this->receiveruser2->id);
$this->assertCount(1, $contextlist);
$contextids = $contextlist->get_contextids();
$this->assertEquals([$coursecontext2->id], $contextids);
}
/**
* Test for provider::get_contexts_for_userid with a user who is a business.
*/
public function test_get_contexts_for_userid_business() {
$coursecontext1 = context_course::instance($this->course1->id);
$coursecontext2 = context_course::instance($this->course2->id);
$coursecontext3 = context_course::instance($this->course3->id);
// Business User 1 is the Receiver of course 1 and course 2.
$contextlist = provider::get_contexts_for_userid($this->businessuser1->id);
$this->assertCount(2, $contextlist);
$contextids = $contextlist->get_contextids();
$this->assertEquals([$coursecontext1->id, $coursecontext2->id], $contextids, '', 0.0, 1, true);
// Business User 3 is the Receiver of course 3 only.
$contextlist = provider::get_contexts_for_userid($this->businessuser3->id);
$this->assertCount(1, $contextlist);
$contextids = $contextlist->get_contextids();
$this->assertEquals([$coursecontext3->id], $contextids);
}
/**
* Test for provider::export_user_data().
*/
@@ -580,4 +633,34 @@ class enrol_paypal_privacy_provider_testcase extends \core_privacy\tests\provide
$DB->count_records('enrol_paypal', ['receiver_email' => $this->receiveruser2->email])
);
}
/**
* Helper function to create an enrol_paypal record.
*
* @param \stdClass $business The user associated with the business
* @param \stdClass $receiver The user associated with the receiver
* @param \stdClass $course The course to associate with
* @param \stdClass $user The user associated with the student
* @param \stdClass $enrol The enrolment instance
* @param String $txnid The Paypal txnid to use
* @param int $time The txn time
*/
protected function create_enrol_paypal_record($business, $receiver, $course, $user, $enrol, $txnid, $time) {
global $DB;
$paypaldata = [
'business' => $business->email,
'receiver_email' => $receiver->email,
'receiver_id' => 'SELLERSID',
'item_name' => $course->fullname,
'courseid' => $course->id,
'userid' => $user->id,
'instanceid' => $enrol->id,
'payment_status' => 'Completed',
'txn_id' => $txnid,
'payment_type' => 'instant',
'timeupdated' => $time,
];
$DB->insert_record('enrol_paypal', $paypaldata);
}
}