original_string: public function base_sql(\core\dml\sql_join $allowedstudentsjoins) {
          global $DB;
  
          // Please note this uniqueid column is not the same as quiza.uniqueid.
          $fields = 'DISTINCT ' . $DB->sql_concat('u.id', "'#'", 'COALESCE(quiza.attempt, 0)') . ' AS uniqueid,';
  
          if ($this->qmsubselect) {
              $fields .= "\n(CASE WHEN $this->qmsubselect THEN 1 ELSE 0 END) AS gradedattempt,";
          }
  
          $extrafields = get_extra_user_fields_sql($this->context, 'u', '',
                  array('id', 'idnumber', 'firstname', 'lastname', 'picture',
                  'imagealt', 'institution', 'department', 'email'));
          $allnames = get_all_user_name_fields(true, 'u');
          $fields .= '
                  quiza.uniqueid AS usageid,
                  quiza.id AS attempt,
                  u.id AS userid,
                  u.idnumber, ' . $allnames . ',
                  u.picture,
                  u.imagealt,
                  u.institution,
                  u.department,
                  u.email' . $extrafields . ',
                  quiza.state,
                  quiza.sumgrades,
                  quiza.timefinish,
                  quiza.timestart,
                  CASE WHEN quiza.timefinish = 0 THEN null
                       WHEN quiza.timefinish > quiza.timestart THEN quiza.timefinish - quiza.timestart
                       ELSE 0 END AS duration';
              // To explain that last bit, timefinish can be non-zero and less
              // than timestart when you have two load-balanced servers with very
              // badly synchronised clocks, and a student does a really quick attempt.
  
          // This part is the same for all cases. Join the users and quiz_attempts tables.
          $from = " {user} u";
          $from .= "\nLEFT JOIN {quiz_attempts} quiza ON
                                      quiza.userid = u.id AND quiza.quiz = :quizid";
          $params = array('quizid' => $this->quiz->id);
  
          if ($this->qmsubselect && $this->options->onlygraded) {
              $from .= " AND (quiza.state <> :finishedstate OR $this->qmsubselect)";
              $params['finishedstate'] = quiz_attempt::FINISHED;
          }
  
          switch ($this->options->attempts) {
              case quiz_attempts_report::ALL_WITH:
                  // Show all attempts, including students who are no longer in the course.
                  $where = 'quiza.id IS NOT NULL AND quiza.preview = 0';
                  break;
              case quiz_attempts_report::ENROLLED_WITH:
                  // Show only students with attempts.
                  $from .= "\n" . $allowedstudentsjoins->joins;
                  $where = "quiza.preview = 0 AND quiza.id IS NOT NULL AND " . $allowedstudentsjoins->wheres;
                  $params = array_merge($params, $allowedstudentsjoins->params);
                  break;
              case quiz_attempts_report::ENROLLED_WITHOUT:
                  // Show only students without attempts.
                  $from .= "\n" . $allowedstudentsjoins->joins;
                  $where = "quiza.id IS NULL AND " . $allowedstudentsjoins->wheres;
                  $params = array_merge($params, $allowedstudentsjoins->params);
                  break;
              case quiz_attempts_report::ENROLLED_ALL:
                  // Show all students with or without attempts.
                  $from .= "\n" . $allowedstudentsjoins->joins;
                  $where = "(quiza.preview = 0 OR quiza.preview IS NULL) AND " . $allowedstudentsjoins->wheres;
                  $params = array_merge($params, $allowedstudentsjoins->params);
                  break;
          }
  
          if ($this->options->states) {
              list($statesql, $stateparams) = $DB->get_in_or_equal($this->options->states,
                      SQL_PARAMS_NAMED, 'state');
              $params += $stateparams;
              $where .= " AND (quiza.state $statesql OR quiza.state IS NULL)";
          }
  
          return array($fields, $from, $where, $params);
      }
