/** * if the selected resources changed (due to filters or limit or offset) * we have to change the value query as well (because the resources are mentioned as subjects) * * @return OntoWiki_Model_Instances $this */ protected function updateValueQuery() { if ($this->_valueQueryUptodate) { return $this; } $resources = $this->getShownResources(); foreach ($resources as $key => $resource) { $resources[$key] = new Erfurt_Sparql_Query2_SameTerm($this->_resourceVar, new Erfurt_Sparql_Query2_IriRef($resource['value'])); } if ($this->_valueQueryResourceFilter == null) { $this->_valueQueryResourceFilter = new Erfurt_Sparql_Query2_Filter(new Erfurt_Sparql_Query2_BooleanLiteral(false)); $this->_valueQuery->addElement($this->_valueQueryResourceFilter); } $this->_valueQueryResourceFilter->setConstraint(empty($resources) ? new Erfurt_Sparql_Query2_BooleanLiteral(false) : new Erfurt_Sparql_Query2_ConditionalOrExpression($resources)); //fix for a strange issue where a query with only optionals fails //(but there is a magic/unkown condition, that makes it work for some queries!?) //if($this->_store->getBackendName() == 'ZendDb'){ $hasTriple = false; foreach ($this->_valueQuery->getWhere()->getElements() as $element) { if ($element instanceof Erfurt_Sparql_Query2_IF_TriplesSameSubject) { $hasTriple = true; break; } } if (!$hasTriple) { $this->_valueQuery->getWhere()->addElement(new Erfurt_Sparql_Query2_Triple($this->_resourceVar, new Erfurt_Sparql_Query2_Var('p'), new Erfurt_Sparql_Query2_Var('o'))); } //} //remove duplicate triples... $this->_valueQuery->optimize(); $this->_valueQueryUptodate = true; return $this; }