Example #1
0
function cron__update_participants_history()
{
    $logm = "";
    // initialize with zero
    $query = "UPDATE " . table('participants') . " \n      \t\tSET number_reg = 0, number_noshowup = 0";
    $done = or_query($query);
    $query = "SELECT " . table('participate_at') . ".participant_id, \n\t\t\tcount(*) as number_reg\n      \t\tFROM " . table('participate_at') . ", " . table('sessions') . ", " . table('experiments') . " \n      \t\tWHERE " . table('sessions') . ".session_id = " . table('participate_at') . ".session_id\n      \t\tAND " . table('participate_at') . ".experiment_id = " . table('experiments') . ".experiment_id\n      \t\tAND hide_in_stats = 'n' \n      \t\tAND (session_status='completed' OR session_status='balanced')\n      \t\tAND " . table('participate_at') . ".session_id != 0  \n      \t\tGROUP BY participant_id";
    $result = or_query($query);
    $n = 0;
    while ($line = pdo_fetch_assoc($result)) {
        $done = cron__participants_update_history_participant($line, 'number_reg');
        $n++;
    }
    $logm .= "updated participant's number_reg: " . $n . "\n";
    $noshow_clause = expregister__get_pstatus_query_snippet("noshow");
    $query = "SELECT " . table('participate_at') . ".participant_id,\n            count(*) as number_noshowup\n\t\t\tFROM " . table('participate_at') . ", " . table('sessions') . ", " . table('experiments') . "\n\t\t\tWHERE " . table('sessions') . ".session_id = " . table('participate_at') . ".session_id\n\t\t\tAND " . table('participate_at') . ".experiment_id = " . table('experiments') . ".experiment_id\n\t\t\tAND hide_in_stats = 'n'\n\t\t\tAND (session_status='completed' OR session_status='balanced')\n\t\t\tAND " . table('participate_at') . ".session_id != 0 \n\t\t\tAND " . $noshow_clause . " \n\t\t\tGROUP BY participant_id";
    $result = or_query($query);
    $n = 0;
    while ($line = pdo_fetch_assoc($result)) {
        $done = cron__participants_update_history_participant($line, 'number_noshowup');
        $n++;
    }
    $logm .= "updated participant's number_noshowup: " . $n;
    return $logm;
}
Example #2
0
function stats__get_data($condition = array(), $type = 'stats', $restrict = array(), $options = array())
{
    global $settings;
    $conditions = array();
    $pars = array();
    if (is_array($condition) && count($condition) > 0) {
        $conditions[] = $condition['clause'];
        if (isset($condition['pars']) && is_array($condition['pars'])) {
            foreach ($condition['pars'] as $k => $v) {
                $pars[$k] = $v;
            }
        }
    }
    $formfields = participantform__load();
    $pform_fields = array();
    $pform_types = array();
    foreach ($formfields as $f) {
        if (!preg_match("/(textline|textarea)/i", $f['type']) && isset($f['include_in_statistics']) && ($f['include_in_statistics'] == 'pie' || $f['include_in_statistics'] == 'bars')) {
            $pform_fields[] = $f['mysql_column_name'];
            $pform_types[$f['mysql_column_name']] = $f;
        }
    }
    $statfields = array('subpool_id', 'subscriptions', 'status_id');
    foreach ($pform_fields as $field) {
        if (!in_array($field, $statfields)) {
            $statfields[] = $field;
        }
    }
    if ($type == 'stats' && $settings['enable_rules_signed_tracking'] == 'y') {
        if (!in_array('rules_signed', $statfields)) {
            $statfields[] = 'rules_signed';
        }
    } else {
        $exists = array_search('rules_signed', $statfields);
        if ($exists) {
            unset($statfields[$exists]);
        }
    }
    if ($type == 'stats') {
        foreach (array('number_reg', 'number_noshowup', 'last_enrolment', 'last_profile_update', 'last_activity') as $field) {
            if (!in_array($field, $statfields)) {
                $statfields[] = $field;
            }
        }
    }
    $query = "SELECT * from " . table('participants');
    $query_conditions = "";
    if (count($conditions) > 0) {
        $query_conditions .= " WHERE";
        $cond_strings = array();
        foreach ($conditions as $cond) {
            $cond_strings[] = "(" . $cond . ")";
        }
        $query_conditions .= " " . implode(" AND ", $cond_strings);
    }
    $query .= $query_conditions;
    $result = or_query($query, $pars);
    $counts = array();
    $pids = array();
    while ($line = pdo_fetch_assoc($result)) {
        // check whether we should count this participant and (for monthly stats) use this value
        $p_restrict = false;
        foreach ($statfields as $c) {
            $value = $line[$c];
            if (in_array($c, array('last_enrolment', 'last_profile_update', 'last_activity'))) {
                if (!$value) {
                    $value = 0;
                }
                if ($value == 0) {
                    $value = '-';
                } else {
                    $value = date('Ym', $value);
                }
            }
            $value = db_string_to_id_array($value);
            if (count($value) > 0) {
                $this_restrict = true;
                foreach ($value as $v) {
                    if (!isset($restrict[$c][$v])) {
                        $this_restrict = false;
                    }
                }
                if ($this_restrict) {
                    $p_restrict = true;
                }
            } else {
                $value = '-';
                if (isset($restrict[$c][$value])) {
                    $p_restrict = true;
                }
            }
        }
        if (!$p_restrict) {
            $pids[] = $line['participant_id'];
            foreach ($statfields as $c) {
                $value = $line[$c];
                $continue = true;
                if (in_array($c, array('last_enrolment', 'last_profile_update', 'last_activity'))) {
                    if (!$value) {
                        $value = 0;
                    }
                    if (date('Ym', $value) < date('Ym', strtotime("-" . $settings['stats_months_backward'] . " month", time()))) {
                        $continue = false;
                    }
                    if ($value == 0) {
                        $value = '-';
                    } else {
                        $value = date('Ym', $value);
                    }
                }
                if ($continue) {
                    $value = db_string_to_id_array($value);
                    if (count($value) > 0) {
                        foreach ($value as $v) {
                            if (!isset($counts[$c][$v])) {
                                $counts[$c][$v] = 0;
                            }
                            $counts[$c][$v]++;
                        }
                    } else {
                        $value = '-';
                        if (!isset($counts[$c][$value])) {
                            $counts[$c][$value] = 0;
                        }
                        $counts[$c][$value]++;
                    }
                }
            }
        }
    }
    $count_pids = count($pids);
    $pid_condition = "";
    if (count($restrict) > 0) {
        $pid_condition = " AND participant_id IN (" . implode(", ", $pids) . ") ";
    } elseif (count($conditions) == 1 && isset($options['condition_only_on_pid']) && $options['condition_only_on_pid']) {
        $pid_condition = " AND " . $condition['clause'] . " ";
    } elseif ($query_conditions) {
        $pid_condition = " AND participant_id IN (SELECT participant_id FROM " . table('participants') . " " . $query_conditions . ") ";
    }
    // avg. experience (participation in experiments of class x, y, z  at time of experiment)
    $statfields[] = 'experience_avg_experimentclass';
    if ($count_pids > 0) {
        $participated_clause = expregister__get_pstatus_query_snippet("participated");
        $query = "SELECT count(*) as num, experiment_class\n                FROM " . table('participate_at') . " as p, " . table('experiments') . " as e\n                WHERE p.session_id>0 " . $pid_condition . "\n                AND e.experiment_id=p.experiment_id\n                AND e.experiment_class !=''\n                AND " . $participated_clause . " ";
        if (is_array($options) && isset($options['upper_experience_limit'])) {
            $query .= " AND session_id IN (SELECT session_id FROM " . table('sessions') . "\n                        WHERE session_start < " . ortime__unixtime_to_sesstime($options['upper_experience_limit']) . "\n                        AND session_status IN ('completed','balanced') ) ";
        }
        $query .= "GROUP BY experiment_class";
        $result = or_query($query, $pars);
        while ($line = pdo_fetch_assoc($result)) {
            $line['experiment_class'] = db_string_to_id_array($line['experiment_class']);
            foreach ($line['experiment_class'] as $v) {
                if ($v > 0) {
                    if (!isset($counts['experience_avg_experimentclass'][$v])) {
                        $counts['experience_avg_experimentclass'][$v] = 0;
                    }
                    $counts['experience_avg_experimentclass'][$v] += round($line['num'] / $count_pids, 2);
                }
            }
        }
    }
    if ($type == 'report') {
        // avg. count pstatus at time of experiment)
        $statfields[] = 'experience_avg_pstatus';
    }
    if ($count_pids > 0 && $type == 'report') {
        $query = "SELECT count(*) as num, pstatus_id\n                FROM " . table('participate_at') . "\n                WHERE session_id>0 " . $pid_condition;
        if (is_array($options) && isset($options['upper_experience_limit'])) {
            $query .= " AND session_id IN (SELECT session_id FROM " . table('sessions') . "\n                    WHERE session_start < " . ortime__unixtime_to_sesstime($options['upper_experience_limit']) . "\n                    AND session_status IN ('completed','balanced') ) ";
        }
        $query .= "GROUP BY pstatus_id";
        $result = or_query($query, $pars);
        while ($line = pdo_fetch_assoc($result)) {
            $counts['experience_avg_pstatus'][$line['pstatus_id']] = round($line['num'] / $count_pids, 2);
        }
    }
    if ($type == 'stats') {
        // by pstatus: pstatus count // really needed? we have no_noshows, num_reg ...
        // by month: pstatus
        $statfields[] = 'bymonth_pstatus';
        $statfields[] = 'bymonth_noshowrate';
    }
    if ($count_pids > 0 && $type == 'stats') {
        $first_month = date('Ym000000', strtotime("-" . $settings['stats_months_backward'] . " month", time()));
        $noshow_statuses = expregister__get_specific_pstatuses("noshow");
        $query = "SELECT date_format(s.session_start*100,'%Y%m') as sessionmonth,\n                pstatus_id, count(p.participate_id) as num\n                FROM " . table('participate_at') . " as p, " . table('sessions') . " as s\n                WHERE p.session_id>0\n                AND p.session_id=s.session_id\n                AND s.session_status IN ('completed','balanced')\n                AND s.session_start>" . $first_month . " " . $pid_condition . "\n                GROUP BY sessionmonth, pstatus_id\n                ORDER BY sessionmonth, pstatus_id ";
        $result = or_query($query, $pars);
        $noshowperc_data = array();
        while ($line = pdo_fetch_assoc($result)) {
            $counts['bymonth_pstatus_' . $line['pstatus_id']][$line['sessionmonth']] = $line['num'];
            if (!isset($noshowperc_data[$line['sessionmonth']]['n'])) {
                $noshowperc_data[$line['sessionmonth']]['n'] = 0;
            }
            if (!isset($noshowperc_data[$line['sessionmonth']]['y'])) {
                $noshowperc_data[$line['sessionmonth']]['y'] = 0;
            }
            if (in_array($line['pstatus_id'], $noshow_statuses)) {
                $noshowperc_data[$line['sessionmonth']]['n'] += $line['num'];
            } else {
                $noshowperc_data[$line['sessionmonth']]['y'] += $line['num'];
            }
        }
        // get the noshow percentages as well
        foreach ($noshowperc_data as $month => $shownup) {
            $counts['bymonth_noshowrate'][$month] = round($shownup['n'] / ($shownup['n'] + $shownup['y']) * 100, 1);
        }
    }
    $xnames = array('number_reg' => lang('experience'), 'number_noshowup' => lang('noshowup'), 'pstatus' => lang('month'), 'experience_avg_experimentclass' => lang('experiment_classes'), 'experience_avg_pstatus' => lang('participation_status'));
    $titles = array('number_reg' => lang('experience'), 'number_noshowup' => lang('noshows_by_count'), 'last_enrolment' => lang('last_enrolment'), 'last_profile_update' => lang('last_profile_update'), 'last_activity' => lang('last_activity'), 'bymonth_noshowrate' => lang('noshows_by_month'), 'experience_avg_experimentclass' => lang('experience_in_experiment_classes'), 'experience_avg_pstatus' => lang('average_participation_experience'));
    // prepare all-containing arrray to return
    $data_temparray = array();
    foreach ($counts as $c => $nums) {
        $d = array();
        $d['N'] = $count_pids;
        if (isset($pform_types[$c])) {
            $d['browsable'] = true;
            $d['charttype'] = $pform_types[$c]['include_in_statistics'];
            $d['type_of_data'] = 'count';
            $d['yname'] = lang('count');
            $d['xname'] = lang($pform_types[$c]['name_lang']);
            $d['title'] = lang($pform_types[$c]['name_lang']);
            if (preg_match("/(select_lang|radioline_lang)/", $pform_types[$c]['type'])) {
                $d['value_names'] = lang__load_lang_cat($c, lang('lang'));
            } elseif (preg_match("/(radioline|select_list)/", $pform_types[$c]['type'])) {
                $optionvalues = explode(",", $pform_types[$c]['option_values']);
                $optionnames = explode(",", $pform_types[$c]['option_values_lang']);
                $d['value_names'] = array();
                foreach ($optionvalues as $k => $v) {
                    if (isset($optionnames[$k])) {
                        $d['value_names'][$v] = lang($optionnames[$k]);
                    }
                }
            } else {
                $d['value_names'] = array();
            }
            // select numbers?
            if ($pform_types[$c]['type'] == 'select_numbers') {
                krsort($nums);
            } else {
                arsort($nums);
            }
            $d['data'] = $nums;
            $data_temparray[$c] = $d;
        } elseif (in_array($c, array('number_reg', 'number_noshowup'))) {
            $d['browsable'] = true;
            $d['charttype'] = 'bars';
            if ($c == 'number_reg') {
                $d['wide'] = true;
            }
            $d['limit_not_apply'] = true;
            $d['type_of_data'] = 'count';
            $d['yname'] = lang('count');
            $d['xname'] = $xnames[$c];
            $d['title'] = $titles[$c];
            $d['value_names'] = array();
            krsort($nums);
            $d['data'] = $nums;
            $data_temparray[$c] = $d;
        } elseif (in_array($c, array('experience_avg_experimentclass', 'experience_avg_pstatus'))) {
            $d['charttype'] = 'pie';
            $d['type_of_data'] = 'calc';
            $d['yname'] = lang('average_count');
            $d['xname'] = $xnames[$c];
            $d['title'] = $titles[$c];
            $d['value_names'] = array();
            if ($c == 'experience_avg_experimentclass') {
                $d['value_names'] = experiment__load_experimentclassnames();
            } else {
                $pstatuses = expregister__get_participation_statuses();
                foreach ($pstatuses as $k => $s) {
                    $d['value_names'][$k] = $s['internal_name'];
                }
            }
            arsort($nums);
            $d['data'] = $nums;
            $data_temparray[$c] = $d;
        } elseif ($c == 'rules_signed') {
            $d['browsable'] = true;
            $d['charttype'] = 'pie';
            $d['type_of_data'] = 'count';
            $d['yname'] = lang('count');
            $d['xname'] = lang('rules_signed');
            $d['title'] = lang('rules_signed');
            $d['value_names'] = array('n' => lang('n'), 'y' => lang('y'));
            arsort($nums);
            $d['data'] = $nums;
            $data_temparray[$c] = $d;
        } elseif ($c == 'subpool_id') {
            $d['browsable'] = true;
            $d['charttype'] = 'pie';
            $d['type_of_data'] = 'count';
            $d['yname'] = lang('count');
            $d['xname'] = lang('subpool');
            $d['title'] = lang('subpool');
            $subpools = subpools__get_subpools();
            $d['value_names'] = array();
            foreach ($subpools as $k => $p) {
                $d['value_names'][$k] = $p['subpool_name'];
            }
            arsort($nums);
            $d['data'] = $nums;
            $data_temparray[$c] = $d;
        } elseif ($c == 'status_id') {
            $d['browsable'] = true;
            $d['charttype'] = 'pie';
            $d['type_of_data'] = 'count';
            $d['yname'] = lang('count');
            $d['xname'] = lang('participant_status');
            $d['title'] = lang('participant_statuses');
            $statuses = participant_status__get_statuses();
            $d['value_names'] = array();
            foreach ($statuses as $k => $p) {
                $d['value_names'][$k] = $p['name'];
            }
            krsort($nums);
            $d['data'] = $nums;
            $data_temparray[$c] = $d;
        } elseif ($c == 'subscriptions') {
            $d['browsable'] = true;
            $d['charttype'] = 'none';
            $d['type_of_data'] = 'count';
            $d['yname'] = lang('count');
            $d['xname'] = lang('subscriptions');
            $d['title'] = lang('subscriptions');
            $exptypes = load_external_experiment_types("", false);
            $d['value_names'] = array();
            foreach ($exptypes as $k => $p) {
                $d['value_names'][$k] = $p[lang('lang')];
            }
            krsort($nums);
            $d['data'] = $nums;
            $data_temparray[$c] = $d;
        } elseif (in_array($c, array('last_enrolment', 'last_profile_update', 'last_activity', 'bymonth_noshowrate'))) {
            $d['charttype'] = 'bars';
            $d['wide'] = true;
            if ($c == 'bymonth_noshowrate') {
                $d['yname'] = lang('share_in_percent');
                $d['type_of_data'] = 'calc';
            } else {
                $d['yname'] = lang('count');
                $d['type_of_data'] = 'count';
            }
            $d['xname'] = lang('month');
            $d['title'] = $titles[$c];
            foreach ($nums as $k => $number) {
                if ($k == '-') {
                    $d['value_names'][$k] = $k;
                } else {
                    $d['value_names'][$k] = substr($k, 4, 2) . '/' . substr($k, 2, 2);
                }
            }
            krsort($nums);
            $d['data'] = $nums;
            $data_temparray[$c] = $d;
        } elseif (preg_match('/^bymonth_pstatus/', $c)) {
            $tarr = explode("_", $c);
            $status = $tarr[2];
            if (!isset($data_temparray['bymonth_pstatus'])) {
                $pstatuses = expregister__get_participation_statuses();
                $d['charttype'] = 'multibars';
                $d['wide'] = true;
                $d['type_of_data'] = 'count';
                $d['yname'] = lang('count');
                $d['xname'] = lang('month');
                $d['title'] = lang('participation_status_count_by_month');
                $d['value_names'] = array();
                $d['column_names'] = array();
                foreach ($pstatuses as $k => $s) {
                    $d['column_names'][$k] = $s['internal_name'];
                }
                $data_temparray['bymonth_pstatus'] = $d;
            }
            krsort($nums);
            $data_temparray['bymonth_pstatus']['data'][$status] = $nums;
            $d['value_names'] = array();
            foreach ($data_temparray['bymonth_pstatus']['data'] as $status => $months) {
                foreach ($months as $month => $count) {
                    $d['value_names'][$month] = $month;
                }
            }
            krsort($d['value_names']);
            foreach ($d['value_names'] as $k => $v) {
                $d['value_names'][$k] = substr($v, 4, 2) . '/' . substr($v, 2, 2);
            }
            $data_temparray['bymonth_pstatus']['value_names'] = $d['value_names'];
        }
    }
    // prepare all-containing array to return
    $data_array = array();
    foreach ($statfields as $c) {
        if (isset($data_temparray[$c]['data'])) {
            $data_temparray[$c]['name'] = $c;
            $data_array[$c] = $data_temparray[$c];
        } else {
            $data_array[$c] = array('name' => $c, 'N' => 0, 'data' => array());
        }
    }
    return $data_array;
}
 $query = "SELECT max(session_start) as max_time, min(session_start) as min_time\n\t\t\tFROM " . table('sessions') . " \n\t\t\tWHERE experiment_id = :experiment_id";
 $line = orsee_query($query, $pars);
 $min_session_time = ortime__sesstime_to_unixtime($line['min_time']);
 $max_session_time = ortime__sesstime_to_unixtime($line['max_time']);
 $total_data = array();
 // pool
 $options = array('upper_experience_limit' => $min_session_time);
 $condition = array('clause' => " status_id > 0 AND creation_time < '" . $max_session_time . "' AND  \n\t\t\t\t  (deletion_time=0 OR deletion_time > '" . $min_session_time . "') ", 'pars' => array());
 $total_data['pool'] = stats__get_data($condition, 'report', array(), $options);
 // experiment eligible
 $options = array('upper_experience_limit' => $min_session_time, 'condition_only_on_pid' => true);
 $condition = array('clause' => "participant_id IN (SELECT participant_id FROM " . table('participate_at') . " \n\t\t\t\t\t\t\t\tWHERE experiment_id= :experiment_id )", 'pars' => array(':experiment_id' => $experiment_id));
 $total_data['exp'] = stats__get_data($condition, 'report', array(), $options);
 // participated
 $options = array('upper_experience_limit' => $min_session_time, 'condition_only_on_pid' => true);
 $participated_clause = expregister__get_pstatus_query_snippet("participated");
 $condition = array('clause' => "participant_id IN (SELECT participant_id FROM " . table('participate_at') . " \n\t\t\t\t\t\t\t\tWHERE experiment_id= :experiment_id AND session_id > 0 AND " . $participated_clause . ")", 'pars' => array(':experiment_id' => $experiment_id));
 $total_data['part'] = stats__get_data($condition, 'report', array(), $options);
 echo '<TABLE class="or_orr_section_content">';
 $i = 0;
 $cols = 2;
 $out = array();
 foreach ($total_data['pool'] as $k => $table1) {
     if (isset($table1['data']) && is_array($table1['data']) && count($table1['data']) > 0) {
         $show = true;
     } else {
         $show = false;
     }
     if ($show) {
         $out[] = stats__report_display_table($table1, lang('stats_report__pool'), $total_data['exp'][$k], lang('stats_report__assigned'), $total_data['part'][$k], lang('stats_report__participated'));
         if (count($out) == $cols) {
Example #4
0
function query__get_query_array($posted_array, $experiment_id = "")
{
    global $lang;
    $formfields = participantform__load();
    $participated_clause = expregister__get_pstatus_query_snippet("participated");
    $allowed_signs = array('<=', '=', '>');
    $query_array = array();
    $query_array['clauses'] = array();
    foreach ($posted_array as $num => $entry) {
        $temp_keys = array_keys($entry);
        $module_string = $temp_keys[0];
        $module_string_array = explode("_", $module_string);
        $module = $module_string_array[0];
        $type = $module_string_array[1];
        if ($module == 'pform') {
            unset($module_string_array[0]);
            unset($module_string_array[1]);
            if ($module_string_array[2] == 'ms') {
                unset($module_string_array[2]);
            }
            $pform_formfield = implode("_", $module_string_array);
        } else {
            $pform_formfield = "";
        }
        $params = $entry[$module_string];
        $op = '';
        $ctype = '';
        $pars = array();
        $clause = '';
        $subqueries = array();
        $add = true;
        if (isset($params['logical_op']) && $params['logical_op']) {
            $op = strtoupper($params['logical_op']);
        }
        switch ($module) {
            case "bracket":
                if ($type == 'open') {
                    $ctype = 'bracket_open';
                    $clause = '(';
                } else {
                    $ctype = 'bracket_close';
                    $clause = ')';
                }
                break;
            case "experimentclasses":
                $ctype = 'subquery';
                // clause
                $clause = 'participant_id ';
                if ($params['not']) {
                    $clause .= 'NOT ';
                }
                $clause .= 'IN (#subquery0#) ';
                $pars = array();
                // subquery
                $subqueries[0]['clause']['query'] = "SELECT participant_id as id\n\t\t\t\t\t\t\tFROM " . table('participate_at') . "\n\t\t\t\t\t\t\tWHERE experiment_id IN (#subquery0#) \n\t\t\t\t\t\t\tAND " . $participated_clause;
                $subqueries[0]['clause']['pars'] = array();
                $likelist = query__make_like_list($params['ms_classes'], 'experiment_class');
                $subqueries[0]['subqueries'][0]['clause']['query'] = "\n\t\t\t\t\t\tSELECT experiment_id as id \n\t\t\t\t\t\tFROM " . table('experiments') . "\n\t\t\t\t\t\tWHERE (" . $likelist['par_names'] . ") ";
                $subqueries[0]['subqueries'][0]['clause']['pars'] = $likelist['pars'];
                break;
            case "experimenters":
                $ctype = 'subquery';
                // clause
                $clause = 'participant_id ';
                if ($params['not']) {
                    $clause .= 'NOT ';
                }
                $clause .= 'IN (#subquery0#) ';
                $pars = array();
                // subquery
                $subqueries[0]['clause']['query'] = "SELECT participant_id as id \n\t\t\t\t\t\t\tFROM " . table('participate_at') . "\n\t\t\t\t\t\t\tWHERE experiment_id IN (#subquery0#) \n\t\t\t\t\t\t\tAND " . $participated_clause;
                $subqueries[0]['clause']['pars'] = array();
                $likelist = query__make_like_list($params['ms_experimenters'], 'experimenter');
                $subqueries[0]['subqueries'][0]['clause']['query'] = "\n\t\t\t\t\t\tSELECT experiment_id as id\n\t\t\t\t\t\tFROM " . table('experiments') . "\n\t\t\t\t\t\tWHERE (" . $likelist['par_names'] . ") ";
                $subqueries[0]['subqueries'][0]['clause']['pars'] = $likelist['pars'];
                break;
            case "experimentsassigned":
                $ctype = 'subquery';
                // clause
                $clause = 'participant_id ';
                if ($params['not']) {
                    $clause .= 'NOT ';
                }
                $clause .= 'IN (#subquery0#) ';
                $pars = array();
                // subquery
                $list = query__make_enquoted_list($params['ms_experiments'], 'experiment_id');
                $subqueries[0]['clause']['query'] = "SELECT participant_id as id\n\t\t\t\t\t\t\tFROM " . table('participate_at') . "\n\t\t\t\t\t\t\tWHERE experiment_id IN (" . $list['par_names'] . ")";
                $subqueries[0]['clause']['pars'] = $list['pars'];
                break;
            case "experimentsparticipated":
                $ctype = 'subquery';
                // clause
                $clause = 'participant_id ';
                if ($params['not']) {
                    $clause .= 'NOT ';
                }
                $clause .= 'IN (#subquery0#) ';
                $pars = array();
                // subquery
                $list = query__make_enquoted_list($params['ms_experiments'], 'experiment_id');
                $subqueries[0]['clause']['query'] = "SELECT participant_id as id \n\t\t\t\t\t\t\tFROM " . table('participate_at') . "\n\t\t\t\t\t\t\tWHERE experiment_id IN (" . $list['par_names'] . ")\n\t\t\t\t\t\t\tAND " . $participated_clause;
                $subqueries[0]['clause']['pars'] = $list['pars'];
                break;
            case "statusids":
                $ctype = 'part';
                $list = query__make_enquoted_list($params['ms_status'], 'status_id');
                $clause = 'status_id ';
                if ($params['not']) {
                    $clause .= 'NOT ';
                }
                $clause .= "IN (" . $list['par_names'] . ")";
                $pars = $list['pars'];
                break;
            case "pformtextfields":
                $ctype = 'part';
                $clause = "";
                if ($params['not']) {
                    $clause .= 'NOT ';
                }
                $form_query_fields = array();
                foreach ($formfields as $f) {
                    // whitelist by loop
                    if (preg_match("/(textline|textarea)/i", $f['type']) && (!$experiment_id && $f['search_include_in_participant_query'] == 'y' || $experiment_id && $f['search_include_in_experiment_assign_query'] == 'y')) {
                        if ($params['search_field'] == 'all') {
                            $form_query_fields[] = $f['mysql_column_name'];
                        } elseif ($params['search_field'] == $f['mysql_column_name']) {
                            $form_query_fields[] = $f['mysql_column_name'];
                        }
                    }
                }
                $like_array = array();
                $pars = array();
                $i = 0;
                foreach ($form_query_fields as $field) {
                    $like_array[] = $field . " LIKE :search_string" . $i . " ";
                    $pars[':search_string' . $i] = '%' . $params['search_string'] . '%';
                    $i++;
                }
                $clause .= ' (' . implode(" OR ", $like_array) . ') ';
                break;
            case "pform":
                $ctype = 'part';
                $clause = "";
                $f = array();
                foreach ($formfields as $p) {
                    if ($p['mysql_column_name'] == $pform_formfield) {
                        $f = $p;
                    }
                }
                if (isset($f['mysql_column_name'])) {
                    $clause .= $f['mysql_column_name'] . ' ';
                    if ($type == 'numberselect') {
                        if (in_array($params['sign'], $allowed_signs)) {
                            $clause .= $params['sign'];
                        } else {
                            $clause .= $allowed_signs[0];
                        }
                        $clause .= ' :number';
                        $pars = array(':number' => $params['fieldvalue']);
                    } elseif ($type == 'simpleselect') {
                        if ($params['not']) {
                            $clause .= "!= ";
                        } else {
                            $clause .= "= ";
                        }
                        $clause .= " :fieldvalue";
                        $pars = array(':fieldvalue' => trim($params['fieldvalue']));
                    } else {
                        if ($params['not']) {
                            $clause .= "NOT ";
                        }
                        $list = query__make_enquoted_list($params['ms_' . $pform_formfield], 'fieldvalue');
                        $clause .= "IN (" . $list['par_names'] . ")";
                        $pars = $list['pars'];
                    }
                } else {
                    $add = false;
                }
                break;
            case "noshows":
                $ctype = 'part';
                if ($params['count'] == 0) {
                    $params['count'] = 0;
                }
                $clause = 'number_noshowup ';
                if (in_array($params['sign'], $allowed_signs)) {
                    $clause .= $params['sign'];
                } else {
                    $clause .= $allowed_signs[0];
                }
                $clause .= ' :noshowcount';
                $pars = array(':noshowcount' => $params['count']);
                break;
            case "participations":
                $ctype = 'part';
                if ($params['count'] == 0) {
                    $params['count'] = 0;
                }
                $clause = 'number_reg ';
                if (in_array($params['sign'], $allowed_signs)) {
                    $clause .= $params['sign'];
                } else {
                    $clause .= $allowed_signs[0];
                }
                $clause .= ' :partcount';
                $pars = array(':partcount' => $params['count']);
                break;
            case "updaterequest":
                $ctype = 'part';
                if ($params['update_request_status'] == 'y') {
                    $params['update_request_status'] = 'y';
                } else {
                    $params['update_request_status'] = 'n';
                }
                $clause = 'pending_profile_update_request = :pending_profile_update_request';
                $pars = array(':pending_profile_update_request' => $params['update_request_status']);
                break;
            case "randsubset":
                $add = false;
                if ($params['limit'] == 0) {
                    $params['limit'] = 0;
                }
                $query_array['limit'] = $params['limit'];
                break;
            case "activity":
                $activities = array('last_activity', 'last_enrolment', 'last_profile_update', 'creation_time', 'deletion_time');
                if (in_array($params['activity_type'], $activities)) {
                    $ctype = 'part';
                    $clause = "";
                    if ($params['not']) {
                        $clause .= 'NOT ';
                    }
                    $sesstime_act = ortime__array_to_sesstime($params, 'dt_activity_');
                    $pars = array(':activity_time' => ortime__sesstime_to_unixtime($sesstime_act));
                    $clause .= ' (' . $params['activity_type'] . ' < :activity_time) ';
                } else {
                    $add = false;
                }
                break;
            case "subsubjectpool":
                $ctype = 'part';
                $list = query__make_enquoted_list($params['ms_subpool'], 'subpool_id');
                $clause = 'subpool_id ';
                if ($params['not']) {
                    $clause .= 'NOT ';
                }
                $clause .= "IN (" . $list['par_names'] . ")";
                $pars = $list['pars'];
                break;
            default:
                $add = false;
                break;
        }
        if ($add) {
            $query_array['clauses'][] = array('op' => $op, 'ctype' => $ctype, 'clause' => array('query' => $clause, 'pars' => $pars), 'subqueries' => $subqueries);
        }
    }
    // remove unnecessary whitespace from any queries
    foreach ($query_array['clauses'] as $k => $q) {
        $query_array['clauses'][$k]['clause']['query'] = trim(preg_replace('/\\s+/', ' ', $query_array['clauses'][$k]['clause']['query']));
        if (isset($query_array['clauses'][$k]['subqueries'])) {
            $query_array['clauses'][$k]['subqueries'] = query__strip_ws_subqueries_recursively($query_array['clauses'][$k]['subqueries']);
        }
    }
    // unset empty brackets, recursively if needed
    $ok = false;
    while (!$ok) {
        $ok = true;
        foreach ($query_array['clauses'] as $k => $q) {
            if ($ok && $q['ctype'] == 'bracket_close' && $query_array['clauses'][$k - 1]['ctype'] == 'bracket_open') {
                unset($query_array['clauses'][$k]);
                unset($query_array['clauses'][$k - 1]);
                $ok = false;
                if (isset($query_array['clauses'][$k - 2]) && $query_array['clauses'][$k - 2]['ctype'] == 'bracket_open' && isset($query_array['clauses'][$k + 1]['op'])) {
                    $query_array['clauses'][$k + 1]['op'] = '';
                }
            }
        }
        $new_clauses = array();
        foreach ($query_array['clauses'] as $k => $q) {
            $new_clauses[] = $q;
        }
        $query_array['clauses'] = $new_clauses;
    }
    return $query_array;
}
Example #5
0
function experimentmail__send_noshow_warnings_to_queue($session)
{
    $noshow_clause = expregister__get_pstatus_query_snippet("noshow");
    $pars = array(':experiment_id' => $session['experiment_id'], ':session_id' => $session['session_id']);
    $query = "INSERT INTO " . table('mail_queue') . " (timestamp,mail_type,mail_recipient,experiment_id,session_id)\n            SELECT UNIX_TIMESTAMP(),'noshow_warning', participant_id, experiment_id, session_id\n            FROM " . table('participate_at') . "\n            WHERE experiment_id= :experiment_id\n            AND session_id= :session_id\n            AND " . $noshow_clause;
    $done = or_query($query, $pars);
    $count = pdo_num_rows($done);
    return $count;
}
Example #6
0
function experiment__preload_experiments()
{
    global $lang, $preloaded_experiments;
    if (isset($preloaded_experiments) && is_array($preloaded_experiments) && count($preloaded_experiments) > 0) {
        return $preloaded_experiments;
    } else {
        $experiments = array();
        $query = "SELECT experiment_id, experiment_name, experimenter from " . table('experiments');
        $result = or_query($query);
        while ($line = pdo_fetch_assoc($result)) {
            $experiments[$line['experiment_id']] = array('time' => '', 'start_date' => '', 'end_date' => '', 'assigned' => 'n', 'participated' => 'n');
            $experiments[$line['experiment_id']]['experiment_id'] = $line['experiment_id'];
            $experiments[$line['experiment_id']]['experiment_name'] = $line['experiment_name'];
            $experiments[$line['experiment_id']]['experimenter'] = $line['experimenter'];
        }
        $query = "SELECT experiment_id, \n\t\t\t\tmin(session_start) as start_date,\n\t\t\t\tmax(session_start) as end_date \n\t\t\t\tFROM " . table('sessions') . " \n\t\t\t\tWHERE session_id>0\n\t\t\t\tGROUP BY experiment_id";
        $result = or_query($query);
        while ($line = pdo_fetch_assoc($result)) {
            $experiments[$line['experiment_id']]['time'] = 1000000000000 - $line['end_date'];
            $experiments[$line['experiment_id']]['start_date'] = $line['start_date'];
            $experiments[$line['experiment_id']]['end_date'] = $line['end_date'];
        }
        $query = "SELECT experiment_id FROM " . table('participate_at') . " GROUP BY experiment_id";
        $result = or_query($query);
        while ($line = pdo_fetch_assoc($result)) {
            $experiments[$line['experiment_id']]['assigned'] = 'y';
        }
        $participated_clause = expregister__get_pstatus_query_snippet("participated");
        $query = "SELECT experiment_id FROM " . table('participate_at') . " WHERE " . $participated_clause . " GROUP BY experiment_id";
        $result = or_query($query);
        while ($line = pdo_fetch_assoc($result)) {
            $experiments[$line['experiment_id']]['participated'] = 'y';
        }
        $sort_order = "time,experiment_name";
        multi_array_sort($experiments, $sort_order);
        $preloaded_experiments = $experiments;
        return $experiments;
    }
}