code: public function base_sql(\core\dml\sql_join $allowedstudentsjoins) {
          global $DB;
  
          // Please note this uniqueid column is not the same as quiza.uniqueid.
          $fields = 'DISTINCT ' . $DB->sql_concat('u.id', "'#'", 'COALESCE(quiza.attempt, 0)') . ' AS uniqueid,';
  
          if ($this->qmsubselect) {
              $fields .= "\n(CASE WHEN $this->qmsubselect THEN 1 ELSE 0 END) AS gradedattempt,";
          }
  
          $extrafields = get_extra_user_fields_sql($this->context, 'u', '',
                  array('id', 'idnumber', 'firstname', 'lastname', 'picture',
                  'imagealt', 'institution', 'department', 'email'));
          $allnames = get_all_user_name_fields(true, 'u');
          $fields .= '
                  quiza.uniqueid AS usageid,
                  quiza.id AS attempt,
                  u.id AS userid,
                  u.idnumber, ' . $allnames . ',
                  u.picture,
                  u.imagealt,
                  u.institution,
                  u.department,
                  u.email' . $extrafields . ',
                  quiza.state,
                  quiza.sumgrades,
                  quiza.timefinish,
                  quiza.timestart,
                  CASE WHEN quiza.timefinish = 0 THEN null
                       WHEN quiza.timefinish > quiza.timestart THEN quiza.timefinish - quiza.timestart
                       ELSE 0 END AS duration';
              // To explain that last bit, timefinish can be non-zero and less
              // than timestart when you have two load-balanced servers with very
              // badly synchronised clocks, and a student does a really quick attempt.
  
          // This part is the same for all cases. Join the users and quiz_attempts tables.
          $from = " {user} u";
          $from .= "\nLEFT JOIN {quiz_attempts} quiza ON
                                      quiza.userid = u.id AND quiza.quiz = :quizid";
          $params = array('quizid' => $this->quiz->id);
  
          if ($this->qmsubselect && $this->options->onlygraded) {
              $from .= " AND (quiza.state <> :finishedstate OR $this->qmsubselect)";
              $params['finishedstate'] = quiz_attempt::FINISHED;
          }
  
          switch ($this->options->attempts) {
              case quiz_attempts_report::ALL_WITH:
                  // Show all attempts, including students who are no longer in the course.
                  $where = 'quiza.id IS NOT NULL AND quiza.preview = 0';
                  break;
              case quiz_attempts_report::ENROLLED_WITH:
                  // Show only students with attempts.
                  $from .= "\n" . $allowedstudentsjoins->joins;
                  $where = "quiza.preview = 0 AND quiza.id IS NOT NULL AND " . $allowedstudentsjoins->wheres;
                  $params = array_merge($params, $allowedstudentsjoins->params);
                  break;
              case quiz_attempts_report::ENROLLED_WITHOUT:
                  // Show only students without attempts.
                  $from .= "\n" . $allowedstudentsjoins->joins;
                  $where = "quiza.id IS NULL AND " . $allowedstudentsjoins->wheres;
                  $params = array_merge($params, $allowedstudentsjoins->params);
                  break;
              case quiz_attempts_report::ENROLLED_ALL:
                  // Show all students with or without attempts.
                  $from .= "\n" . $allowedstudentsjoins->joins;
                  $where = "(quiza.preview = 0 OR quiza.preview IS NULL) AND " . $allowedstudentsjoins->wheres;
                  $params = array_merge($params, $allowedstudentsjoins->params);
                  break;
          }
  
          if ($this->options->states) {
              list($statesql, $stateparams) = $DB->get_in_or_equal($this->options->states,
                      SQL_PARAMS_NAMED, 'state');
              $params += $stateparams;
              $where .= " AND (quiza.state $statesql OR quiza.state IS NULL)";
          }
  
          return array($fields, $from, $where, $params);
      }
