function ARC_sparql2sql_rewriter::get_left_join_code in Taxonomy import/export via XML 5
Same name and namespace in other branches
- 5.2 arc/ARC_sparql2sql_rewriter.php \ARC_sparql2sql_rewriter::get_left_join_code()
- 6.2 arc/ARC_sparql2sql_rewriter.php \ARC_sparql2sql_rewriter::get_left_join_code()
- 6 arc/ARC_sparql2sql_rewriter.php \ARC_sparql2sql_rewriter::get_left_join_code()
2 calls to ARC_sparql2sql_rewriter::get_left_join_code()
File
- arc/
ARC_sparql2sql_rewriter.php, line 496
Class
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;
}