Example #1
0
 /**
  *   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);
 }