r17319 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r17318‎ | r17319 | r17320 >
Date:12:19, 31 October 2006
Author:proes
Status:old
Tags:
Comment:
First step in improving performance: defined meaning reference links are resolved in bulk now
Modified paths:
  • /trunk/extensions/Wikidata/WiktionaryZ/WiktionaryZRecordSets.php (modified) (history)

Diff [purge]

Index: trunk/extensions/Wikidata/WiktionaryZ/WiktionaryZRecordSets.php
@@ -58,23 +58,215 @@
5959 for ($i = 0; $i < $recordSet->getRecordCount(); $i++) {
6060 $record = $recordSet->getRecord($i);
6161
62 - foreach($idAttributes as $idAttribute) {
63 - $id = $record->getAttributeValue($idAttribute);
64 -
65 - if (!in_array($id, $ids))
66 - $ids[] = $id;
67 - }
 62+ foreach($idAttributes as $idAttribute)
 63+ $ids[] = $record->getAttributeValue($idAttribute);
6864 }
6965
70 - return $ids;
 66+ return array_unique($ids);
7167 }
7268
 69+// $sql =
 70+// "SELECT " .
 71+// " uw_defined_meaning.defined_meaning_id, " .
 72+// " COALESCE(defining_expression.spelling, user_expression.spelling, english_expression.spelling, any_expression.spelling) AS label, " .
 73+// " defining_expression.spelling AS defining_spelling," .
 74+// " user_expression.spelling AS user_spelling," .
 75+// " english_expression.spelling AS english_spelling, " .
 76+// " any_expression.spelling AS any_spelling " .
 77+// " FROM uw_defined_meaning " .
 78+// getDefiningJoinSQLForLanguage('defining', $userLanguage) .
 79+// getSynonymJoinSQLForLanguage('user', $userLanguage) .
 80+// getSynonymJoinSQLForLanguage('english', 85) .
 81+// getSynonymJoinSQLForAnyLanguage('any') .
 82+// " WHERE uw_defined_meaning.defined_meaning_id IN (" . implode(", ", $definedMeaningIds) . ")" .
 83+// " AND " . getLatestTransactionRestriction('uw_defined_meaning') .
 84+// " GROUP BY defined_meaning_id";
 85+//
 86+// echo $sql . "\n\n";
 87+// $dbr =& wfGetDB(DB_SLAVE);
 88+// $dbr->query(
 89+// $sql
 90+// );
 91+
 92+//function getSynonymJoinSQLForLanguage($alias, $languageId) {
 93+// return
 94+// " JOIN (uw_syntrans AS ". $alias . "_syntrans, uw_expression_ns AS ". $alias . "_expression) ON " .
 95+// " (uw_defined_meaning.defined_meaning_id=". $alias . "_syntrans.defined_meaning_id AND ". $alias . "_syntrans.identical_meaning=1 AND " . getLatestTransactionRestriction($alias . '_syntrans') .
 96+// " AND ". $alias . "_expression.expression_id=". $alias . "_syntrans.expression_id AND ". $alias . "_expression.language_id=" . $languageId . " AND " . getLatestTransactionRestriction($alias . '_expression') . ")";
 97+//}
 98+//
 99+//function getSynonymJoinSQLForAnyLanguage($alias) {
 100+// return
 101+// " JOIN (uw_syntrans AS ". $alias . "_syntrans, uw_expression_ns AS ". $alias . "_expression) ON " .
 102+// " (uw_defined_meaning.defined_meaning_id=". $alias . "_syntrans.defined_meaning_id AND ". $alias . "_syntrans.identical_meaning=1 AND " . getLatestTransactionRestriction($alias . '_syntrans') .
 103+// " AND ". $alias . "_expression.expression_id=". $alias . "_syntrans.expression_id AND " . getLatestTransactionRestriction($alias . '_expression') . ")";
 104+//}
 105+
 106+function getSynonymJoinSQLForLanguage($alias, $languageId) {
 107+ return
 108+ " JOIN (SELECT spelling FROM uw_expression_ns, uw_syntrans WHERE uw_expression_ns.expression_id=uw_syntrans.expression_id" .
 109+ " AND " . getLatestTransactionRestriction('uw_syntrans') .
 110+ " AND " . getLatestTransactionRestriction('uw_expression_ns') .
 111+ " AND uw_expression.ns.language_id=" . $languageId .
 112+ " AND uw_defined_meaning.defined_meaning_id=uw_syntrans.defined_meaning_id " .
 113+ " AND uw_syntrans.identical_meaning=1 " .
 114+ " LIMIT 1) ";
 115+}
 116+
 117+function getSynonymJoinSQLForAnyLanguage($alias) {
 118+ return
 119+ " JOIN (SELECT spelling FROM uw_expression_ns, uw_syntrans WHERE uw_expression_ns.expression_id=uw_syntrans.expression_id" .
 120+ " AND " . getLatestTransactionRestriction('uw_syntrans') .
 121+ " AND " . getLatestTransactionRestriction('uw_expression_ns') .
 122+ " AND uw_defined_meaning.defined_meaning_id=uw_syntrans.defined_meaning_id " .
 123+ " AND uw_syntrans.identical_meaning=1 " .
 124+ " LIMIT 1) ";
 125+}
 126+
 127+function getDefiningJoinSQLForLanguage($alias, $languageId) {
 128+ return
 129+ " JOIN (uw_syntrans AS ". $alias . "_syntrans, uw_expression_ns AS ". $alias . "_expression) ON " .
 130+ " (uw_defined_meaning.defined_meaning_id=". $alias . "_syntrans.defined_meaning_id AND ". $alias . "_syntrans.identical_meaning=1 AND " . getLatestTransactionRestriction($alias . '_syntrans') .
 131+ " AND ". $alias . "_expression.expression_id=". $alias . "_syntrans.expression_id AND ". $alias . "_expression.language_id=" . $languageId . " AND " . getLatestTransactionRestriction($alias . '_expression') . "" .
 132+ " AND uw_defined_meaning.expression_id=". $alias . "_syntrans.expression_id)";
 133+}
 134+
 135+function fetchDefinedMeaningReferenceRecords($sql, &$definedMeaningIds, &$definedMeaningReferenceRecords) {
 136+ global
 137+ $definedMeaningReferenceStructure, $definedMeaningIdAttribute, $definedMeaningLabelAttribute,
 138+ $definedMeaningDefiningExpressionAttribute;
 139+
 140+ $foundDefinedMeaningIds = array();
 141+
 142+ $dbr =& wfGetDB(DB_SLAVE);
 143+ $queryResult = $dbr->query($sql);
 144+
 145+ while ($row = $dbr->fetchObject($queryResult)) {
 146+ $definedMeaningId = $row->defined_meaning_id;
 147+
 148+ $record = new ArrayRecord($definedMeaningReferenceStructure);
 149+ $record->setAttributeValue($definedMeaningIdAttribute, $definedMeaningId);
 150+ $record->setAttributeValue($definedMeaningLabelAttribute, $row->label);
 151+ $record->setAttributeValue($definedMeaningDefiningExpressionAttribute, $row->label);
 152+
 153+ $definedMeaningReferenceRecords[$definedMeaningId] = $record;
 154+ $foundDefinedMeaningIds[] = $definedMeaningId;
 155+ }
 156+
 157+ $definedMeaningIds = array_diff($definedMeaningIds, $foundDefinedMeaningIds);
 158+}
 159+
 160+function fetchDefinedMeaningDefiningExpressions(&$definedMeaningIds, &$definedMeaningReferenceRecords) {
 161+ global
 162+ $definedMeaningReferenceStructure, $definedMeaningIdAttribute, $definedMeaningLabelAttribute,
 163+ $definedMeaningDefiningExpressionAttribute;
 164+
 165+ $dbr =& wfGetDB(DB_SLAVE);
 166+ $queryResult = $dbr->query(
 167+ "SELECT uw_defined_meaning.defined_meaning_id AS defined_meaning_id, uw_expression_ns.spelling" .
 168+ " FROM uw_defined_meaning, uw_expression_ns " .
 169+ " WHERE uw_defined_meaning.expression_id=uw_expression_ns.expression_id " .
 170+ " AND " . getLatestTransactionRestriction('uw_defined_meaning') .
 171+ " AND " . getLatestTransactionRestriction('uw_expression_ns') .
 172+ " AND uw_defined_meaning.defined_meaning_id IN (". implode(", ", $definedMeaningIds) .")"
 173+ );
 174+
 175+ while ($row = $dbr->fetchObject($queryResult)) {
 176+ $definedMeaningReferenceRecord = $definedMeaningReferenceRecords[$row->defined_meaning_id];
 177+
 178+ if ($definedMeaningReferenceRecord == null) {
 179+ $definedMeaningReferenceRecord = new ArrayRecord($definedMeaningReferenceStructure);
 180+ $definedMeaningReferenceRecord->setAttributeValue($definedMeaningIdAttribute, $row->defined_meaning_id);
 181+ $definedMeaningReferenceRecord->setAttributeValue($definedMeaningLabelAttribute, $row->spelling);
 182+ $definedMeaningReferenceRecords[$row->defined_meaning_id] = $definedMeaningReferenceRecord;
 183+ }
 184+
 185+ $definedMeaningReferenceRecord->setAttributeValue($definedMeaningDefiningExpressionAttribute, $row->spelling);
 186+ }
 187+}
 188+
 189+function getNullDefinedMeaningReferenceRecord() {
 190+ global
 191+ $definedMeaningReferenceStructure, $definedMeaningIdAttribute, $definedMeaningLabelAttribute,
 192+ $definedMeaningDefiningExpressionAttribute;
 193+
 194+ $record = new ArrayRecord($definedMeaningReferenceStructure);
 195+ $record->setAttributeValue($definedMeaningIdAttribute, 0);
 196+ $record->setAttributeValue($definedMeaningLabelAttribute, "");
 197+ $record->setAttributeValue($definedMeaningDefiningExpressionAttribute, "");
 198+
 199+ return $record;
 200+}
 201+
