You are here

function ARC_sparql2sql_rewriter::get_left_join_code in Taxonomy import/export via XML 6

Same name and namespace in other branches
  1. 5.2 arc/ARC_sparql2sql_rewriter.php \ARC_sparql2sql_rewriter::get_left_join_code()
  2. 5 arc/ARC_sparql2sql_rewriter.php \ARC_sparql2sql_rewriter::get_left_join_code()
  3. 6.2 arc/ARC_sparql2sql_rewriter.php \ARC_sparql2sql_rewriter::get_left_join_code()
2 calls to ARC_sparql2sql_rewriter::get_left_join_code()
ARC_sparql2sql_rewriter::get_select_sql in arc/ARC_sparql2sql_rewriter.php
ARC_sparql2sql_rewriter::get_union_select_sql in arc/ARC_sparql2sql_rewriter.php

File

arc/ARC_sparql2sql_rewriter.php, line 496

Class

ARC_sparql2sql_rewriter

Code

function get_left_join_code() {
  $result = "";
  $added_aliases = array();
  $optional_sets = array();
  $alias2parent_optional = array();
  foreach ($this->optional_term2alias as $name => $alias_infos) {

    //$result.="\n".$name;
    foreach ($alias_infos as $alias_info) {
      $joined_alias = $alias_info["alias"];

      //$result.="\n".$joined_alias;
      if (!in_array("T" . $joined_alias, $added_aliases)) {
        $joined_col = $alias_info["col"];
        $joined_term = $alias_info["term"];
        $joined_term_val = $joined_term["val"];
        if (($ref_alias_infos = @$this->term2alias[$joined_term_val]) || ($ref_alias_infos = @$this->optional_term2alias[$joined_term_val])) {
          $ref_alias_info = $ref_alias_infos[0];
          $ref_alias = $ref_alias_info["alias"];
          $ref_col = $ref_alias_info["col"];
          $cur_tbl_name = $this
            ->get_best_table_name($joined_alias);
          $result .= "\n LEFT JOIN " . $cur_tbl_name . " T" . $joined_alias . " ON ";
          $result .= "\n  (";
          $result .= "\n   T" . $joined_alias . "." . $joined_col . "=T" . $ref_alias . "." . $ref_col;

          /* alias patterns */
          if ($patterns = $this->optional_patterns["T" . $joined_alias]) {
            foreach ($patterns as $cur_pattern) {
              $result .= "\n   AND\n   " . $cur_pattern;
            }
          }

          /* other terms in current alias pattern */
          $term_infos = $this->alias2term[$joined_alias];
          foreach ($term_infos as $cur_term_info) {
            $cur_term = $cur_term_info["term"];
            $cur_term_type = $cur_term["type"];
            $cur_term_val = $cur_term["val"];
            $cur_col = $cur_term_info["col"];
            if ($cur_col != $joined_col) {

              //$result.="\nother: ".$cur_term_val." (".$cur_col.")";
              $other_alias_infos = false;

              /* check if term is used in non-optional patterns */
              if ($other_alias_infos = @$this->term2alias[$cur_term_val]) {
              }
              elseif ($pre_other_alias_infos = @$this->optional_term2alias[$cur_term_val]) {
                $other_alias_infos = array();
                foreach ($pre_other_alias_infos as $cur_other_alias_info) {
                  if ($cur_other_alias_info["alias"] < $joined_alias) {
                    $other_alias_infos[] = $cur_other_alias_info;
                  }
                }
              }
              if ($other_alias_infos) {
                foreach ($other_alias_infos as $cur_other_alias_info) {
                  $other_alias = $cur_other_alias_info["alias"];
                  $other_col = $cur_other_alias_info["col"];
                  $other_tbl_alias = "T" . $other_alias . "." . $other_col;
                  $result .= "\n   AND (";
                  $result .= "T" . $joined_alias . "." . $cur_col . "=" . $other_tbl_alias;

                  /* find out if other_col is in different optional */
                  if ($cur_other_alias_info["optional_count"] && $cur_other_alias_info["optional_count"] != $alias_info["optional_count"]) {
                    $result .= " OR " . $other_tbl_alias . " IS NULL";
                    if (!isset($this->alias_alternatives[$other_tbl_alias])) {
                      $this->alias_alternatives[$other_tbl_alias] = array();
                    }
                    $this->alias_alternatives[$other_tbl_alias][] = array(
                      "alias" => $joined_alias,
                      "col" => $cur_col,
                    );
                  }
                  $result .= ")";
                }
              }
            }
          }

          /* dataset restrictions */
          if ($dataset_code = $this
            ->get_dataset_code(true, $joined_alias)) {
            $result .= "\n   AND\n   " . $dataset_code;
          }
          $result .= "\n  )";
          $added_aliases[] = "T" . $joined_alias;
        }

        /* optional groups */
        if (!array_key_exists($alias_info["optional_count"], $optional_sets)) {
          $optional_sets[$alias_info["optional_count"]] = array(
            "T" . $joined_alias . "." . $joined_col,
          );
          if ($parent_optional_count = $alias_info["parent_optional_count"]) {
            $alias2parent_optional["T" . $joined_alias . "." . $joined_col] = $parent_optional_count;
          }
        }
        else {
          $optional_sets[$alias_info["optional_count"]][] = "T" . $joined_alias . "." . $joined_col;
        }
      }
    }
  }

  /* optional sets */
  $sub_result = "";
  foreach ($optional_sets as $k => $cur_set) {
    $null_set = $cur_set;
    $not_null_set = $cur_set;
    $set_entry = $cur_set[0];
    while ($parent_set_id = @$alias2parent_optional[$set_entry]) {

      /* nested optional, only NOT NULL if all parent patterns are NOT NULL as well */
      $parent_set = $optional_sets[$parent_set_id];
      $set_entry = $parent_set[0];
      foreach ($parent_set as $cur_alias) {
        if (!in_array($cur_alias, $not_null_set)) {
          $not_null_set[] = $cur_alias;
        }
      }
    }
    if (count($not_null_set) > 1) {

      /* not null */
      $not_null_code = "";
      foreach ($not_null_set as $cur_alias) {
        $not_null_code .= strlen($not_null_code) ? " AND " : "";
        $not_null_code .= $cur_alias . " IS NOT NULL";
      }

      /* null */
      $null_code = "";
      foreach ($null_set as $cur_alias) {
        $null_code .= strlen($null_code) ? " AND " : "";
        $null_code .= $cur_alias . " IS NULL";
      }
      $sub_result .= strlen($sub_result) ? " AND " : "";
      $sub_result .= "((" . $not_null_code . ") OR (" . $null_code . "))";
      $sub_result .= "\n";
    }
  }
  if ($sub_result) {
    $this->where_code .= strlen($this->where_code) ? "\n AND " : "\n";
    $this->where_code .= $sub_result;
  }
  return $result;
}