Phoenix303 has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/225005

Change subject: Get outdated messages in the target language using 
MessageCollection
......................................................................

Get outdated messages in the target language using MessageCollection

Steps:
1. Used filtered query to search for a string in a source language.
Suppose source language is finnish, search for 'Aloita', it returns all
finnish messages with 'Aloita'.(Default source language is the wiki's content 
language)
2. Create message definitions for all message keys found in step 1.
3. Filter to get all the outdated messages in the selected target language.
By default the target language is the interface language.

Use parameter 'filter=translated' to get translated messages.

Bug: T101221
Change-Id: Ic0326d688f799a91d308ebd1d78facccb2a4e61a
---
M specials/SpecialSearchTranslations.php
M ttmserver/ElasticSearchTTMServer.php
2 files changed, 106 insertions(+), 10 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Translate 
refs/changes/05/225005/1

diff --git a/specials/SpecialSearchTranslations.php 
b/specials/SpecialSearchTranslations.php
index 17c880e..364ed16 100644
--- a/specials/SpecialSearchTranslations.php
+++ b/specials/SpecialSearchTranslations.php
@@ -51,6 +51,7 @@
        }
 
        public function execute( $par ) {
+               global $wgLanguageCode;
                $this->setHeaders();
                $this->checkPermissions();
 
@@ -64,9 +65,11 @@
 
                $this->opts = $opts = new FormOptions();
                $opts->add( 'query', '' );
+               $opts->add( 'sourcelanguage', '' );
                $opts->add( 'language', '' );
                $opts->add( 'group', '' );
                $opts->add( 'grouppath', '' );
+               $opts->add( 'filter', '' );
                $opts->add( 'limit', $this->limit );
                $opts->add( 'offset', 0 );
 
@@ -87,9 +90,23 @@
                        throw new ErrorPageError( 'tux-sst-solr-offline-title', 
'tux-sst-solr-offline-body' );
                }
 
+               $terms = array();
+               if( $opts->getValue( 'filter' ) === 'outdated' ) {
+                       if ( $opts->getValue( 'language' ) === '' ) {
+                               $opts->add( 'language', 
$this->getLanguage()->getCode() );
+                       }
+                       $collection = $this->applyFilter( $resultset );
+                       $docs = $collection['documents'];
+                       $terms = $collection['terms'];
+                       $documents = $this->getMessages( $docs );
+                       $total = $collection['total'];
+               } else {
+                       $documents = $server->getDocuments( $resultset );
+                       $total = $server->getTotalHits( $resultset );
+               }
+
                // Part 1: facets
                $facets = $server->getFacets( $resultset );