code_tokens: public function base_sql ( \ core \ dml \ sql_join $ allowedstudentsjoins ) { global $ DB ; // Please note this uniqueid column is not the same as quiza.uniqueid. $ fields = 'DISTINCT ' . $ DB -> sql_concat ( 'u.id' , "'#'" , 'COALESCE(quiza.attempt, 0)' ) . ' AS uniqueid,' ; if ( $ this -> qmsubselect ) { $ fields .= "\n(CASE WHEN $this->qmsubselect THEN 1 ELSE 0 END) AS gradedattempt," ; } $ extrafields = get_extra_user_fields_sql ( $ this -> context , 'u' , '' , array ( 'id' , 'idnumber' , 'firstname' , 'lastname' , 'picture' , 'imagealt' , 'institution' , 'department' , 'email' ) ) ; $ allnames = get_all_user_name_fields ( true , 'u' ) ; $ fields .= '
                  quiza.uniqueid AS usageid,
                  quiza.id AS attempt,
                  u.id AS userid,
                  u.idnumber, ' . $ allnames . ',
                  u.picture,
                  u.imagealt,
                  u.institution,
                  u.department,
                  u.email' . $ extrafields . ',
                  quiza.state,
                  quiza.sumgrades,
                  quiza.timefinish,
                  quiza.timestart,
                  CASE WHEN quiza.timefinish = 0 THEN null
                       WHEN quiza.timefinish > quiza.timestart THEN quiza.timefinish - quiza.timestart
                       ELSE 0 END AS duration' ; // To explain that last bit, timefinish can be non-zero and less // than timestart when you have two load-balanced servers with very // badly synchronised clocks, and a student does a really quick attempt. // This part is the same for all cases. Join the users and quiz_attempts tables. $ from = " {user} u" ; $ from .= "\nLEFT JOIN {quiz_attempts} quiza ON
                                      quiza.userid = u.id AND quiza.quiz = :quizid" ; $ params = array ( 'quizid' => $ this -> quiz -> id ) ; if ( $ this -> qmsubselect && $ this -> options -> onlygraded ) { $ from .= " AND (quiza.state <> :finishedstate OR $this->qmsubselect)" ; $ params [ 'finishedstate' ] = quiz_attempt :: FINISHED ; } switch ( $ this -> options -> attempts ) { case quiz_attempts_report :: ALL_WITH : // Show all attempts, including students who are no longer in the course. $ where = 'quiza.id IS NOT NULL AND quiza.preview = 0' ; break ; case quiz_attempts_report :: ENROLLED_WITH : // Show only students with attempts. $ from .= "\n" . $ allowedstudentsjoins -> joins ; $ where = "quiza.preview = 0 AND quiza.id IS NOT NULL AND " . $ allowedstudentsjoins -> wheres ; $ params = array_merge ( $ params , $ allowedstudentsjoins -> params ) ; break ; case quiz_attempts_report :: ENROLLED_WITHOUT : // Show only students without attempts. $ from .= "\n" . $ allowedstudentsjoins -> joins ; $ where = "quiza.id IS NULL AND " . $ allowedstudentsjoins -> wheres ; $ params = array_merge ( $ params , $ allowedstudentsjoins -> params ) ; break ; case quiz_attempts_report :: ENROLLED_ALL : // Show all students with or without attempts. $ from .= "\n" . $ allowedstudentsjoins -> joins ; $ where = "(quiza.preview = 0 OR quiza.preview IS NULL) AND " . $ allowedstudentsjoins -> wheres ; $ params = array_merge ( $ params , $ allowedstudentsjoins -> params ) ; break ; } if ( $ this -> options -> states ) { list ( $ statesql , $ stateparams ) = $ DB -> get_in_or_equal ( $ this -> options -> states , SQL_PARAMS_NAMED , 'state' ) ; $ params += $ stateparams ; $ where .= " AND (quiza.state $statesql OR quiza.state IS NULL)" ; } return array ( $ fields , $ from , $ where , $ params ) ; }
docstring: Contruct all the parts of the main database query.
  @param \core\dml\sql_join $allowedstudentsjoins (joins, wheres, params) defines allowed users for the report.
  @return array with 4 elements ($fields, $from, $where, $params) that can be used to
  build the actual database query.
docstring_tokens: Contruct all the parts of the main database query .