/** * @param $query String * @param $protocol String * @return null|string */ public function prepareUrlQuerySearchString($query = null, $protocol = null) { $db = $this->getDb(); if (!is_null($query) || $query != '') { if (is_null($protocol)) { $protocol = 'http://'; } $likeQuery = LinkFilter::makeLikeArray($query, $protocol); if (!$likeQuery) { $this->dieUsage('Invalid query', 'bad_query'); } $likeQuery = LinkFilter::keepOneWildcard($likeQuery); return 'el_index ' . $db->buildLike($likeQuery); } elseif (!is_null($protocol)) { return 'el_index ' . $db->buildLike("{$protocol}", $db->anyString()); } return null; }
function getQueryInfo() { global $wgMiserMode; $dbr = wfGetDB(DB_SLAVE); // strip everything past first wildcard, so that // index-based-only lookup would be done list($this->mMungedQuery, $clause) = self::mungeQuery($this->mQuery, $this->mProt); if ($this->mMungedQuery === false) { // Invalid query; return no results return array('tables' => 'page', 'fields' => 'page_id', 'conds' => '0=1'); } $stripped = LinkFilter::keepOneWildcard($this->mMungedQuery); $like = $dbr->buildLike($stripped); $retval = array('tables' => array('page', 'externallinks'), 'fields' => array('namespace' => 'page_namespace', 'title' => 'page_title', 'value' => 'el_index', 'url' => 'el_to'), 'conds' => array('page_id = el_from', "{$clause} {$like}"), 'options' => array('USE INDEX' => $clause)); if (isset($this->mNs) && !$wgMiserMode) { $retval['conds']['page_namespace'] = $this->mNs; } return $retval; }
private function run($resultPageSet = null) { $params = $this->extractRequestParams(); $protocol = $params['protocol']; $query = $params['query']; // Find the right prefix global $wgUrlProtocols; if ($protocol && !in_array($protocol, $wgUrlProtocols)) { foreach ($wgUrlProtocols as $p) { if (substr($p, 0, strlen($protocol)) === $protocol) { $protocol = $p; break; } } } else { $protocol = null; } $db = $this->getDB(); $this->addTables(array('page', 'externallinks')); // must be in this order for 'USE INDEX' $this->addOption('USE INDEX', 'el_index'); $this->addWhere('page_id=el_from'); $this->addWhereFld('page_namespace', $params['namespace']); if (!is_null($query) || $query != '') { if (is_null($protocol)) { $protocol = 'http://'; } $likeQuery = LinkFilter::makeLikeArray($query, $protocol); if (!$likeQuery) { $this->dieUsage('Invalid query', 'bad_query'); } $likeQuery = LinkFilter::keepOneWildcard($likeQuery); $this->addWhere('el_index ' . $db->buildLike($likeQuery)); } elseif (!is_null($protocol)) { $this->addWhere('el_index ' . $db->buildLike("{$protocol}", $db->anyString())); } $prop = array_flip($params['prop']); $fld_ids = isset($prop['ids']); $fld_title = isset($prop['title']); $fld_url = isset($prop['url']); if (is_null($resultPageSet)) { $this->addFields(array('page_id', 'page_namespace', 'page_title')); $this->addFieldsIf('el_to', $fld_url); } else { $this->addFields($resultPageSet->getPageTableFields()); } $limit = $params['limit']; $offset = $params['offset']; $this->addOption('LIMIT', $limit + 1); if (isset($offset)) { $this->addOption('OFFSET', $offset); } $res = $this->select(__METHOD__); $result = $this->getResult(); $count = 0; foreach ($res as $row) { if (++$count > $limit) { // We've reached the one extra which shows that there are additional pages to be had. Stop here... $this->setContinueEnumParameter('offset', $offset + $limit); break; } if (is_null($resultPageSet)) { $vals = array(); if ($fld_ids) { $vals['pageid'] = intval($row->page_id); } if ($fld_title) { $title = Title::makeTitle($row->page_namespace, $row->page_title); ApiQueryBase::addTitleInfo($vals, $title); } if ($fld_url) { $vals['url'] = $row->el_to; } $fit = $result->addValue(array('query', $this->getModuleName()), null, $vals); if (!$fit) { $this->setContinueEnumParameter('offset', $offset + $count - 1); break; } } else { $resultPageSet->processDbRow($row); } } if (is_null($resultPageSet)) { $result->setIndexedTagName_internal(array('query', $this->getModuleName()), $this->getModulePrefix()); } }
function getSQL() { global $wgMiserMode; $dbr = wfGetDB(DB_SLAVE); $page = $dbr->tableName('page'); $externallinks = $dbr->tableName('externallinks'); /* strip everything past first wildcard, so that index-based-only lookup would be done */ list($munged, $clause) = self::mungeQuery($this->mQuery, $this->mProt); $stripped = LinkFilter::keepOneWildcard($munged); $like = $dbr->buildLike($stripped); $encSQL = ''; if (isset($this->mNs) && !$wgMiserMode) { $encSQL = 'AND page_namespace=' . $dbr->addQuotes($this->mNs); } $use_index = $dbr->useIndexClause($clause); return "SELECT\n\t\t\t\tpage_namespace AS namespace,\n\t\t\t\tpage_title AS title,\n\t\t\t\tel_index AS value,\n\t\t\t\tel_to AS url\n\t\t\tFROM\n\t\t\t\t{$page},\n\t\t\t\t{$externallinks} {$use_index}\n\t\t\tWHERE\n\t\t\t\tpage_id=el_from\n\t\t\t\tAND {$clause} {$like}\n\t\t\t\t{$encSQL}"; }
public function getQueryInfo() { $dbr = wfGetDB(DB_SLAVE); // strip everything past first wildcard, so that // index-based-only lookup would be done list($this->mungedQuery, $clause) = self::mungeQuery($this->mQuery, $this->mProt); if ($this->mungedQuery === false) { // Invalid query; return no results return ['tables' => 'page', 'fields' => 'page_id', 'conds' => '0=1']; } $stripped = LinkFilter::keepOneWildcard($this->mungedQuery); $like = $dbr->buildLike($stripped); $retval = ['tables' => ['page', 'externallinks'], 'fields' => ['namespace' => 'page_namespace', 'title' => 'page_title', 'value' => 'el_index', 'url' => 'el_to'], 'conds' => ['page_id = el_from', "{$clause} {$like}"], 'options' => ['USE INDEX' => $clause]]; if ($this->mNs !== null && !$this->getConfig()->get('MiserMode')) { $retval['conds']['page_namespace'] = $this->mNs; } return $retval; }