73202 function getDefinedMeaningReferenceRecords($definedMeaningIds) {
 203+ global
 204+ $wgUser;
 205+
 206+ $startTime = microtime(true);
 207+
74208 $result = array();
 209+ $definedMeaningIdsForExpressions = $definedMeaningIds;
 210+
 211+ if (count($definedMeaningIds) > 0) {
 212+ $userLanguage = getLanguageIdForCode($wgUser->getOption('language'));
 213+
 214+ fetchDefinedMeaningReferenceRecords(
 215+ "SELECT uw_defined_meaning.defined_meaning_id AS defined_meaning_id, any_expression.spelling AS label " .
 216+ "FROM uw_defined_meaning" .
 217+ getDefiningJoinSQLForLanguage('any', $userLanguage) .
 218+ " WHERE uw_defined_meaning.defined_meaning_id IN (" . implode(", ", $definedMeaningIds) . ")" .
 219+ " GROUP BY uw_defined_meaning.defined_meaning_id",
 220+
 221+ $definedMeaningIds,
 222+ $result
 223+ );
75224
76 - foreach($definedMeaningIds as $definedMeaningId)
77 - $result[$definedMeaningId] = getDefinedMeaningReferenceRecord($definedMeaningId);
 225+ if (count($definedMeaningIds) > 0) {
 226+ fetchDefinedMeaningReferenceRecords(
 227+ "SELECT uw_defined_meaning.defined_meaning_id AS defined_meaning_id, spelling AS label " .
 228+ "FROM uw_defined_meaning" .
 229+ getSynonymJoinSQLForLanguage('any', $userLanguage) .
 230+ " WHERE uw_defined_meaning.defined_meaning_id IN (" . implode(", ", $definedMeaningIds) . ")",// .
 231+// " GROUP BY uw_defined_meaning.defined_meaning_id",
 232+
 233+ $definedMeaningIds,
 234+ $result
 235+ );
 236+
 237+ if (count($definedMeaningIds) > 0) {
 238+ fetchDefinedMeaningReferenceRecords(
 239+ "SELECT uw_defined_meaning.defined_meaning_id AS defined_meaning_id, spelling AS label " .
 240+ "FROM uw_defined_meaning" .
 241+ getSynonymJoinSQLForLanguage('any', 85) .
 242+ " WHERE uw_defined_meaning.defined_meaning_id IN (" . implode(", ", $definedMeaningIds) . ")",// .
 243+// " GROUP BY uw_defined_meaning.defined_meaning_id",
 244+
 245+ $definedMeaningIds,
 246+ $result
 247+ );
78248
 249+ if (count($definedMeaningIds) > 0) {
 250+ fetchDefinedMeaningReferenceRecords(
 251+ "SELECT uw_defined_meaning.defined_meaning_id AS defined_meaning_id, spelling AS label " .
 252+ "FROM uw_defined_meaning" .
 253+ getSynonymJoinSQLForAnyLanguage('any') .
 254+ " WHERE uw_defined_meaning.defined_meaning_id IN (" . implode(", ", $definedMeaningIds) . ")",// .
 255+// " GROUP BY uw_defined_meaning.defined_meaning_id",
 256+
 257+ $definedMeaningIds,
 258+ $result
 259+ );
 260+ }
 261+ }
 262+ }
 263+
 264+ fetchDefinedMeaningDefiningExpressions($definedMeaningIdsForExpressions, $result);
 265+ $result[0] = getNullDefinedMeaningReferenceRecord();
 266+ }
 267+
 268+ $queriesTime = microtime(true) - $startTime;
 269+ echo "<!-- Defined meaning reference queries: " . $queriesTime . " -->\n";
 270+
79271 return $result;
80272 }
81273
@@ -110,10 +302,13 @@
111303
112304 if (count($expressionIds) > 0) {
113305 $dbr =& wfGetDB(DB_SLAVE);
114 - $queryResult = $dbr->query("SELECT expression_id, language_id, spelling" .
115 - " FROM uw_expression_ns" .
116 - " WHERE expression_id IN (". implode(', ', $expressionIds) .")" .
117 - " AND ". getLatestTransactionRestriction('uw_expression_ns'));
 306+ $queryResult = $dbr->query(
 307+ "SELECT expression_id, language_id, spelling" .
 308+ " FROM uw_expression_ns" .
 309+ " WHERE expression_id IN (". implode(', ', $expressionIds) .")" .
 310+ " AND ". getLatestTransactionRestriction('uw_expression_ns')
 311+ );
 312+
118313 $result = array();
119314
120315 while ($row = $dbr->fetchObject($queryResult)) {
@@ -147,9 +342,12 @@
148343 function getTextReferences($textIds) {
149344 if (count($textIds) > 0) {
150345 $dbr =& wfGetDB(DB_SLAVE);
151 - $queryResult = $dbr->query("SELECT old_id, old_text" .
152 - " FROM text" .
153 - " WHERE old_id IN (". implode(', ', $textIds) .")");
 346+ $queryResult = $dbr->query(
 347+ "SELECT old_id, old_text" .
 348+ " FROM text" .
 349+ " WHERE old_id IN (". implode(', ', $textIds) .")"
 350+ );
 351+
154352 $result = array();
155353
156354 while ($row = $dbr->fetchObject($queryResult))
@@ -354,6 +552,7 @@
355553 global
356554 $meaningRelationsTable, $relationIdAttribute, $relationTypeAttribute, $otherDefinedMeaningAttribute;
357555
 556+// $startTime = microtime(true);
358557 $recordSet = queryRecordSet(
359558 $queryTransactionInformation,
360559 $relationIdAttribute,
@@ -367,6 +566,8 @@
368567 array('relationtype_mid')
369568 );
370569
 570+// echo "<!--" . (microtime(true) - $startTime). " -->";
 571+
371572 expandDefinedMeaningReferencesInRecordSet($recordSet, array($relationTypeAttribute, $otherDefinedMeaningAttribute));
372573
373574 return $recordSet;