From ef8f084cc6dea48a45f4efea94f6adcdfda40507 Mon Sep 17 00:00:00 2001 From: andyjdavis Date: Wed, 5 Jan 2011 14:12:27 +0800 Subject: [PATCH 1/6] gradebook MDL-25769 fixed the loading of users in the grader report --- grade/report/grader/lib.php | 54 ++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index d3bedfe4649..ef1a81585e0 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -333,24 +333,33 @@ class grade_report_grader extends grade_report { public function load_users() { global $CFG, $DB; - list($usql, $gbrparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); + //limit to users with a gradeable role + list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); + //limit to users with an active enrollment + list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); + + //fields we need from the user table + $userfields = user_picture::fields('u', array('idnumber')); + + //if the user has clicked one of the sort asc/desc arrows if (is_numeric($this->sortitemid)) { - $params = array_merge(array('gitemid'=>$this->sortitemid), $gbrparams, $this->groupwheresql_params); + $params = array_merge(array('gitemid'=>$this->sortitemid), $gradebookrolesparams, $this->groupwheresql_params, $enrolledparams); // the MAX() magic is required in order to please PG $sort = "MAX(g.finalgrade) $this->sortorder"; - $ufields = user_picture::fields('u', array('idnumber')); - $sql = "SELECT $ufields - FROM {user} u - JOIN {role_assignments} ra ON ra.userid = u.id - $this->groupsql - LEFT JOIN {grade_grades} g ON (g.userid = u.id AND g.itemid = :gitemid) - WHERE ra.roleid $usql AND u.deleted = 0 - $this->groupwheresql - AND ra.contextid ".get_related_contexts_string($this->context)." - GROUP BY $ufields - ORDER BY $sort"; + $sql = "SELECT $userfields + FROM {user} u + JOIN ($enrolledsql) je ON je.id = u.id + JOIN {role_assignments} ra ON ra.userid = u.id + $this->groupsql + LEFT JOIN {grade_grades} g ON (g.userid = u.id AND g.itemid = :gitemid) + WHERE ra.roleid $gradebookrolessql + AND u.deleted = 0 + AND ra.contextid ".get_related_contexts_string($this->context)." + $this->groupwheresql + GROUP BY $userfields + ORDER BY $sort"; } else { switch($this->sortitemid) { @@ -363,17 +372,18 @@ class grade_report_grader extends grade_report { $sort = "u.idnumber $this->sortorder"; break; } - $params = array_merge($gbrparams, $this->groupwheresql_params); + $params = array_merge($gradebookrolesparams, $this->groupwheresql_params, $enrolledparams); - $userfields = user_picture::fields('u', array('idnumber')); $sql = "SELECT DISTINCT $userfields - FROM {user} u - JOIN {role_assignments} ra ON u.id = ra.userid - $this->groupsql - WHERE ra.roleid $usql AND u.deleted = 0 - $this->groupwheresql - AND ra.contextid ".get_related_contexts_string($this->context)." - ORDER BY $sort"; + FROM {user} u + JOIN ($enrolledsql) je ON je.id = u.id + JOIN {role_assignments} ra ON u.id = ra.userid + $this->groupsql + WHERE ra.roleid $gradebookrolessql + AND u.deleted = 0 + AND ra.contextid ".get_related_contexts_string($this->context)." + $this->groupwheresql + ORDER BY $sort"; } From b61e4f46246b2da6d9de081f4faf0782edc6f383 Mon Sep 17 00:00:00 2001 From: andyjdavis Date: Thu, 6 Jan 2011 11:55:22 +0800 Subject: [PATCH 2/6] gradebook MDL-25769 fixed grade/import/lib.php get_unenrolled_users_in_import() --- grade/import/lib.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) mode change 100755 => 100644 grade/import/lib.php diff --git a/grade/import/lib.php b/grade/import/lib.php old mode 100755 new mode 100644 index 574b35487db..5c438ee7dfa --- a/grade/import/lib.php +++ b/grade/import/lib.php @@ -163,7 +163,11 @@ function get_unenrolled_users_in_import($importcode, $courseid) { global $CFG, $DB; $relatedctxcondition = get_related_contexts_string(get_context_instance(CONTEXT_COURSE, $courseid)); - list($usql, $params) = $DB->get_in_or_equal(explode(',', $CFG->gradebookroles)); + //users with a gradeable role + list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $CFG->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); + + //enrolled users + list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); $sql = "SELECT giv.id, u.firstname, u.lastname, u.idnumber AS useridnumber, COALESCE(gi.idnumber, gin.itemname) AS gradeidnumber @@ -171,16 +175,17 @@ function get_unenrolled_users_in_import($importcode, $courseid) { {grade_import_values} giv JOIN {user} u ON giv.userid = u.id LEFT JOIN {grade_items} gi ON gi.id = giv.itemid - LEFT JOIN {grade_import_newitem} gin ON gin.id = giv.newgradeitem + LEFT JOIN {grade_import_newitem} gin ON gin.id = giv.newgradeitem + LEFT JOIN ($enrolledsql) je ON je.id = u.id LEFT JOIN {role_assignments} ra ON (giv.userid = ra.userid AND - ra.roleid $usql AND + ra.roleid $gradebookrolessql AND ra.contextid $relatedctxcondition) WHERE giv.importcode = ? - AND ra.id IS NULL + AND (ra.id IS NULL OR je.id IS NULL) ORDER BY gradeidnumber, u.lastname, u.firstname"; $params[] = $importcode; - return $DB->get_records_sql($sql, $params); + return $DB->get_records_sql($sql, array_merge($gradebookrolesparams, $enrolledparams)); } /** From 387815db61b71087a449961518fcde1ef6b33710 Mon Sep 17 00:00:00 2001 From: andyjdavis Date: Thu, 6 Jan 2011 15:04:37 +0800 Subject: [PATCH 3/6] gradebook MDL-25769 fixed up the grader report --- grade/report/grader/lib.php | 16 +++++++++++----- grade/report/lib.php | 12 ++++++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) mode change 100755 => 100644 grade/report/lib.php diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index ef1a81585e0..65c274a54ba 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -1279,20 +1279,25 @@ class grade_report_grader extends grade_report { $totalcount = $this->get_numusers($grouponly); - list($usql, $rolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); + //limit to users with a gradeable role + list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); + + //limit to users with an active enrollment + list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); if ($showaverages) { - $params = array_merge(array('courseid'=>$this->courseid), $rolesparams, $groupwheresqlparams); + $params = array_merge(array('courseid'=>$this->courseid), $gradebookrolesparams, $enrolledparams, $groupwheresqlparams); // find sums of all grade items in course $SQL = "SELECT g.itemid, SUM(g.finalgrade) AS sum FROM {grade_items} gi JOIN {grade_grades} g ON g.itemid = gi.id JOIN {user} u ON u.id = g.userid + JOIN ($enrolledsql) je ON je.id = u.id JOIN {role_assignments} ra ON ra.userid = u.id $groupsql WHERE gi.courseid = :courseid - AND ra.roleid $usql + AND ra.roleid $gradebookrolessql AND ra.contextid ".get_related_contexts_string($this->context)." AND g.finalgrade IS NOT NULL $groupwheresql @@ -1306,15 +1311,16 @@ class grade_report_grader extends grade_report { // MDL-10875 Empty grades must be evaluated as grademin, NOT always 0 // This query returns a count of ungraded grades (NULL finalgrade OR no matching record in grade_grades table) - $params = array_merge(array('courseid'=>$this->courseid), $rolesparams, $groupwheresqlparams); + $params = array_merge(array('courseid'=>$this->courseid), $params); $SQL = "SELECT gi.id, COUNT(u.id) AS count FROM {grade_items} gi CROSS JOIN {user} u + JOIN ($enrolledsql) je ON je.id = u.id JOIN {role_assignments} ra ON ra.userid = u.id LEFT OUTER JOIN {grade_grades} g ON (g.itemid = gi.id AND g.userid = u.id AND g.finalgrade IS NOT NULL) $groupsql WHERE gi.courseid = :courseid - AND ra.roleid $usql + AND ra.roleid $gradebookrolessql AND ra.contextid ".get_related_contexts_string($this->context)." AND g.id IS NULL $groupwheresql diff --git a/grade/report/lib.php b/grade/report/lib.php old mode 100755 new mode 100644 index 45540a9ff71..9ca00972adc --- a/grade/report/lib.php +++ b/grade/report/lib.php @@ -274,7 +274,14 @@ abstract class grade_report { $groupsql = ""; $groupwheresql = ""; - list($usql, $params) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); + + //limit to users with a gradeable role + list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); + + //limit to users with an active enrollment + list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); + + $params = array_merge($gradebookrolesparams, $enrolledparams); if ($groups) { $groupsql = $this->groupsql; @@ -284,9 +291,10 @@ abstract class grade_report { $countsql = "SELECT COUNT(DISTINCT u.id) FROM {user} u + JOIN ($enrolledsql) je ON je.id = u.id JOIN {role_assignments} ra ON u.id = ra.userid $groupsql - WHERE ra.roleid $usql AND u.deleted = 0 + WHERE ra.roleid $gradebookrolessql AND u.deleted = 0 $groupwheresql AND ra.contextid ".get_related_contexts_string($this->context); return $DB->count_records_sql($countsql, $params); From 2dc5e58466634b125e28d972193d1da09e43158d Mon Sep 17 00:00:00 2001 From: andyjdavis Date: Fri, 7 Jan 2011 10:02:31 +0800 Subject: [PATCH 4/6] gradebook MDL-25769 fixed some problems identified by peer review --- grade/import/lib.php | 8 +++++--- grade/report/grader/lib.php | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/grade/import/lib.php b/grade/import/lib.php index 5c438ee7dfa..8d7463b4dd0 100644 --- a/grade/import/lib.php +++ b/grade/import/lib.php @@ -167,7 +167,8 @@ function get_unenrolled_users_in_import($importcode, $courseid) { list($gradebookrolessql, $gradebookrolesparams) = $DB->get_in_or_equal(explode(',', $CFG->gradebookroles), SQL_PARAMS_NAMED, 'grbr0'); //enrolled users - list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); + $context = get_context_instance(CONTEXT_COURSE, $courseid); + list($enrolledsql, $enrolledparams) = get_enrolled_sql($context); $sql = "SELECT giv.id, u.firstname, u.lastname, u.idnumber AS useridnumber, COALESCE(gi.idnumber, gin.itemname) AS gradeidnumber @@ -175,7 +176,7 @@ function get_unenrolled_users_in_import($importcode, $courseid) { {grade_import_values} giv JOIN {user} u ON giv.userid = u.id LEFT JOIN {grade_items} gi ON gi.id = giv.itemid - LEFT JOIN {grade_import_newitem} gin ON gin.id = giv.newgradeitem + LEFT JOIN {grade_import_newitem} gin ON gin.id = giv.newgradeitem LEFT JOIN ($enrolledsql) je ON je.id = u.id LEFT JOIN {role_assignments} ra ON (giv.userid = ra.userid AND ra.roleid $gradebookrolessql AND @@ -183,9 +184,10 @@ function get_unenrolled_users_in_import($importcode, $courseid) { WHERE giv.importcode = ? AND (ra.id IS NULL OR je.id IS NULL) ORDER BY gradeidnumber, u.lastname, u.firstname"; + $params = array_merge($gradebookrolesparams, $enrolledparams); $params[] = $importcode; - return $DB->get_records_sql($sql, array_merge($gradebookrolesparams, $enrolledparams)); + return $DB->get_records_sql($sql, $params); } /** diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 65c274a54ba..e90c4914560 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -1311,7 +1311,6 @@ class grade_report_grader extends grade_report { // MDL-10875 Empty grades must be evaluated as grademin, NOT always 0 // This query returns a count of ungraded grades (NULL finalgrade OR no matching record in grade_grades table) - $params = array_merge(array('courseid'=>$this->courseid), $params); $SQL = "SELECT gi.id, COUNT(u.id) AS count FROM {grade_items} gi CROSS JOIN {user} u From f2491a11a1a00c0ebaaba6aa1e2b5e34f2652a74 Mon Sep 17 00:00:00 2001 From: andyjdavis Date: Mon, 10 Jan 2011 12:04:51 +0800 Subject: [PATCH 5/6] gradebook MDL-25769 switched a query over to use named params --- grade/import/lib.php | 4 ++-- grade/report/grader/lib.php | 40 ++++++++++++++++++------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/grade/import/lib.php b/grade/import/lib.php index 8d7463b4dd0..331a80a0eb9 100644 --- a/grade/import/lib.php +++ b/grade/import/lib.php @@ -181,11 +181,11 @@ function get_unenrolled_users_in_import($importcode, $courseid) { LEFT JOIN {role_assignments} ra ON (giv.userid = ra.userid AND ra.roleid $gradebookrolessql AND ra.contextid $relatedctxcondition) - WHERE giv.importcode = ? + WHERE giv.importcode = :importcode AND (ra.id IS NULL OR je.id IS NULL) ORDER BY gradeidnumber, u.lastname, u.firstname"; $params = array_merge($gradebookrolesparams, $enrolledparams); - $params[] = $importcode; + $params['importcode'] = $importcode; return $DB->get_records_sql($sql, $params); } diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index e90c4914560..5c591cece7d 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -349,17 +349,17 @@ class grade_report_grader extends grade_report { $sort = "MAX(g.finalgrade) $this->sortorder"; $sql = "SELECT $userfields - FROM {user} u - JOIN ($enrolledsql) je ON je.id = u.id - JOIN {role_assignments} ra ON ra.userid = u.id - $this->groupsql - LEFT JOIN {grade_grades} g ON (g.userid = u.id AND g.itemid = :gitemid) - WHERE ra.roleid $gradebookrolessql - AND u.deleted = 0 - AND ra.contextid ".get_related_contexts_string($this->context)." - $this->groupwheresql - GROUP BY $userfields - ORDER BY $sort"; + FROM {user} u + JOIN ($enrolledsql) je ON je.id = u.id + JOIN {role_assignments} ra ON ra.userid = u.id + $this->groupsql + LEFT JOIN {grade_grades} g ON (g.userid = u.id AND g.itemid = :gitemid) + WHERE ra.roleid $gradebookrolessql + AND u.deleted = 0 + AND ra.contextid ".get_related_contexts_string($this->context)." + $this->groupwheresql + GROUP BY $userfields + ORDER BY $sort"; } else { switch($this->sortitemid) { @@ -375,15 +375,15 @@ class grade_report_grader extends grade_report { $params = array_merge($gradebookrolesparams, $this->groupwheresql_params, $enrolledparams); $sql = "SELECT DISTINCT $userfields - FROM {user} u - JOIN ($enrolledsql) je ON je.id = u.id - JOIN {role_assignments} ra ON u.id = ra.userid - $this->groupsql - WHERE ra.roleid $gradebookrolessql - AND u.deleted = 0 - AND ra.contextid ".get_related_contexts_string($this->context)." - $this->groupwheresql - ORDER BY $sort"; + FROM {user} u + JOIN ($enrolledsql) je ON je.id = u.id + JOIN {role_assignments} ra ON u.id = ra.userid + $this->groupsql + WHERE ra.roleid $gradebookrolessql + AND u.deleted = 0 + AND ra.contextid ".get_related_contexts_string($this->context)." + $this->groupwheresql + ORDER BY $sort"; } From 25081b95f955bb804860fc49c5e55ca16c8b8507 Mon Sep 17 00:00:00 2001 From: Sam Hemelryk Date: Tue, 18 Jan 2011 11:39:05 +0800 Subject: [PATCH 6/6] gradebook MDL-25769 Fixed SQL syntax formatting --- grade/import/lib.php | 28 ++++++++++++---------- grade/report/grader/lib.php | 48 +++++++++++++++++++++++-------------- grade/report/lib.php | 11 +++++---- 3 files changed, 52 insertions(+), 35 deletions(-) diff --git a/grade/import/lib.php b/grade/import/lib.php index 331a80a0eb9..1209e1c3394 100644 --- a/grade/import/lib.php +++ b/grade/import/lib.php @@ -171,19 +171,21 @@ function get_unenrolled_users_in_import($importcode, $courseid) { list($enrolledsql, $enrolledparams) = get_enrolled_sql($context); $sql = "SELECT giv.id, u.firstname, u.lastname, u.idnumber AS useridnumber, - COALESCE(gi.idnumber, gin.itemname) AS gradeidnumber - FROM - {grade_import_values} giv - JOIN {user} u ON giv.userid = u.id - LEFT JOIN {grade_items} gi ON gi.id = giv.itemid - LEFT JOIN {grade_import_newitem} gin ON gin.id = giv.newgradeitem - LEFT JOIN ($enrolledsql) je ON je.id = u.id - LEFT JOIN {role_assignments} ra ON (giv.userid = ra.userid AND - ra.roleid $gradebookrolessql AND - ra.contextid $relatedctxcondition) - WHERE giv.importcode = :importcode - AND (ra.id IS NULL OR je.id IS NULL) - ORDER BY gradeidnumber, u.lastname, u.firstname"; + COALESCE(gi.idnumber, gin.itemname) AS gradeidnumber + FROM {grade_import_values} giv + JOIN {user} u + ON giv.userid = u.id + LEFT JOIN {grade_items} gi + ON gi.id = giv.itemid + LEFT JOIN {grade_import_newitem} gin + ON gin.id = giv.newgradeitem + LEFT JOIN ($enrolledsql) je + ON je.id = u.id + LEFT JOIN {role_assignments} ra + ON (giv.userid = ra.userid AND ra.roleid $gradebookrolessql AND ra.contextid $relatedctxcondition) + WHERE giv.importcode = :importcode + AND (ra.id IS NULL OR je.id IS NULL) + ORDER BY gradeidnumber, u.lastname, u.firstname"; $params = array_merge($gradebookrolesparams, $enrolledparams); $params['importcode'] = $importcode; diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 5c591cece7d..d76d679c8e4 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -340,7 +340,7 @@ class grade_report_grader extends grade_report { list($enrolledsql, $enrolledparams) = get_enrolled_sql($this->context); //fields we need from the user table - $userfields = user_picture::fields('u', array('idnumber')); + $userfields = user_picture::fields('u', array('idnumber')); //if the user has clicked one of the sort asc/desc arrows if (is_numeric($this->sortitemid)) { @@ -350,10 +350,13 @@ class grade_report_grader extends grade_report { $sql = "SELECT $userfields FROM {user} u - JOIN ($enrolledsql) je ON je.id = u.id - JOIN {role_assignments} ra ON ra.userid = u.id - $this->groupsql - LEFT JOIN {grade_grades} g ON (g.userid = u.id AND g.itemid = :gitemid) + JOIN ($enrolledsql) je + ON je.id = u.id + JOIN {role_assignments} ra + ON ra.userid = u.id + $this->groupsql + LEFT JOIN {grade_grades} g + ON (g.userid = u.id AND g.itemid = :gitemid) WHERE ra.roleid $gradebookrolessql AND u.deleted = 0 AND ra.contextid ".get_related_contexts_string($this->context)." @@ -376,10 +379,12 @@ class grade_report_grader extends grade_report { $sql = "SELECT DISTINCT $userfields FROM {user} u - JOIN ($enrolledsql) je ON je.id = u.id - JOIN {role_assignments} ra ON u.id = ra.userid + JOIN ($enrolledsql) je + ON je.id = u.id + JOIN {role_assignments} ra + ON u.id = ra.userid $this->groupsql - WHERE ra.roleid $gradebookrolessql + WHERE ra.roleid $gradebookrolessql AND u.deleted = 0 AND ra.contextid ".get_related_contexts_string($this->context)." $this->groupwheresql @@ -1291,11 +1296,15 @@ class grade_report_grader extends grade_report { // find sums of all grade items in course $SQL = "SELECT g.itemid, SUM(g.finalgrade) AS sum FROM {grade_items} gi - JOIN {grade_grades} g ON g.itemid = gi.id - JOIN {user} u ON u.id = g.userid - JOIN ($enrolledsql) je ON je.id = u.id - JOIN {role_assignments} ra ON ra.userid = u.id - $groupsql + JOIN {grade_grades} g + ON g.itemid = gi.id + JOIN {user} u + ON u.id = g.userid + JOIN ($enrolledsql) je + ON je.id = u.id + JOIN {role_assignments} ra + ON ra.userid = u.id + $groupsql WHERE gi.courseid = :courseid AND ra.roleid $gradebookrolessql AND ra.contextid ".get_related_contexts_string($this->context)." @@ -1313,11 +1322,14 @@ class grade_report_grader extends grade_report { // This query returns a count of ungraded grades (NULL finalgrade OR no matching record in grade_grades table) $SQL = "SELECT gi.id, COUNT(u.id) AS count FROM {grade_items} gi - CROSS JOIN {user} u - JOIN ($enrolledsql) je ON je.id = u.id - JOIN {role_assignments} ra ON ra.userid = u.id - LEFT OUTER JOIN {grade_grades} g ON (g.itemid = gi.id AND g.userid = u.id AND g.finalgrade IS NOT NULL) - $groupsql + CROSS JOIN {user} u + JOIN ($enrolledsql) je + ON je.id = u.id + JOIN {role_assignments} ra + ON ra.userid = u.id + LEFT OUTER JOIN {grade_grades} g + ON (g.itemid = gi.id AND g.userid = u.id AND g.finalgrade IS NOT NULL) + $groupsql WHERE gi.courseid = :courseid AND ra.roleid $gradebookrolessql AND ra.contextid ".get_related_contexts_string($this->context)." diff --git a/grade/report/lib.php b/grade/report/lib.php index 9ca00972adc..a49b89ee1a1 100644 --- a/grade/report/lib.php +++ b/grade/report/lib.php @@ -291,10 +291,13 @@ abstract class grade_report { $countsql = "SELECT COUNT(DISTINCT u.id) FROM {user} u - JOIN ($enrolledsql) je ON je.id = u.id - JOIN {role_assignments} ra ON u.id = ra.userid - $groupsql - WHERE ra.roleid $gradebookrolessql AND u.deleted = 0 + JOIN ($enrolledsql) je + ON je.id = u.id + JOIN {role_assignments} ra + ON u.id = ra.userid + $groupsql + WHERE ra.roleid $gradebookrolessql + AND u.deleted = 0 $groupwheresql AND ra.contextid ".get_related_contexts_string($this->context); return $DB->count_records_sql($countsql, $params);