MediaWiki
REL1_22
|
00001 <?php 00002 00029 abstract class ApiQueryORM extends ApiQueryBase { 00030 00038 abstract protected function getTable(); 00039 00050 protected function getRowName() { 00051 return 'item'; 00052 } 00053 00064 protected function getListName() { 00065 return 'items'; 00066 } 00067 00075 protected function getResultPath() { 00076 return null; 00077 } 00078 00085 public function execute() { 00086 $params = $this->getParams(); 00087 00088 if ( !in_array( 'id', $params['props'] ) ) { 00089 $params['props'][] = 'id'; 00090 } 00091 00092 $results = $this->getResults( $params, $this->getConditions( $params ) ); 00093 $this->addResults( $params, $results ); 00094 } 00095 00104 protected function getParams() { 00105 return array_filter( 00106 $this->extractRequestParams(), 00107 function( $prop ) { 00108 return isset( $prop ); 00109 } 00110 ); 00111 } 00112 00124 protected function getConditions( array $params ) { 00125 $conditions = array(); 00126 $fields = $this->getTable()->getFields(); 00127 00128 foreach ( $params as $name => $value ) { 00129 if ( array_key_exists( $name, $fields ) ) { 00130 $conditions[$name] = $value; 00131 } 00132 } 00133 00134 return $conditions; 00135 } 00136 00147 protected function getResults( array $params, array $conditions ) { 00148 return $this->getTable()->select( 00149 $params['props'], 00150 $conditions, 00151 array( 00152 'LIMIT' => $params['limit'] + 1, 00153 'ORDER BY' => $this->getTable()->getPrefixedField( 'id' ) . ' ASC', 00154 ), 00155 __METHOD__ 00156 ); 00157 } 00158 00167 protected function addResults( array $params, ORMResult $results ) { 00168 $serializedResults = array(); 00169 $count = 0; 00170 00171 foreach ( $results as /* IORMRow */ $result ) { 00172 if ( ++$count > $params['limit'] ) { 00173 // We've reached the one extra which shows that 00174 // there are additional pages to be had. Stop here... 00175 $this->setContinueEnumParameter( 'continue', $result->getId() ); 00176 break; 00177 } 00178 00179 $serializedResults[] = $this->formatRow( $result, $params ); 00180 } 00181 00182 $this->setIndexedTagNames( $serializedResults ); 00183 $this->addSerializedResults( $serializedResults ); 00184 } 00185 00196 protected function formatRow( IORMRow $result, array $params ) { 00197 return $result->toArray( $params['props'] ); 00198 } 00199 00207 protected function setIndexedTagNames( array &$serializedResults ) { 00208 $this->getResult()->setIndexedTagName( $serializedResults, $this->getRowName() ); 00209 } 00210 00218 protected function addSerializedResults( array $serializedResults ) { 00219 $this->getResult()->addValue( 00220 $this->getResultPath(), 00221 $this->getListName(), 00222 $serializedResults 00223 ); 00224 } 00225 00230 public function getAllowedParams() { 00231 $params = array( 00232 'props' => array( 00233 ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(), 00234 ApiBase::PARAM_ISMULTI => true, 00235 ApiBase::PARAM_REQUIRED => true, 00236 ), 00237 'limit' => array( 00238 ApiBase::PARAM_DFLT => 20, 00239 ApiBase::PARAM_TYPE => 'limit', 00240 ApiBase::PARAM_MIN => 1, 00241 ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, 00242 ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 00243 ), 00244 'continue' => null, 00245 ); 00246 00247 return array_merge( $this->getTable()->getAPIParams(), $params ); 00248 } 00249 00254 public function getParamDescription() { 00255 $descriptions = array( 00256 'props' => 'Fields to query', 00257 'continue' => 'Offset number from where to continue the query', 00258 'limit' => 'Max amount of rows to return', 00259 ); 00260 00261 return array_merge( $this->getTable()->getFieldDescriptions(), $descriptions ); 00262 } 00263 00264 }