Physikerwelt has uploaded a new change for review.
https://gerrit.wikimedia.org/r/110704
Change subject: Prepare for DB2 integration
......................................................................
Prepare for DB2 integration
* new concept of MathEngine in backend
* seperate frontend and backend to prepeare for performance benchmark
Change-Id: I4f967a91fd409fea7d55a4a0fa3912aac958c222
---
A MathEngineMws.php
M MathObject.php
M MathQueryObject.php
M MathSearch.php
M SpecialMathSearch.php
5 files changed, 237 insertions(+), 114 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MathSearch
refs/changes/04/110704/1
diff --git a/MathEngineMws.php b/MathEngineMws.php
new file mode 100644
index 0000000..d6ed303
--- /dev/null
+++ b/MathEngineMws.php
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * MediaWiki MathSearch extension
+ *
+ * (c) 2014 Moritz Schubotz
+ * GPLv2 license; info in main package.
+ *
+ * @file
+ * @ingroup extensions
+ */
+class MathEngineMws {
+ /** @var MathQueryObject the query to be answered*/
+ protected $query;
+ protected $size = false;
+ protected $resultSet;
+ protected $relevanceMap;
+ /**
+ *
+ * @return MathQueryObject
+ */
+ public function getQuery() {
+ return $this->query;
+ }
+ function __construct(MathQueryObject $query) {
+ $this->query = $query;
+ }
+ public function getSize() {
+ return $this->size;
+ }
+
+ public function getResultSet() {
+ return $this->resultSet;
+ }
+
+ public function getRelevanceMap() {
+ return $this->relevanceMap;
+ }
+
+ /**
+ *
+ * @param MathQueryObject $query
+ * @return \MathSearchEngine
+ */
+ public function setQuery(MathQueryObject $query) {
+ $this->query = $query;
+ return $this;
+ }
+
+ /**
+ * Posts the query to mwsd and evaluates the result data
+ * @return boolean
+ */
+ function postQuery() {
+ global $wgMWSUrl, $wgMathDebug;
+
+ $numProcess = 30000;
+ $tmp = str_replace( "answsize=\"30\"",
"answsize=\"$numProcess\" totalreq=\"yes\"", $this->getQuery()->getCQuery() );
+ $mwsExpr = str_replace( "m:", "", $tmp );
+ wfDebugLog( 'mathsearch', 'MWS query:' . $mwsExpr );
+ $res = Http::post( $wgMWSUrl, array( "postData" => $mwsExpr,
"timeout" => 60 ) );
+ if ( $res == false ) {
+ if ( function_exists( 'curl_init' ) ) {
+ $handle = curl_init();
+ $options = array(
+ CURLOPT_URL => $wgMWSUrl,
+ CURLOPT_CUSTOMREQUEST => 'POST', // GET
POST PUT PATCH DELETE HEAD OPTIONS
+ );
+ // TODO: Figure out how not to write the error
in a message and not in top of the output page
+ curl_setopt_array( $handle, $options );
+ $details = curl_exec( $handle );
+ } else {
+ $details = "curl is not installed.";
+ }
+ wfDebugLog( "MathSearch", "Nothing retreived from
$wgMWSUrl. Check if mwsd is running. Error:" .
+ var_export( $details, true ) );
+ return false;
+ }
+ $xres = new SimpleXMLElement( $res );
+ $this->size = (int) $xres["total"];
+ wfDebugLog( "MathSearch", $this->size . " results retreived
from $wgMWSUrl." );
+ if ($this->size == 0) {
+ return true;
+ }
+ $this->relevanceMap = array();
+ $this->resultSet = array();
+ $this->processMathResults( $xres );
+ if ( $this->size >= $numProcess ) {
+ ini_set( 'memory_limit', '256M' );
+ for ( $i = $numProcess; $i <= $this->size; $i +=
$numProcess ) {
+ $query = str_replace( "limitmin=\"0\" ",
"limitmin=\"$i\" ", $mwsExpr );
+ $res = Http::post( $wgMWSUrl, array( "postData"
=> $query, "timeout" => 60 ) );
+ wfDebugLog( 'mathsearch', 'MWS query:' . $query
);
+ if ( $res == false ) {
+ wfDebugLog( "MathSearch", "Nothing
retreived from $wgMWSUrl. check if mwsd is running there" );
+ return false;
+ }
+ $xres = new SimpleXMLElement( $res );
+ $this->processMathResults( $xres );
+ }
+ }
+ return true;
+ }
+ /**
+ * @param unknown $xmlRoot
+ */
+ function processMathResults( $xmlRoot ) {
+ foreach ( $xmlRoot->children( "mws", TRUE ) as $page ) {
+ $attrs = $page->attributes();
+ $uri = explode( "#", $attrs["uri"] );
+ $pageID = $uri[0];
+ $AnchorID = substr( $uri[1], 4 );
+ $this->relevanceMap[$pageID] = true;
+ $substarr = array();
+ // $this->mathResults[(string) $pageID][(string)
$AnchorID][]=$page->asXML();
+ foreach ( $page->children( "mws", TRUE ) as $substpair
) {
+ $substattrs = $substpair->attributes();
+ $substarr[] = array( "qvar" => (string)
$substattrs["qvar"], "xpath" => (string) $substattrs["xpath"] );
+ }
+ $this->resultSet[(string) $pageID][(string)
$AnchorID][] = array( "xpath" => (string) $attrs["xpath"], "mappings" =>
$substarr ); // ,"original"=>$page->asXML()
+ }
+ }
+}
diff --git a/MathObject.php b/MathObject.php
index a4bcc09..a078c74 100644
--- a/MathObject.php
+++ b/MathObject.php
@@ -146,6 +146,12 @@
}
}
+ /**
+ *
+ * @param int $pid
+ * @param int $eid
+ * @return self instance
+ */
public static function constructformpage( $pid, $eid ) {
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->selectRow(
diff --git a/MathQueryObject.php b/MathQueryObject.php
index 40deeac..59c8d8a 100644
--- a/MathQueryObject.php
+++ b/MathQueryObject.php
@@ -167,9 +167,24 @@
return $out;
}
+ public function getLaTeXMLCMMLSettings(){
+ global $wgMathDefaultLaTeXMLSetting;
+ $cSettings = $wgMathDefaultLaTeXMLSetting;
+ $cSettings['preload'][] = 'mws.sty';
+ $cSettings['stylesheet'] = 'MWSquery.xsl';
+ return $cSettings;
+ }
+
+ public function getLaTeXMLPMLSettings(){
+ global $wgMathDefaultLaTeXMLSetting;
+ $cSettings = array_diff($wgMathDefaultLaTeXMLSetting,
array('cmml'));
+ $cSettings['preload'][] = 'mws.sty';
+ $cSettings['stylesheet'] = 'MWSquery.xsl';
+ return $cSettings;
+ }
public function generateContentQueryString(){
$renderer = new MathLaTeXML($this->getTexQuery());
- $renderer->setLaTeXMLSettings('profile=mwsquery');
+ $renderer->setLaTeXMLSettings($this->getLaTeXMLCMMLSettings());
$renderer->setAllowedRootElments(array('query'));
$renderer->render(true);
$this->cquery = $renderer->getMathml();
@@ -221,5 +236,63 @@
$xQueryGenertor = $this->setXQueryGenerator();
return $xQueryGenertor->getXQuery();
}
-
+
+ /**
+ * Posts the query to mwsd and evaluates the result data
+ * @return boolean
+ */
+ function postQuery() {
+ global $wgMWSUrl, $wgMathDebug;
+
+ $numProcess = 30000;
+ $tmp = str_replace( "answsize=\"30\"",
"answsize=\"$numProcess\" totalreq=\"yes\"", $this->getCQuery() );
+ $mwsExpr = str_replace( "m:", "", $tmp );
+ wfDebugLog( 'mathsearch', 'MWS query:' . $mwsExpr );
+ $res = Http::post( $wgMWSUrl, array( "postData" => $mwsExpr,
"timeout" => 60 ) );
+ if ( $res == false ) {
+ if ( function_exists( 'curl_init' ) ) {
+ $handle = curl_init();
+ $options = array(
+ CURLOPT_URL => $wgMWSUrl,
+ CURLOPT_CUSTOMREQUEST => 'POST', // GET
POST PUT PATCH DELETE HEAD OPTIONS
+ );
+ // TODO: Figure out how not to write the error
in a message and not in top of the output page
+ curl_setopt_array( $handle, $options );
+ $details = curl_exec( $handle );
+ } else {
+ $details = "curl is not installed.";
+ }
+ wfDebugLog( "MathSearch", "Nothing retreived from
$wgMWSUrl. Check if mwsd is running. Error:" .
+ var_export( $details, true ) );
+ return false;
+ }
+ $xres = new SimpleXMLElement( $res );
+ if ( $wgMathDebug ) {
+ $out = $this->getOutput();
+ $out->addWikiText( '<source lang="xml">' . $res .
'</source>' );
+ }
+ $this->numMathResults = (int) $xres["total"];
+ wfDebugLog( "MathSearch", $this->numMathResults . " results
retreived from $wgMWSUrl." );
+ if ( $this->numMathResults == 0 )
+ return true;
+ $this->relevantMathMap = array();
+ $this->mathResults = array();
+ $this->processMathResults( $xres );
+ if ( $this->numMathResults >= $numProcess ) {
+ ini_set( 'memory_limit', '256M' );
+ for ( $i = $numProcess; $i <= $this->numMathResults; $i
+= $numProcess ) {
+ $query = str_replace( "limitmin=\"0\" ",
"limitmin=\"$i\" ", $mwsExpr );
+ $res = Http::post( $wgMWSUrl, array( "postData"
=> $query, "timeout" => 60 ) );
+ wfDebugLog( 'mathsearch', 'MWS query:' . $query
);
+ if ( $res == false ) {
+ wfDebugLog( "MathSearch", "Nothing
retreived from $wgMWSUrl. check if mwsd is running there" );
+ return false;
+ }
+ $xres = new SimpleXMLElement( $res );
+ $this->processMathResults( $xres );
+ }
+ }
+ return true;
+ }
+
}
diff --git a/MathSearch.php b/MathSearch.php
index 854adb6..4afc702 100644
--- a/MathSearch.php
+++ b/MathSearch.php
@@ -42,7 +42,7 @@
$wgAutoloadClasses['GetEquationsByQuery'] = $dir . 'GetEquationsByQuery.php';
$wgAutoloadClasses['SpecialMathDebug'] = $dir . 'SpecialMathDebug.php';
$wgAutoloadClasses['SpecialMathIndex'] = $dir . 'SpecialMathIndex.php';
-
+$wgAutoloadClasses['MathEngineMws'] = $dir . 'MathEngineMws.php';
$wgExtensionMessagesFiles['MathSearch'] = $dir . 'MathSearch.i18n.php';
$wgExtensionMessagesFiles['MathSearchAlias'] = $dir . 'MathSearch.alias.php';
diff --git a/SpecialMathSearch.php b/SpecialMathSearch.php
index a6ca61a..9151e23 100644
--- a/SpecialMathSearch.php
+++ b/SpecialMathSearch.php
@@ -15,8 +15,6 @@
var $qs;
var $math_result;
var $mathSearchExpr;
- var $relevantMathMap;
- var $numMathResults;
var $numTextResults;
var $mathResults;
var $mathpattern;
@@ -116,45 +114,45 @@
function DisplayMath( $pageID ) {
global $wgMathDebug;
$out = $this->getOutput();
- $page = $this->mathResults[(string) $pageID];
+ $resultes = $this->mathBackend->getResultSet();
+ $page = $resultes[(string) $pageID];
$dbr = wfGetDB( DB_SLAVE );
$article = Article::newFromId( $pageID );
$pagename = (string) $article->getTitle();
wfDebugLog( "MathSearch", "Processing results for $pagename" );
foreach ( $page as $anchorID => $answ ) {
- $res = $dbr->selectRow(
- array( 'mathindex', 'math' ), array(
'math_mathml', 'mathindex_page_id', 'mathindex_anchor',
- 'mathindex_inputhash', 'math_inputhash' ),
'mathindex_page_id = "' . $pageID
- . '" AND mathindex_anchor= "' .
$anchorID
- . '" AND mathindex_inputhash =
math_inputhash'
- );
- if ( $res ) {
- $mml = utf8_decode( $res->math_mathml );
+ $res = MathObject::constructformpage($pageID,
$anchorID);
+ $mml = $res->getMathml();
+ if ( $mml ) {
$out->addWikiText(
"====[[$pagename#math$anchorID|Eq: $anchorID (Result " . $this->resultID++ .
")]]====", false );
//
$out->addHtml(MathLaTeXML::embedMathML($mml));
$out->addHtml( "<br />" );
$xpath = $answ[0]['xpath'];
- $xmml = new SimpleXMLElement( $res->math_mathml
);
// TODO: Remove hack and report to Prode that
he fixes that
// $xmml->registerXPathNamespace('m',
'http://www.w3.org/1998/Math/MathML');
$xpath = str_replace(
'/m:semantics/m:annotation-xml[@encoding="MathML-Content"]', '', $xpath );
- if ( !$wgMathDebug ) {
- $out->addWikiText( "xPATH:" . $xpath );
- $out->addWikiText( 'MATHML:<source
lang="xml">' . $xmml->asXML() . '</source>' );
+ $dom = new DOMDocument;
+ $dom->loadXML( $mml );
+ $DOMx = new DOMXpath($dom);
+ $hits = $DOMx->query($xpath);
+ if ( $wgMathDebug ) {
+ wfDebugLog('MathSearch', "xPATH:" .
$xpath);
}
- $hit = $xmml->xpath( $xpath );
- while ( list( , $node ) = each( $hit ) ) {
- //
$out->addHtml(var_export($node["xref"][0],true));
- $dom = new DOMDocument;
- $dom->loadXML( $mml );
- $domRes = $dom->getElementById(
$node["xref"][0] );
- if ( $domRes ) {
- $domRes->setAttribute(
'mathcolor', '#cc0000' );
- $out->addHtml(
$domRes->ownerDocument->saveXML() );
- } else {
- $renderer = new MathMathML();
- $renderer->setMathml( $mml );
- $out->addHtml(
$renderer->getHtmlOutput() );
+ //$hit = $xmml->xpath( $xpath );
+ if (!is_null($hits)) {
+ foreach ($hits as $node) {
+ /* @var $node */
+
//$node->item($index)->attributes->getNamedItem($name)->nodeValue
+ //
$out->addHtml(var_export($node["xref"][0],true));
+ $domRes = $dom->getElementById(
$node->attributes->getNamedItem('xref')->nodeValue );
+ if ( $domRes ) {
+ $domRes->setAttribute(
'mathcolor', '#cc0000' );
+ $out->addHtml(
$domRes->ownerDocument->saveXML() );
+ } else {
+ $renderer = new
MathMathML();
+ $renderer->setMathml(
$mml );
+ $out->addHtml(
$renderer->getHtmlOutput() );
+ }
}
}
@@ -209,8 +207,9 @@
$this->printSource(
$query->getCQuery() );
}
}
- if ( $this->postQuery() ) {
- $out->addWikiText( "Your mathquery was
sucessfully submitted and " . $this->numMathResults . " hits were obtained." );
+ $this->mathBackend = new MathEngineMws($query);
+ if ( $this->mathBackend->postQuery() ) {
+ $out->addWikiText( "Your mathquery was
sucessfully submitted and " . $this->mathBackend->getSize() . " hits were
obtained." );
} else {
$out->addWikiText( "Failed to post
query." );
}
@@ -228,8 +227,9 @@
if ( $this->textpattern == "" ) {
$mathout = "";
- if ( $this->mathResults ) {
- foreach ( $this->mathResults as $pageID =>
$page ) {
+ $results = $this->mathBackend->getResultSet();
+ if ( $results ) {
+ foreach ( $results as $pageID => $page ) {
$article = Article::newFromId( $pageID
);
if ( $article ) {
$pagename = (string)
$article->getTitle();
@@ -310,83 +310,4 @@
return true;
}
}
-
- /**
- * Posts the query to mwsd and evaluates the result data
- * @return boolean
- */
- function postQuery() {
- global $wgMWSUrl, $wgMathDebug;
-
- $numProcess = 30000;
- $tmp = str_replace( "answsize=\"30\"",
"answsize=\"$numProcess\" totalreq=\"yes\"", $this->mathmlquery );
- $mwsExpr = str_replace( "m:", "", $tmp );
- wfDebugLog( 'mathsearch', 'MWS query:' . $mwsExpr );
- $res = Http::post( $wgMWSUrl, array( "postData" => $mwsExpr,
"timeout" => 60 ) );
- if ( $res == false ) {
- if ( function_exists( 'curl_init' ) ) {
- $handle = curl_init();
- $options = array(
- CURLOPT_URL => $wgMWSUrl,
- CURLOPT_CUSTOMREQUEST => 'POST', // GET
POST PUT PATCH DELETE HEAD OPTIONS
- );
- // TODO: Figure out how not to write the error
in a message and not in top of the output page
- curl_setopt_array( $handle, $options );
- $details = curl_exec( $handle );
- } else {
- $details = "curl is not installed.";
- }
- wfDebugLog( "MathSearch", "Nothing retreived from
$wgMWSUrl. Check if mwsd is running. Error:" .
- var_export( $details, true ) );
- return false;
- }
- $xres = new SimpleXMLElement( $res );
- if ( $wgMathDebug ) {
- $out = $this->getOutput();
- $out->addWikiText( '<source lang="xml">' . $res .
'</source>' );
- }
- $this->numMathResults = (int) $xres["total"];
- wfDebugLog( "MathSearch", $this->numMathResults . " results
retreived from $wgMWSUrl." );
- if ( $this->numMathResults == 0 )
- return true;
- $this->relevantMathMap = array();
- $this->mathResults = array();
- $this->processMathResults( $xres );
- if ( $this->numMathResults >= $numProcess ) {
- ini_set( 'memory_limit', '256M' );
- for ( $i = $numProcess; $i <= $this->numMathResults; $i
+= $numProcess ) {
- $query = str_replace( "limitmin=\"0\" ",
"limitmin=\"$i\" ", $mwsExpr );
- $res = Http::post( $wgMWSUrl, array( "postData"
=> $query, "timeout" => 60 ) );
- wfDebugLog( 'mathsearch', 'MWS query:' . $query
);
- if ( $res == false ) {
- wfDebugLog( "MathSearch", "Nothing
retreived from $wgMWSUrl. check if mwsd is running there" );
- return false;
- }
- $xres = new SimpleXMLElement( $res );
- $this->processMathResults( $xres );
- }
- }
- return true;
- }
-
- /**
- * @param unknown $xmlRoot
- */
- function processMathResults( $xmlRoot ) {
- foreach ( $xmlRoot->children( "mws", TRUE ) as $page ) {
- $attrs = $page->attributes();
- $uri = explode( "#", $attrs["uri"] );
- $pageID = $uri[0];
- $AnchorID = substr( $uri[1], 4 );
- $this->relevantMathMap[$pageID] = true;
- $substarr = array();
- // $this->mathResults[(string) $pageID][(string)
$AnchorID][]=$page->asXML();
- foreach ( $page->children( "mws", TRUE ) as $substpair
) {
- $substattrs = $substpair->attributes();
- $substarr[] = array( "qvar" => (string)
$substattrs["qvar"], "xpath" => (string) $substattrs["xpath"] );
- }
- $this->mathResults[(string) $pageID][(string)
$AnchorID][] = array( "xpath" => (string) $attrs["xpath"], "mappings" =>
$substarr ); // ,"original"=>$page->asXML()
- }
- }
-
}
--
To view, visit https://gerrit.wikimedia.org/r/110704
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I4f967a91fd409fea7d55a4a0fa3912aac958c222
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MathSearch
Gerrit-Branch: master
Gerrit-Owner: Physikerwelt <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits