/** * Creates some SQL statements from the given triple pattern * array. * * @param QueryTriple $triple Array containing subject, predicate and object * @param GraphPattern $graphPattern Graph pattern object * * @return array Array consisting of on array and two string values: * SELECT, FROM and WHERE part */ function getTripleSql(QueryTriple $triple, GraphPattern $graphPattern, $arResultVars) { $arSelect = array(); $strFrom = null; $strWhere = null; $strWhereEquality = ''; $bWhereEqualitySubject = false; $bWhereEqualityPredicate = false; $bWhereEqualityObject = false; $subject = $triple->getSubject(); $predicate = $triple->getPredicate(); $object = $triple->getObject(); $arRefVars = array(); $strTablePrefix = 't' . $this->nTableId; /** * SELECT part * We do select only the columns we need for variables */ if (SparqlVariable::isVariable($subject)) { if (isset($this->arUnionVarAssignments[$this->nUnionCount][$subject])) { //already selected -> add equality check $bWhereEqualitySubject = true; $this->arUsedVarTypes[$subject]['s'] = true; } else { if (isset($this->arVarAssignments[$subject][0])) { $strTablePrefix = $this->arVarAssignments[$subject][0]; } $this->arVarAssignments[$subject] = array($strTablePrefix, 's'); $this->arUnionVarAssignments[$this->nUnionCount][$subject] = array($strTablePrefix, 's'); $this->arUsedVarTypes[$subject]['s'] = true; if (self::isResultVar($subject, $arResultVars)) { //new variable that needs to be selected $arSelect[$subject] = $this->createVariableSelectArray('s', $subject, $strTablePrefix); if (isset($this->arUsedVarAssignments[$subject])) { $arRefVars[$subject] = $strTablePrefix . '.subject'; } else { $this->arUsedVarAssignments[$subject] = $strTablePrefix . '.subject'; } } } } if (SparqlVariable::isVariable($predicate)) { if (isset($this->arUnionVarAssignments[$this->nUnionCount][$predicate])) { //already selected -> add equality check $bWhereEqualityPredicate = true; $this->arUsedVarTypes[$predicate]['p'] = true; } else { if (isset($this->arVarAssignments[$predicate][0])) { $strTablePrefix = $this->arVarAssignments[$predicate][0]; } $this->arVarAssignments[$predicate] = array($strTablePrefix, 'p'); $this->arUnionVarAssignments[$this->nUnionCount][$predicate] = array($strTablePrefix, 'p'); $this->arUsedVarTypes[$predicate]['p'] = true; if (self::isResultVar($predicate, $arResultVars)) { $arSelect[$predicate] = $this->createVariableSelectArray('p', $predicate, $strTablePrefix); if (isset($this->arUsedVarAssignments[$predicate])) { $arRefVars[$predicate] = $strTablePrefix . '.predicate'; } else { $this->arUsedVarAssignments[$predicate] = $strTablePrefix . '.predicate'; } } } } if (SparqlVariable::isVariable($object)) { if (isset($this->arUnionVarAssignments[$this->nUnionCount][$object])) { //already selected -> add equality check $bWhereEqualityObject = true; $this->arUsedVarTypes[$object]['o'] = true; } else { if (isset($this->arVarAssignments[$object][0])) { $strTablePrefix = $this->arVarAssignments[$object][0]; } $this->arVarAssignments[$object] = array($strTablePrefix, 'o'); $this->arUnionVarAssignments[$this->nUnionCount][$object] = array($strTablePrefix, 'o'); $this->arUsedVarTypes[$object]['o'] = true; if (self::isResultVar($object, $arResultVars)) { $arSelect[$object] = $this->createVariableSelectArray('o', $object, $strTablePrefix); if (isset($this->arUsedVarAssignments[$object])) { $arRefVars[$object] = $strTablePrefix . '.object'; } else { $this->arUsedVarAssignments[$object] = $strTablePrefix . '.object'; } } if (isset($this->query->varLanguages[$object]) && $this->query->varLanguages[$object] !== null) { $strWhereEquality .= ' AND ' . $strTablePrefix . '.l_language = "' . addslashes($this->query->varLanguages[$object]) . '"'; } if (isset($this->query->varDatatypes[$object]) && $this->query->varDatatypes[$object] !== null) { $strWhereEquality .= ' AND ' . $strTablePrefix . '.l_datatype = "' . addslashes($this->query->varDatatypes[$object]) . '"'; } } } /** * WhereEquality - needs to be done now because strTablePrefix may change */ if ($bWhereEqualitySubject) { $strWhereEquality .= ' AND ' . self::getSqlEqualityCondition(array($strTablePrefix, 's'), $this->arVarAssignments[$subject]); } if ($bWhereEqualityPredicate) { $strWhereEquality .= ' AND ' . self::getSqlEqualityCondition(array($strTablePrefix, 'p'), $this->arVarAssignments[$predicate]); } if ($bWhereEqualityObject) { $strWhereEquality .= ' AND ' . self::getSqlEqualityCondition(array($strTablePrefix, 'o'), $this->arVarAssignments[$object]); } /** * FROM part */ if ($this->nUnionTriplePatternCount == 0) { //first FROM $strFrom = $this->tblStatements . ' as ' . $strTablePrefix; } else { //normal join if (count($this->arModelIds) == 1) { $strFrom = 'LEFT JOIN ' . $this->tblStatements . ' as ' . $strTablePrefix . ' ON t0.modelID = ' . $strTablePrefix . '.modelID'; } else { if (count($this->arModelIds) > 1) { $arIDs = array(); foreach ($this->arModelIds as $nId) { $arIDs[] = $strTablePrefix . '.modelID = ' . intval($nId); } $strFrom = 'LEFT JOIN ' . $this->tblStatements . ' as ' . $strTablePrefix . ' ON (' . implode(' OR ', $arIDs) . ')'; } else { $strFrom = 'LEFT JOIN ' . $this->tblStatements . ' as ' . $strTablePrefix . ' ON t0.modelID = ' . $strTablePrefix . '.modelID'; } } foreach ($arRefVars as $strRefVar => $strSqlVar) { $strFrom .= ' AND ' . $this->arUsedVarAssignments[$strRefVar] . ' = ' . $strSqlVar; } if ($graphPattern->getOptional() !== null) { $strFrom .= $this->getSqlCondition($subject, $strTablePrefix, 'subject') . $this->getSqlCondition($predicate, $strTablePrefix, 'predicate') . $this->getSqlCondition($object, $strTablePrefix, 'object') . $strWhereEquality; } } /** * WHERE part */ if ($this->nUnionTriplePatternCount == 0) { if (count($this->arModelIds) == 1) { $strWhere = $strTablePrefix . '.modelID = ' . intval(reset($this->arModelIds)); } else { if (count($this->arModelIds) > 1) { $arIDs = array(); foreach ($this->arModelIds as $nId) { $arIDs[] = $strTablePrefix . '.modelID = ' . intval($nId); } $strWhere = '(' . implode(' OR ', $arIDs) . ')'; } else { //so that we can append an AND $strWhere = '1'; } } } if ($graphPattern->getOptional() === null || $this->nGraphPatternCount == 0) { $strWhere .= $this->getSqlCondition($subject, $strTablePrefix, 'subject') . $this->getSqlCondition($predicate, $strTablePrefix, 'predicate') . $this->getSqlCondition($object, $strTablePrefix, 'object') . $strWhereEquality; } return array($arSelect, $strFrom, $strWhere); }