Divec has uploaded a new change for review.

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

Change subject: WIP: MT service processes each segment separately
......................................................................

WIP: MT service processes each segment separately

Change CXMTInterface so that each segment is sent for translation on its
own. This means that the translation can be returned as soon as it is
available. Previously, all translations were completed then returned at
once, which would create an unacceptable delay if the MT server is not
very fast.

TODO: Javadoc for deferred results
TODO: Test further

Change-Id: I00b121d8667bffbbfe12092646783231d851330a
---
M server/models/DataModelManager.js
M server/mt/CXMTInterface.js
M server/mt/providers/Rot13.js
3 files changed, 45 insertions(+), 22 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/ContentTranslation 
refs/changes/19/119719/1

diff --git a/server/models/DataModelManager.js 
b/server/models/DataModelManager.js
index 7e0fb14..a96b50a 100644
--- a/server/models/DataModelManager.js
+++ b/server/models/DataModelManager.js
@@ -27,6 +27,7 @@
 CXDataModelManager.prototype.init = function () {
        var dataModelManager = this,
                segmenter,
+               segmentId,
                mtInterface,
                PageLoader, pageloader;
 
@@ -57,10 +58,16 @@
                                // TODO: Dispatch the context to a number of 
task runners
                                // Once each task runners finish, publish.
                                mtInterface = new CXMTInterface( 
dataModelManager.context );
-                               mtInterface.translate( 
dataModelManager.dataModel.segments ).then( function ( translations ) {
-                                       dataModelManager.dataModel.mt = 
translations;
-                                       dataModelManager.publish();
-                               } );
+                               dataModelManager.dataModel.mt = {};
+                               for ( segmentId in segments ) {
+                                       mtInterface.translate(
+                                               segmentId,
+                                               segments[segmentId]
+                                       ).then( function ( segmentId, 
translation ) {
+                                               
dataModelManager.dataModel.mt[segmentId] = translation;
+                                               dataModelManager.publish();
+                                       } );
+                               }
                        }, function () {
                                console.error( '[CX] Error in retrieving the 
page ' +
                                        dataModelManager.context.sourcePage );
diff --git a/server/mt/CXMTInterface.js b/server/mt/CXMTInterface.js
index e41bf26..1e39c8f 100644
--- a/server/mt/CXMTInterface.js
+++ b/server/mt/CXMTInterface.js
@@ -13,8 +13,8 @@
        this.context = context;
 }
 
-CXMTInterface.prototype.translate = function ( segments ) {
-       return ( new Rot13Service( this.context ) ).translate( segments );
+CXMTInterface.prototype.translate = function ( segmentId, segment ) {
+       return ( new Rot13Service( this.context ) ).translate( segmentId, 
segment );
 };
 
 module.exports.CXMTInterface = CXMTInterface;
diff --git a/server/mt/providers/Rot13.js b/server/mt/providers/Rot13.js
index e84998e..e93840e 100644
--- a/server/mt/providers/Rot13.js
+++ b/server/mt/providers/Rot13.js
@@ -11,6 +11,7 @@
 
 /**
  * @class Rot13Service
+ * @param config
  */
 function Rot13Service( config ) {
        this.config = config;
@@ -23,26 +24,41 @@
        } );
 }
 
-Rot13Service.prototype.translate = function ( segments ) {
-       var rot13 = this,
-               deferred = Q.defer(),
-               mt = {};
+/**
+ * Get number of milliseconds for simulated delay on segment translation
+ *
+ * @method
+ * @returns {number} The delay in ms
+ */
+Rot13Service.prototype.getDelay = function () {
+       return 100;
+};
 
-       // Simulate a 1000 millisecond delay.
+/**
+ * Deferred: Translate a single segment
+ *
+ * @method
+ * @param {string} segmentId Unique ID of the segment
+ * @param {Object} segment Segment to translate
+ * TODO: how do we document return values?
+ * @returns {deferred} promise to provide (segmentId, translation)
+ */
+Rot13Service.prototype.translate = function ( segmentId, segment ) {
+       var rot13 = this,
+               deferred = Q.defer();
+
+       // Simulate a delay.
        setTimeout( function () {
                var translation,
                        segmentId;
-               for ( segmentId in segments ) {
-                       rot13.parser = new SAXParser();
-                       rot13.prepareParser();
-                       // Wrap the source with <p> to make it valid dom 
fragment
-                       rot13.parser.write( '<p>' + segments[ segmentId 
].source + '</p>' );
-                       translation = rot13.parser.parsedText;
-                       translation = translation.substr( 3, translation.length 
- 7 );
-                       mt[ segmentId ] = translation;
-               }
-               deferred.resolve( mt );
-       }, 1000 );
+               rot13.parser = new SAXParser();
+               rot13.prepareParser();
+               // Wrap the source with <p> to make it valid dom fragment
+               rot13.parser.write( '<p>' + segment.source + '</p>' );
+               translation = rot13.parser.parsedText;
+               translation = translation.substr( 3, translation.length - 7 );
+               Q.defer().resolve( segmentId, translation );
+       }, this.getDelay() );
 
        return deferred.promise;
 };

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I00b121d8667bffbbfe12092646783231d851330a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/ContentTranslation
Gerrit-Branch: master
Gerrit-Owner: Divec <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to