-               $total = $server->getTotalHits( $resultset );
                $facetHtml = '';
 
                if ( count( $facets['language'] ) > 0 ) {
@@ -113,7 +130,6 @@
 
                // Part 2: results
                $resultsHtml = '';
-               $documents = $server->getDocuments( $resultset );
 
                foreach ( $documents as $document ) {
                        $text = $document['content'];
@@ -145,7 +161,7 @@
                                $resultAttribs['data-translation'] = 
$helpers->getTranslation();
                                $resultAttribs['data-group'] = $groupId;
 
-                               $uri = wfAppendQuery( $document['uri'], array( 
'action' => 'edit' ) );
+                               $uri = wfAppendQuery( 
$handle->getTitle()->getCanonicalUrl(), array( 'action' => 'edit' ) );
                                $link = Html::element( 'a', array(
                                        'href' => $uri,
                                ), $this->msg( 'tux-sst-edit' )->text() );
@@ -209,6 +225,47 @@
                $this->showSearch( $search, $count, $facetHtml, $resultsHtml );
        }
 
+       protected function getMessages( $collect ) {
+               $ret = $documents = array();
+               foreach ( $collect as $mkey => $value ) {
+                       $ret = array();
+                       $ret['content'] = $collect[$mkey]['translation'];
+                       $localid = explode( '/', 
$collect[$mkey]['title']->getPrefixedText() );
+                       $ret['localid'] = $localid[0];
+                       $ret['language'] = $localid[1];
+                       $documents[] = $ret;
+               }
+               return $documents;
+       }
+
+       protected function applyFilter( $resultset ) {
+               $messages = $documents = $terms = array();
+               $language = $this->opts->getValue( 'language' );
+               foreach ( $resultset->getResults() as $document ) {
+                       $data = $document->getData();
+                       $localid = explode( ':', $data['localid'] );
+                       $namespace = strtoupper( "NS_" . $localid[0] );
+                       $key = implode( ':', array( constant( $namespace ), 
$localid[1] ) );
+                       $messages[$key] = $data['content'];
+                       $terms[] = $data['localid'];
+               }
+
+               $definitions = new MessageDefinitions( $messages );
+               $collection = MessageCollection::newFromDefinitions( 
$definitions, $language );
+               $collection->filter( 'fuzzy', false );
+
+               $total = count( $collection );
+               $offset = $collection->slice( $this->opts->getValue('offset'), 
$this->limit );
+               $collection->loadTranslations();
+
+               foreach ( $collection->keys() as $mkey => $title ) {
+                       $documents[$mkey]['title'] = $title;
+                       $documents[$mkey]['definition'] = $messages[$mkey];
+                       $documents[$mkey]['translation'] = 
$collection[$mkey]->translation();
+               }
+               return array( 'documents' => $documents, 'terms'=> $terms, 
'total' => $total );
+       }
+
        protected function getLanguages( array $facet ) {
                $output = array();
 
diff --git a/ttmserver/ElasticSearchTTMServer.php 
b/ttmserver/ElasticSearchTTMServer.php
index c0dbb55..7fffc1a 100644
--- a/ttmserver/ElasticSearchTTMServer.php
+++ b/ttmserver/ElasticSearchTTMServer.php
@@ -461,6 +461,7 @@
 
        // Search interface
        public function search( $queryString, $opts, $highlight ) {
+               global $wgLanguageCode;
                $query = new \Elastica\Query();
 
                // Allow searching either by message content or message id 
(page name
@@ -472,7 +473,30 @@
                $messageQuery = new \Elastica\Query\Term();
                $messageQuery->setTerm( 'localid', $queryString );
                $serchQuery->addShould( $messageQuery );
-               $query->setQuery( $serchQuery );
+
+               if ( $opts->getValue( 'filter' ) === 'outdated' ) {
+                       $filteredQuery = new \Elastica\Query\Filtered();
+                       $filterbool = new \Elastica\Filter\Bool();
+
+                       if ( $opts->getValue( 'sourcelanguage' ) !== ''
+                               && $opts->getValue( 'sourcelanguage' ) !== null
+                       ) {
+                               $sourcelanguage = $opts->getValue( 
'sourcelanguage' );
+                       } else {
+                               $sourcelanguage = $wgLanguageCode;
+                       }
+
+                       $languageFilter = new \Elastica\Filter\Term();
+                       $languageFilter->setTerm( 'language', $sourcelanguage );
+                       $filterbool->addMust( $languageFilter );
+
+                       $filteredQuery->setFilter($filterbool);
+                       $filteredQuery->setQuery($serchQuery);
+
+                       $query->setQuery( $filteredQuery );
+               } else {
+                       $query->setQuery( $serchQuery );
+               }
 
                $language = new \Elastica\Facet\Terms( 'language' );
                $language->setField( 'language' );
@@ -495,7 +519,12 @@
                // of the subfilters are reused. May not make a difference in 
this context.
                $filters = new \Elastica\Filter\Bool();
 
-               $language = $opts->getValue( 'language' );
+               if ( $opts->getValue( 'filter' ) === 'outdated' ) {
+                       $language = '';
+               } else {
+                       $language = $opts->getValue( 'language' );
+               }
+
                if ( $language !== '' ) {
                        $languageFilter = new \Elastica\Filter\Term();
                        $languageFilter->setTerm( 'language', $language );
@@ -526,11 +555,21 @@
                        'post_tags' => array( $post ),
                ) );
 
-               try {
-                       return $this->getType()->getIndex()->search( $query );
-               } catch ( \Elastica\Exception\ExceptionInterface $e ) {
-                       throw new TTMServerException( $e->getMessage() );
-               }
+               do {
+                       try {
+                               $resultset = 
$this->getType()->getIndex()->search( $query );
+                       } catch ( \Elastica\Exception\ExceptionInterface $e ) {
+                               throw new TTMServerException( $e->getMessage() 
);
+                       }
+                       $query->setFrom( 0 );
+                       $size = $query->getParam( 'size' );
+                       $query->setSize( $resultset->getTotalHits() );
+
+               } while ( $opts->getValue('filter') === 'outdated'
+                       && $resultset->getTotalHits() > $size
+               );
+
+               return $resultset;
        }
 
        public function getFacets( $resultset ) {

-- 
To view, visit https://gerrit.wikimedia.org/r/225005
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic0326d688f799a91d308ebd1d78facccb2a4e61a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Translate
Gerrit-Branch: master
Gerrit-Owner: Phoenix303 <divyalife...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to