r16673 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r16672‎ | r16673 | r16674 >
Date:16:16, 27 September 2006
Author:karstenuil
Status:old
Tags:
Comment:
1) added special Datasearch for the Search form.
-Change MonoBook.php lines 148 and 149 to:
<form action="<?php global $wgScriptPath; echo "$wgScriptPath/index.php/Special:Datasearch";?>" id="searchform"><div>
<input id="searchInput" name="search-text" type="text"
-Add to LocalSettings.php:
require_once("extensions/Wikidata/WiktionaryZ/SpecialDatasearch.php");

2) replace "_" in umls terms to " " during import
3) add relations to swiss prot entries with dbReference id="GO" to corresponding GO terms
4) removed "referenced by" relations from import
5) add swiss prot organism specific gene's as synonyms of "HUGO" terms by the dbReference id="HGNC"
Modified paths:
  • /trunk/extensions/Wikidata/WP/DataImport.php (modified) (history)
  • /trunk/extensions/Wikidata/WP/SwissProtImport.php (modified) (history)
  • /trunk/extensions/Wikidata/WP/UMLSImport.php (modified) (history)
  • /trunk/extensions/Wikidata/WiktionaryZ/SpecialDatasearch.php (added) (history)

Diff [purge]

Index: trunk/extensions/Wikidata/WP/UMLSImport.php
@@ -162,7 +162,8 @@
163163
164164 while ($umlsTerm = mysql_fetch_object($queryResult)) {
165165 $definedMeaningId = getDefinedMeaningFromCollection($umlsCollectionId, $umlsTerm->cui);
166 - $expression = findOrCreateExpression(trim($umlsTerm->str), $isoLanguages[strtolower($umlsTerm->lat)]);
 166+ $string = str_replace('_', ' ', trim($umlsTerm->str));
 167+ $expression = findOrCreateExpression($string, $isoLanguages[strtolower($umlsTerm->lat)]);
167168
168169 if(!$definedMeaningId) {
169170 $definedMeaningId = addDefinedMeaning($expression->id);
Index: trunk/extensions/Wikidata/WP/DataImport.php
@@ -26,28 +26,30 @@
2727 //$nlmUserID = 1;
2828 //$sibUserID = 1;
2929
30 -$linkEC2GoFileName = "LinksEC2Go.txt";
31 -$linkSwissProtKeyWord2GoFileName = "LinksSP2Go.txt";
32 -$swissProtXMLFileName = "uniprot_sprot.xml";
33 -//$swissProtXMLFileName = "100000lines.xml";
 30+//$linkEC2GoFileName = "LinksEC2Go.txt";
 31+//$linkSwissProtKeyWord2GoFileName = "LinksSP2Go.txt";
 32+//$swissProtXMLFileName = "uniprot_sprot.xml";
 33+$swissProtXMLFileName = "100000lines.xml";
3434
3535 $wgUser->setID($nlmUserID);
3636 startNewTransaction($nlmUserID, 0, "UMLS Import");
3737 echo "Importing UMLS\n";
38 -$umlsImport = importUMLSFromDatabase("localhost", "umls", "root", "nicheGod");//, array("NCI", "GO"));
39 -//$umlsImport = importUMLSFromDatabase("localhost", "umls", "root", NULL, array("NCI", "GO", "SRC"));
 38+//$umlsImport = importUMLSFromDatabase("localhost", "umls", "root", "nicheGod");//, array("NCI", "GO"));
 39+$umlsImport = importUMLSFromDatabase("localhost", "umls", "root", "nicheGod", array("GO", "SRC", "NCI", "HUGO"));
 40+//$umlsImport = importUMLSFromDatabase("localhost", "umls", "root", NULL, array("GO", "SRC", "NCI", "HUGO"));
4041
41 -$EC2GoMapping = loadEC2GoMapping($linkEC2GoFileName);
42 -$SP2GoMapping = loadSwissProtKeyWord2GoMapping($linkSwissProtKeyWord2GoFileName);
 42+//$EC2GoMapping = loadEC2GoMapping($linkEC2GoFileName);
 43+//$SP2GoMapping = loadSwissProtKeyWord2GoMapping($linkSwissProtKeyWord2GoFileName);
4344
4445 $wgUser->setID($sibUserID);
4546 startNewTransaction($sibUserID, 0, "Swiss-Prot Import");
4647 echo "\nImporting Swiss-Prot\n";
4748 //$umlsImport = new UMLSImportResult;
4849 //$umlsImport->umlsCollectionId = 5;
49 -//$umlsImport->sourceAbbreviations['GO'] = 236810;
 50+//$umlsImport->sourceAbbreviations['GO'] = 30;
 51+//$umlsImport->sourceAbbreviations['HUGO'] = 69912;
5052
51 -importSwissProt($swissProtXMLFileName, $umlsImport->umlsCollectionId, $umlsImport->sourceAbbreviations['GO'], $EC2GoMapping, $SP2GoMapping);
 53+importSwissProt($swissProtXMLFileName, $umlsImport->umlsCollectionId, $umlsImport->sourceAbbreviations['GO'], $umlsImport->sourceAbbreviations['HUGO'], $EC2GoMapping, $SP2GoMapping);
5254 //importSwissProt($swissProtXMLFileName);
5355
5456 $endTime = time();
Index: trunk/extensions/Wikidata/WP/SwissProtImport.php
@@ -7,7 +7,7 @@
88 /*
99 * Import Swiss-Prot from the XML file. Be sure to have started a transaction first!
1010 */
11 -function importSwissProt($xmlFileName, $umlsCollectionId = 0, $goCollectionId = 0, $EC2GoMapping = array(), $keyword2GoMapping = array()) {
 11+function importSwissProt($xmlFileName, $umlsCollectionId = 0, $goCollectionId = 0, $hugoCollectionId = 0, $EC2GoMapping = array(), $keyword2GoMapping = array()) {
1212 // Create mappings from EC numbers and SwissProt keywords to GO term meaning id's:
1313 $EC2GoMeaningId = array();
1414 $keyword2GoMeaningId = array();
@@ -15,31 +15,35 @@
1616 if ($goCollectionId != 0) {
1717 $goCollection = getCollectionContents($goCollectionId);
1818
19 - foreach ($EC2GoMapping as $EC => $GO) {
20 - if (array_key_exists($GO, $goCollection)) {
21 - $goMeaningId = $goCollection[$GO];
22 - $EC2GoMeaningId[$EC] = $goMeaningId;
23 - }
24 - }
 19+// foreach ($EC2GoMapping as $EC => $GO) {
 20+// if (array_key_exists($GO, $goCollection)) {
 21+// $goMeaningId = $goCollection[$GO];
 22+// $EC2GoMeaningId[$EC] = $goMeaningId;
 23+// }
 24+// }
 25+//
 26+// foreach ($keyword2GoMapping as $keyword => $GO) {
 27+// if (array_key_exists($GO, $goCollection)) {
 28+// $goMeaningId = $goCollection[$GO];
 29+// $keyword2GoMeaningId[$keyword] = $goMeaningId;
 30+// }
 31+// }
 32+ }
2533
26 - foreach ($keyword2GoMapping as $keyword => $GO) {
27 - if (array_key_exists($GO, $goCollection)) {
28 - $goMeaningId = $goCollection[$GO];
29 - $keyword2GoMeaningId[$keyword] = $goMeaningId;
30 - }
31 - }
 34+ if($hugoCollectionId != 0) {
 35+ $hugoCollection = getCollectionContents($hugoCollectionId);
3236 }
3337
3438 // SwissProt import:
3539 $numberOfBytes = filesize($xmlFileName);
3640 initializeProgressBar($numberOfBytes, 5000000);
3741 $fileHandle = fopen($xmlFileName, "r");
38 - importEntriesFromXMLFile($fileHandle, $umlsCollectionId, $EC2GoMeaningId, $keyword2GoMeaningId);
 42+ importEntriesFromXMLFile($fileHandle, $umlsCollectionId, $goCollection, $hugoCollection, $EC2GoMeaningId, $keyword2GoMeaningId);
3943
4044 fclose($fileHandle);
4145 }
4246
43 -function importEntriesFromXMLFile($fileHandle, $umlsCollectionId, $EC2GoMeaningIdMapping, $keyword2GoMeaningIdMapping) {
 47+function importEntriesFromXMLFile($fileHandle, $umlsCollectionId, $goCollection, $hugoCollection, $EC2GoMeaningIdMapping, $keyword2GoMeaningIdMapping) {
4448 $languageId = 85;
4549 $collectionId = bootstrapCollection("Swiss-Prot", $languageId, "");
4650 $classCollectionId = bootstrapCollection("Swiss-Prot classes", $languageId, "CLAS");
@@ -56,6 +60,8 @@
5761 $xmlParser->ECCollectionId = $ECCollectionId;
5862 $xmlParser->EC2GoMeaningIdMapping = $EC2GoMeaningIdMapping;
5963 $xmlParser->keyword2GoMeaningIdMapping = $keyword2GoMeaningIdMapping;
 64+ $xmlParser->goCollection = $goCollection;
 65+ $xmlParser->hugoCollection = $hugoCollection;
6066
6167 // Find some UMLS concepts for cross references from SwissProt:
6268 if ($umlsCollectionId != 0) {
@@ -65,6 +71,12 @@
6672 $xmlParser->proteinFragmentConceptId = getCollectionMemberId($umlsCollectionId, "C1335533");
6773 }
6874
 75+ if ($goCollection) {
 76+ $xmlParser->molecularFunctionConceptId = $goCollection["GO:0003674"];
 77+ $xmlParser->biologicalProcessConceptId = $goCollection["GO:0008150"];
 78+ $xmlParser->cellularComponentConceptId = $goCollection["GO:0005575"];
 79+ }
 80+
6981 $xmlParser->initialize();
7082
7183 parseXML($fileHandle, $xmlParser);
@@ -79,6 +91,8 @@
8092 public $ECCollectionId;
8193 public $EC2GoMeaningIdMapping;
8294 public $keyword2GoMeaningIdMapping;
 95+ public $goCollection;
 96+ public $hugoCollection;
8397 public $numberOfEntries = 0;
8498
8599 public $proteins = array();
@@ -100,6 +114,9 @@
101115 public $functionalDomainConceptId = 0;
102116 public $proteinComponentConceptId = 0;
103117 public $referencedByConceptId = 0;
 118+ public $biologicalProcessConceptId = 0;
 119+ public $molecularFunctionConceptId = 0;
 120+ public $cellularComponentConceptId = 0;
104121 public $keywordConceptId = 0;
105122 public $includesConceptId = 0;
106123 public $includedInConceptId = 0;
@@ -144,6 +161,15 @@
145162 if ($this->referencedByConceptId == 0)
146163 $this->referencedByConceptId = $this->bootstrapDefinedMeaning("referenced by", "referenced by");
147164
 165+ if ($this->biologicalProcessConceptId == 0)
 166+ $this->biologicalProcessConceptId = $this->bootstrapDefinedMeaning("biological process", "biological process");
 167+
 168+ if ($this->molecularFunctionConceptId == 0)
 169+ $this->molecularFunctionConceptId = $this->bootstrapDefinedMeaning("molecular function", "molecular function");
 170+
 171+ if ($this->cellularComponentConceptId == 0)
 172+ $this->cellularComponentConceptId = $this->bootstrapDefinedMeaning("cellular component", "cellular component");
 173+
148174 if ($this->keywordConceptId == 0)
149175 $this->keywordConceptId = $this->bootstrapDefinedMeaning("keyword", "keyword");
150176
@@ -191,6 +217,9 @@
192218 addDefinedMeaningToCollectionIfNotPresent($this->organismSpecificGeneConceptId, $this->relationTypeCollectionId, "organism specific gene");
193219 addDefinedMeaningToCollectionIfNotPresent($this->organismConceptId, $this->relationTypeCollectionId, "organism");
194220 addDefinedMeaningToCollectionIfNotPresent($this->activityConceptId, $this->relationTypeCollectionId, "activity");
 221+ addDefinedMeaningToCollectionIfNotPresent($this->biologicalProcessConceptId, $this->relationTypeCollectionId, "biological process");
 222+ addDefinedMeaningToCollectionIfNotPresent($this->molecularFunctionConceptId, $this->relationTypeCollectionId, "molecular function");
 223+ addDefinedMeaningToCollectionIfNotPresent($this->cellularComponentConceptId, $this->relationTypeCollectionId, "cellular component");
195224 addDefinedMeaningToCollectionIfNotPresent($this->keywordConceptId, $this->relationTypeCollectionId, "keyword");
196225 addDefinedMeaningToCollectionIfNotPresent($this->includesConceptId, $this->relationTypeCollectionId, "includes");
197226 addDefinedMeaningToCollectionIfNotPresent($this->includedInConceptId, $this->relationTypeCollectionId, "included in");
@@ -226,7 +255,7 @@
227256
228257 if ($entry->gene != "") {
229258 $geneMeaningId = $this->addGene($entry->gene);
230 - $organismSpecificGene = $this->addOrgansimSpecificGene($organismSpeciesMeaningId, $geneMeaningId, $entry->organism, $entry->gene, $entry->geneSynonyms);
 259+ $organismSpecificGene = $this->addOrgansimSpecificGene($organismSpeciesMeaningId, $geneMeaningId, $entry->organism, $entry->gene, $entry->geneSynonyms, $entry->HGNCReference);
231260 }
232261 else
233262 $organismSpecificGene = -1;
@@ -318,32 +347,36 @@
319348 return $definedMeaningId;
320349 }
321350
322 - public function addOrgansimSpecificGene($organismSpeciesMeaningId, $geneMeaningId, $organismName, $geneName, $synonyms) {
 351+ public function addOrgansimSpecificGene($organismSpeciesMeaningId, $geneMeaningId, $organismName, $geneName, $synonyms, $hgncReference) {
323352 $key = $geneMeaningId . "-" . $organismSpeciesMeaningId;
324353 $description = $geneName . " in " . $organismName;
325354 if (array_key_exists($key, $this->organismSpecificGenes)) {
326355 $definedMeaningId = $this->organismSpecificGenes[$key];
327356 }
328357 else {
329 - $definedMeaningId = $this->addExpressionAsDefinedMeaning($description, $description, $geneName, $this->collectionId);
 358+ if(!($this->hugoCollection && ($hgncReference != 0) && ($definedMeaningId = $this->hugoCollection[$hgncReference]))){
 359+ $definedMeaningId = $this->addExpressionAsDefinedMeaning($description, $description, $geneName, $this->collectionId);
 360+ }
330361 addSynonymOrTranslation($geneName, $this->languageId, $definedMeaningId, true);
331 - $this->organismSpecificGenes[$key] = $definedMeaningId;
332 - }
 362+ $this->organismSpecificGenes[$key] = $definedMeaningId;
 363+ }
333364
334365 addClassMembership($definedMeaningId, $this->organismSpecificGeneConceptId);
335366
336367 //add relation between specific gene and organism
337368 addRelation($definedMeaningId, $this->organismConceptId, $organismSpeciesMeaningId);
338 - addRelation($organismSpeciesMeaningId, $this->referencedByConceptId, $definedMeaningId);
 369+// addRelation($organismSpeciesMeaningId, $this->referencedByConceptId, $definedMeaningId);
339370
340371 //add relation between specific gene and gene
341372 addRelation($definedMeaningId, $this->geneConceptId, $geneMeaningId);
342 - addRelation($geneMeaningId, $this->referencedByConceptId, $definedMeaningId);
 373+// addRelation($geneMeaningId, $this->referencedByConceptId, $definedMeaningId);
343374
344375 foreach ($synonyms as $key => $synonym) {
345376 addSynonymOrTranslation($synonym, $this->languageId, $definedMeaningId, true);
346377 }
347378
 379+
 380+
348381 return $definedMeaningId;
349382 }
350383
@@ -370,18 +403,18 @@
371404
372405 // set the protein of the swiss prot entry and relate the protein to the entry:
373406 addRelation($definedMeaningId, $this->proteinConceptId, $proteinMeaningId);
374 - addRelation($proteinMeaningId, $this->referencedByConceptId, $definedMeaningId);
 407+// addRelation($proteinMeaningId, $this->referencedByConceptId, $definedMeaningId);
375408
376409 // set the gene of the swiss prot entry and relate the gene to the entry:
377410 if($organismSpecificGene >= 0) {
378411 //add realtion between entry and gene
379412 addRelation($definedMeaningId, $this->organismSpecificGeneConceptId, $organismSpecificGene);
380 - addRelation($organismSpecificGene, $this->referencedByConceptId, $definedMeaningId);
 413+// addRelation($organismSpecificGene, $this->referencedByConceptId, $definedMeaningId);
381414 }
382415
383416 // set the species of the swiss prot entry and relate the species to the entry:
384417 addRelation($definedMeaningId, $this->organismConceptId, $organismSpeciesMeaningId);
385 - addRelation($organismSpeciesMeaningId, $this->referencedByConceptId, $definedMeaningId);
 418+// addRelation($organismSpeciesMeaningId, $this->referencedByConceptId, $definedMeaningId);
386419
387420 // add the comment fields as text attributes:
388421 foreach ($entry->comments as $key => $comment) {
@@ -398,18 +431,40 @@
399432 if($entry->EC != ""){
400433 $ECNumberMeaningId = $this->getOrCreateECNumberMeaningId($entry->EC);
401434 addRelation($definedMeaningId, $this->activityConceptId, $ECNumberMeaningId);
402 - addRelation($ECNumberMeaningId, $this->referencedByConceptId, $definedMeaningId);
 435+// addRelation($ECNumberMeaningId, $this->referencedByConceptId, $definedMeaningId);
403436 }
404437
405438 // add keywords:
406 - foreach ($entry->keywords as $key => $keyword) {
407 - if (array_key_exists($keyword, $this->keyword2GoMeaningIdMapping)) {
408 - $goMeaningId = $this->keyword2GoMeaningIdMapping[$keyword];
409 - addRelation($definedMeaningId, $this->keywordConceptId, $goMeaningId);
410 - addRelation($goMeaningId, $this->referencedByConceptId, $definedMeaningId);
411 - }
 439+// foreach ($entry->keywords as $key => $keyword) {
 440+// if (array_key_exists($keyword, $this->keyword2GoMeaningIdMapping)) {
 441+// $goMeaningId = $this->keyword2GoMeaningIdMapping[$keyword];
 442+// addRelation($definedMeaningId, $this->keywordConceptId, $goMeaningId);
 443+// addRelation($goMeaningId, $this->referencedByConceptId, $definedMeaningId);
 444+// }
 445+// }
 446+
 447+ if($this->goCollection) {
 448+ foreach ($entry->GOReference as $key => $goReference) {
 449+ $relationConcept = 0;
 450+ switch($goReference->type) {
 451+ case("biological process"):
 452+ $relationConcept = $this->biologicalProcessConceptId;
 453+ break;
 454+ case("molecular function"):
 455+ $relationConcept = $this->molecularFunctionConceptId;
 456+ break;
 457+ case("cellular component"):
 458+ $relationConcept = $this->cellularComponentConceptId;
 459+ break;
 460+ }
 461+
 462+ if($relationConcept && ($goConcept = $this->goCollection[$goReference->goCode])) {
 463+ addRelation($definedMeaningId, $relationConcept, $goConcept);
 464+ }
 465+ }
412466 }
413467
 468+
414469 // Add 'included' functional domains:
415470 foreach ($entry->protein->domains as $key => $domain) {
416471 $domainMeaningId = $this->addFunctionalDomain($domain);
@@ -523,6 +578,9 @@
524579 case "COMMENT":
525580 $result = new CommentXMLElementHandler();
526581 break;
 582+ case "DBREFERENCE":
 583+ $result = new dbReferenceXMLElement();
 584+ break;
527585 default:
528586 $result = DefaultXMLElementHandler::getHandlerForNewElement($name);
529587 break;
@@ -550,6 +608,18 @@
551609 if ($childHandler->comment != "")
552610 $this->entry->comments[] = $childHandler->comment;
553611 }
 612+ elseif (is_a($childHandler, dbReferenceXMLElement)) {
 613+ if ($childHandler->type == "EC") {
 614+ $this->entry->EC = $childHandler->id;
 615+ }
 616+ if ($childHandler->type == "GO") {
 617+ $this->entry->GOReference[] = new GOReference($childHandler->id, $childHandler->property["term"]);
 618+ }
 619+ if ($childHandler->type == "HGNC") {
 620+ $position = strpos($childHandler->id, ":");
 621+ $this->entry->HGNCReference = substr($childHandler->id, $position + 1);
 622+ }
 623+ }
554624 elseif($childHandler->name == "ACCESSION") {
555625 if ($this->entry->accession == "") {
556626 $this->entry->accession = $childHandler->data;
@@ -561,9 +631,6 @@
562632 elseif($childHandler->name == "NAME") {
563633 $this->entry->name = $childHandler->data;
564634 }
565 - elseif($childHandler->name == "DBREFERENCE" && array_key_exists("TYPE", $childHandler->attributes) && $childHandler->attributes["TYPE"] == "EC"){
566 - $this->entry->EC = $childHandler->attributes["ID"];
567 - }
568635 elseif($childHandler->name == "KEYWORD") {
569636 $this->entry->keywords[] = $childHandler->attributes["ID"];
570637 }
@@ -728,6 +795,23 @@
729796 }
730797 }
731798
 799+class dbReferenceXMLElement extends DefaultXMLElementHandler {
 800+ public $type;
 801+ public $id;
 802+ public $property = array();
 803+
 804+ public function setAttributes($attributes) {
 805+ DefaultXMLElementHandler::setAttributes($attributes);
 806+
 807+ $this->type = $attributes["TYPE"];
 808+ $this->id = $attributes["ID"];
 809+ }
 810+
 811+ public function notify($childHandler) {
 812+ $this->property[$childHandler->attributes["TYPE"]] = $childHandler->attributes["VALUE"];
 813+ }
 814+}
 815+
732816 class SwissProtEntry {
733817 public $name = "";
734818 public $accession = "";
@@ -740,6 +824,8 @@
741825 public $organismTranslations = array();
742826 public $comments = array();
743827 public $keywords = array();
 828+ public $GOReference = array();
 829+ public $HGNCReference;
744830 }
745831
746832 class Comment {
@@ -756,5 +842,25 @@
757843 public $components = array();
758844 }
759845
 846+class GOReference {
 847+ public $type;
 848+ public $goCode;
 849+
 850+ public function __construct($goCode, $term) {
 851+ $this->goCode = $goCode;
 852+ $typeAbbreviation = substr($term, 0, 1);
 853+ switch($typeAbbreviation) {
 854+ case("P"):
 855+ $this->type = "biological process";
 856+ break;
 857+ case("F"):
 858+ $this->type = "molecular function";
 859+ break;
 860+ case("C"):
 861+ $this->type = "cellular component";
 862+ break;
 863+ }
 864+ }
 865+}
760866
761867 ?>
Index: trunk/extensions/Wikidata/WiktionaryZ/SpecialDatasearch.php
@@ -0,0 +1,49 @@
 2+<?php
 3+
 4+if (!defined('MEDIAWIKI')) die();
 5+
 6+$wgExtensionFunctions[] = 'wfSpecialDatasearch';
 7+
 8+function wfSpecialDatasearch() {
 9+ class SpecialDatasearch extends SpecialPage {
 10+ function SpecialDatasearch() {
 11+ SpecialPage::SpecialPage('Datasearch');
 12+ }
 13+
 14+ function execute( $par ) {
 15+ global
 16+ $wgOut, $wgTitle;
 17+
 18+ $spelling = ltrim($_GET['search-text']);
 19+
 20+ //possible to make a difference between Go and Search, now both have the same result
 21+ $go = $_GET['go'];
 22+ $fulltext = $_GET['fulltext'];
 23+
 24+ $wgOut->addHTML('<h1>Words matching <i>'. $spelling . '</i> and associated meanings</h1>');
 25+ $wgOut->addHTML('<p>Showing only a maximum of 100 matches.</p>');
 26+ $wgOut->addHTML($this->searchText($spelling));
 27+ }
 28+
 29+ function searchText($text) {
 30+ require_once("Search.php");
 31+
 32+ $dbr = &wfGetDB(DB_SLAVE);
 33+
 34+ $sql = "SELECT INSTR(LCASE(uw_expression_ns.spelling), LCASE(". $dbr->addQuotes("$text") .")) as position, uw_syntrans.defined_meaning_id AS defined_meaning_id, uw_expression_ns.spelling AS spelling, uw_expression_ns.language_id AS language_id ".
 35+ "FROM uw_expression_ns, uw_syntrans ".
 36+ "WHERE uw_expression_ns.expression_id=uw_syntrans.expression_id AND uw_syntrans.endemic_meaning=1 " .
 37+ " AND " . getLatestTransactionRestriction('uw_syntrans').
 38+ " AND spelling LIKE " . $dbr->addQuotes("%$text%") .
 39+ " ORDER BY position ASC, uw_expression_ns.spelling ASC limit 100";
 40+
 41+ $queryResult = $dbr->query($sql);
 42+ list($relation, $editor) = getDefinedMeaningAsRelation($queryResult);
 43+ return $editor->view(new IdStack("expression"), $relation);
 44+ }
 45+ }
 46+
 47+ SpecialPage::addPage(new SpecialDatasearch());
 48+}
 49+
 50+?>
\ No newline at end of file

Status & tagging log