X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQueryPageProps.php;h=1f992f8ff5631fc522e387a4be9ce5939aa71961;hb=46fdbb4c0ee144300e0cf277fde286136aea674d;hp=c2a8df7d0f21b0d29d09ddaa1c081759765f9d0e;hpb=a0e11fff0c12b73aa2d9083b32a066f61e55399e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryPageProps.php b/includes/api/ApiQueryPageProps.php index c2a8df7d0f..1f992f8ff5 100644 --- a/includes/api/ApiQueryPageProps.php +++ b/includes/api/ApiQueryPageProps.php @@ -40,44 +40,63 @@ class ApiQueryPageProps extends ApiQueryBase { public function execute() { # Only operate on existing pages $pages = $this->getPageSet()->getGoodTitles(); + if ( !count( $pages ) ) { + # Nothing to do + return; + } $this->params = $this->extractRequestParams(); + + $this->addTables( 'page_props' ); + $this->addFields( array( 'pp_page', 'pp_propname', 'pp_value' ) ); + $this->addWhereFld( 'pp_page', array_keys( $pages ) ); + if ( $this->params['continue'] ) { - $continueValue = intval( $this->params['continue'] ); - $filteredPages = array(); - foreach ( $pages as $id => $page ) { - if ( $id >= $continueValue ) { - $filteredPages[$id] = $page; - } - } - $pages = $filteredPages; + $this->addWhere( 'pp_page >=' . intval( $this->params['continue'] ) ); } - if ( !count( $pages ) ) { - # Nothing to do - return; + if ( $this->params['prop'] ) { + $this->addWhereFld( 'pp_propname', $this->params['prop'] ); + } + + # Force a sort order to ensure that properties are grouped by page + # But only if pp_page is not constant in the WHERE clause. + if ( count( $pages ) > 1 ) { + $this->addOption( 'ORDER BY', 'pp_page' ); } - $pageProps = PageProps::getInstance(); + $res = $this->select( __METHOD__ ); + $currentPage = 0; # Id of the page currently processed $props = array(); $result = $this->getResult(); - if ( $this->params['prop'] ) { - $propnames = $this->params['prop']; - $properties = array(); - foreach ( $propnames as $propname ) { - $values = $pageProps->getProperty( $pages, $propname ); - foreach ( $values as $page => $value ) { - if ( !isset( $properties[$page] ) ) { - $properties[$page] = array(); + + foreach ( $res as $row ) { + if ( $currentPage != $row->pp_page ) { + # Different page than previous row, so add the properties to + # the result and save the new page id + + if ( $currentPage ) { + if ( !$this->addPageProps( $result, $currentPage, $props ) ) { + # addPageProps() indicated that the result did not fit + # so stop adding data. Reset props so that it doesn't + # get added again after loop exit + + $props = array(); + break; } - $properties[$page][$propname] = $value; + + $props = array(); } + + $currentPage = $row->pp_page; } - } else { - $properties = $pageProps->getProperties( $pages ); + + $props[$row->pp_propname] = $row->pp_value; } - foreach ( $properties as $page => $props ) { - $this->addPageProps( $result, $page, $props ); + + if ( count( $props ) ) { + # Add any remaining properties to the results + $this->addPageProps( $result, $currentPage, $props ); } }