function new_query($criteria_values = NULL)
 {
     global $CONF, $USER;
     $result = new Query($this->module);
     $is_page_size_mandatory = TRUE;
     if (isset($this->config['is_page_size_mandatory'])) {
         $is_page_size_mandatory = $this->config['is_page_size_mandatory'];
     }
     // Table name
     if (@$this->config['table_name'] != '') {
         $result->table_name = $this->config['table_name'];
     }
     // Cache
     $cache_class = $this->config['cache_class'];
     $result->_cache = new $cache_class(@$CONF['query_cache_size']);
     // Encoder
     $encoder_class = $this->config['encoder_class'];
     $result->_encoder = new $encoder_class($result);
     // Filters
     if (@$this->config['filters']) {
         // Instantiate if necessary
         $filters = array();
         foreach ($this->config['filters'] as $f) {
             if (is_string($f)) {
                 if (class_exists($f)) {
                     $filters[] = new $f();
                 } else {
                     xlog(1, 'Filter not found: ' . $f, 'QUERY');
                 }
             } else {
                 $filters[] = $f;
             }
         }
         $result->filters = $filters;
     }
     // Lists
     if (@$this->config['query_lists']) {
         foreach ($this->config['query_lists'] as $list_name => $list) {
             $result->add_list($list_name, $list);
         }
     }
     $result->criteria_container = new QueryCriteria();
     if (@$this->config['criteria_defs']) {
         foreach ($this->config['criteria_defs'] as $criterion) {
             if ($criterion instanceof QueryCriterion) {
                 $result->add_criterion($criterion);
             } else {
                 if (is_array($criterion)) {
                     $result->add_criterion(QueryCriterionFactory::create($criterion));
                 }
             }
         }
         if ($criteria_values) {
             $result->set_criteria_values($criteria_values);
         }
     }
     // if no page size QC has been added, then add the default if required
     if ($is_page_size_mandatory && !isset($result['page_size'])) {
         $result->add_criterion($this->create_page_size_criterion());
     }
     // ask the criterion for any lists (date ranges for example)
     foreach ($result->criteria_container->get_lists() as $qs_key => $list) {
         $result->add_list($qs_key, $list);
     }
     // set default page size based on user prefs
     if (isset($result['page_size']) && isset($USER->prefs['page_size'])) {
         $result['page_size']->set_default($USER->prefs['page_size']);
     }
     return $result;
 }