diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/SPARQLStore/QueryEngine/QueryResultFactory.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/src/SPARQLStore/QueryEngine/QueryResultFactory.php | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/SPARQLStore/QueryEngine/QueryResultFactory.php b/www/wiki/extensions/SemanticMediaWiki/src/SPARQLStore/QueryEngine/QueryResultFactory.php new file mode 100644 index 00000000..1c6c944d --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/src/SPARQLStore/QueryEngine/QueryResultFactory.php @@ -0,0 +1,140 @@ +<?php + +namespace SMW\SPARQLStore\QueryEngine; + +use SMW\Exporter\Element\ExpElement; +use SMW\Store; +use SMWExporter as Exporter; +use SMWQuery as Query; +use SMWQueryResult as QueryResult; + +/** + * @license GNU GPL v2+ + * @since 2.0 + * + * @author Markus Krötzsch + * @author mwjames + */ +class QueryResultFactory { + + /** + * @var Store + */ + private $store; + + /** + * @since 2.0 + * + * @param Store $store + */ + public function __construct( Store $store ) { + $this->store = $store; + } + + /** + * @since 2.0 + * + * @param Query $query QueryResults hold a reference to original query + * @param boolean $hasFurtherResults + * + * @return QueryResult + */ + public function newEmptyQueryResult( Query $query, $hasFurtherResults = false ) { + return new QueryResult( + $query->getDescription()->getPrintrequests(), + $query, + [], + $this->store, + $hasFurtherResults + ); + } + + /** + * This function is used to generate instance query results, and the given + * result wrapper must have an according format (one result column that + * contains URIs of wiki pages). + * + * @param RepositoryResult|null $repositoryResult + * @param Query $query QueryResults hold a reference to original query + * + * @return QueryResult + */ + public function newQueryResult( RepositoryResult $repositoryResult = null , Query $query ) { + + if ( $repositoryResult === null ) { + return $this->newEmptyQueryResult( $query ); + } + + if ( $query->querymode === Query::MODE_COUNT ) { + return $this->makeQueryResultForCount( $repositoryResult, $query ); + } + + return $this->makeQueryResultForInstance( $repositoryResult, $query ); + } + + private function makeQueryResultForCount( RepositoryResult $repositoryResult, Query $query ) { + + $queryResult = new QueryResult( + $query->getDescription()->getPrintrequests(), + $query, + [], + $this->store, + false + ); + + if ( $repositoryResult->getErrorCode() === RepositoryResult::ERROR_NOERROR ) { + $queryResult->setCountValue( $repositoryResult->getNumericValue() ); + } else { + $queryResult->addErrors( [ wfMessage( 'smw_db_sparqlqueryproblem' )->inContentLanguage()->text() ] ); + } + + return $queryResult; + } + + private function makeQueryResultForInstance( RepositoryResult $repositoryResult, Query $query ) { + + $resultDataItems = []; + + foreach ( $repositoryResult as $resultRow ) { + + if ( count( $resultRow ) > 0 && $resultRow[0] instanceof ExpElement ) { + $dataItem = Exporter::getInstance()->findDataItemForExpElement( $resultRow[0] ); + + if ( !is_null( $dataItem ) ) { + $resultDataItems[] = $dataItem; + } + } + } + + if ( $repositoryResult->numRows() > $query->getLimit() ) { + if ( count( $resultDataItems) > 1 ) { + array_pop( $resultDataItems ); + } + $hasFurtherResults = true; + } else { + $hasFurtherResults = false; + } + + $result = new QueryResult( + $query->getDescription()->getPrintrequests(), + $query, + $resultDataItems, + $this->store, + $hasFurtherResults + ); + + switch ( $repositoryResult->getErrorCode() ) { + case RepositoryResult::ERROR_NOERROR: + break; + case RepositoryResult::ERROR_INCOMPLETE: + $result->addErrors( [ wfMessage( 'smw_db_sparqlqueryincomplete' )->inContentLanguage()->text() ] ); + break; + default: + $result->addErrors( [ wfMessage( 'smw_db_sparqlqueryproblem' )->inContentLanguage()->text() ] ); + break; + } + + return $result; + } + +} |