Exemple #1
0
 /**
  * @param bool $use_temp_table
  * @return string|array
  */
 public function get_sql_query($use_temp_table)
 {
     $index = $this->index_table;
     $has_conditions = count($this->condition_stack[0]) > 0;
     $create_temp_table = $use_temp_table && $has_conditions;
     if (!$create_temp_table) {
         foreach ($this->condition_joins as $table_name => $join_condition) {
             $this->add_left_join($table_name);
         }
     }
     // prepare ORDER BY and value for the `Score` column
     $ranking_select = "1 AS `Score` ";
     $order_by = "";
     $sort_field_name = $this->query->get('sort_by');
     if ($sort_field_name == "last_modified") {
         $this->add_join($this->document_table);
         $order_by = "ORDER BY `{$this->document_table}`.`LastModified` DESC";
     } elseif ($sort_field_name) {
         // some other field
         /** @var $sort_fields nc_search_provider_index_field_manager */
         $sort_fields = $this->translator->get_fields('name', $sort_field_name)->where('is_sortable', true);
         if (count($sort_fields)) {
             $order_by = array();
             /** @var $f nc_search_provider_index_field */
             foreach ($sort_fields as $f) {
                 $field_table_name = $f->get_field_table_name();
                 $this->add_left_join($field_table_name);
                 $order_by[] = "`{$field_table_name}`.`RawData`";
             }
             $order_by = "ORDER BY IFNULL(" . join(", ", $order_by) . ", 0) " . ($this->query->get('sort_direction') == SORT_DESC ? "DESC" : "ASC");
         }
     }
     if (!$order_by) {
         // standard sorting by relevance
         $ranking_select = $this->term_ranking_calculation();
         $order_by = "ORDER BY `Score` DESC";
     }
     // Prepare area condition (will need join)
     $area_condition = "";
     $area = $this->query->get('area');
     if ($area) {
         $this->add_join($this->document_table);
         if (!$area instanceof nc_search_area) {
             $area = new nc_search_area($area);
         }
         $area_condition = "AND " . $area->get_sql_condition() . "\n";
     }
     // Compose query
     // SELECT
     $query_string = "SELECT " . ($create_temp_table ? "" : "SQL_CALC_FOUND_ROWS ") . "`{$index}`.`Document_ID`,\n" . $ranking_select;
     // FROM
     $query_string .= "FROM `{$index}` FORCE INDEX (`Content`)\n";
     // INNER JOINs
     foreach ($this->joins as $j) {
         $query_string .= "{$j}\n";
     }
     // LEFT JOINs
     foreach ($this->left_joins as $j) {
         $query_string .= "{$j}\n";
     }
     // WHERE [index_match_condition]
     // (1) Index match;                  (2) site/path filter
     $query_string .= "WHERE {$this->index_match}\n{$area_condition}";
     // (3) Extra conditions
     if ($has_conditions && !$use_temp_table) {
         $query_string .= "AND " . join("\nAND ", $this->condition_stack[0]);
     }
     // ORDER
     $query_string .= "\n{$order_by}";
     if ($use_temp_table) {
         $t = $this->get_temporary_table_name();
         $queries = array("temp_table" => $t, "prefilter" => $query_string, "refinement" => "SELECT t.`Document_ID`, t.`Rank`\n" . "FROM `{$t}` AS t\n" . join("\n", $this->condition_joins) . "\n" . "WHERE t.`Rank` >= IFNULL(@rank_value,0) AND" . join("\nAND ", $this->condition_stack[0]) . "\n" . "ORDER BY t.`Rank`\n");
         return $queries;
     } else {
         // LIMIT, OFFSET
         $query_string .= "\nLIMIT " . (int) $this->query->get('limit') . "\nOFFSET " . (int) $this->query->get('offset');
         return $query_string;
     }
 }