https://www.mediawiki.org/wiki/Special:Code/MediaWiki/115462
Revision: 115462 Author: fptc Date: 2012-05-30 14:22:08 +0000 (Wed, 30 May 2012) Log Message: ----------- FreqPatternTagCloud: Bugfixes, Support of all attribute types, Make Specialpage includable Modified Paths: -------------- trunk/extensions/FreqPatternTagCloud/FreqPatternTagCloud.body.php trunk/extensions/FreqPatternTagCloud/freqpatterntagcloud.sql trunk/extensions/FreqPatternTagCloud/includes/FrequentPattern.php trunk/extensions/FreqPatternTagCloud/includes/TagCloud.php trunk/extensions/FreqPatternTagCloud/includes/computation/FrequentPatternAlgorithm.php trunk/extensions/FreqPatternTagCloud/includes/computation/FrequentPatternApriori.php trunk/extensions/FreqPatternTagCloud/javascripts/main.js Added Paths: ----------- trunk/extensions/FreqPatternTagCloud/javascripts/jquery.parseJSON.js Modified: trunk/extensions/FreqPatternTagCloud/FreqPatternTagCloud.body.php =================================================================== --- trunk/extensions/FreqPatternTagCloud/FreqPatternTagCloud.body.php 2012-05-29 20:08:17 UTC (rev 115461) +++ trunk/extensions/FreqPatternTagCloud/FreqPatternTagCloud.body.php 2012-05-30 14:22:08 UTC (rev 115462) @@ -3,7 +3,7 @@ * Frequent Pattern Tag Cloud Plug-in * Special page * - * @author Tobias Beck, University of Heidelberg + * @author Tobias Beck (TB), University of Heidelberg * @author Andreas Fay, University of Heidelberg * @version 1.0 */ @@ -129,7 +129,8 @@ public static function getSearchSuggestions( $currentSearchValue ) { $dbr = wfGetDB( DB_SLAVE ); - // Get possible attribute values + // Get possible attribute values + // TB: Include attribute values from table smw_atts2 $res = $dbr->query( "(SELECT DISTINCT vals.smw_title AS val, atts.smw_title AS att FROM ".$dbr->tableName("smw_ids")." vals, ".$dbr->tableName("smw_ids")." atts, ".$dbr->tableName("smw_rels2")." rels @@ -141,8 +142,18 @@ AND LENGTH(atts.smw_iw) = 0 AND vals.smw_title LIKE '%".mysql_real_escape_string($currentSearchValue)."%' ORDER BY vals.smw_title - LIMIT 20) UNION ( - SELECT smw_title AS val, '".mysql_real_escape_string(wfMsg("fptc-categoryname"))."' AS att + LIMIT 14) + UNION ( + SELECT DISTINCT vals.value_xsd AS val, atts.smw_title AS att + FROM ".$dbr->tableName("smw_atts2")." AS vals, ".$dbr->tableName("smw_ids")." AS atts + WHERE vals.p_id = atts.smw_id + AND atts.smw_namespace = 102 + AND LENGTH(atts.smw_iw) = 0 + AND value_xsd LIKE '%".mysql_real_escape_string($currentSearchValue)."%' + ORDER BY value_xsd + LIMIT 14) + UNION ( + SELECT smw_title AS val, '".mysql_real_escape_string(wfMsg("fptc-categoryname"))."' AS att FROM ".$dbr->tableName("smw_ids")." WHERE smw_title LIKE '%".mysql_real_escape_string($currentSearchValue)."%' AND smw_namespace = 14 @@ -247,7 +258,8 @@ // Context menu $wgOut->addHTML( - '<ul id="fptc_contextMenu" class="contextMenu"> + '<div id="fptc_baseAttribute" style="display:none">' . $attribute . '</div> + <ul id="fptc_contextMenu" class="contextMenu"> <li class="browse"> <a href="#browse">' . wfMsg( 'fptc-context-menu-browse' ) . '</a> </li> @@ -284,32 +296,39 @@ private function printTag( Tag $tag, $attribute ) { global $wgOut; - $wgOut->addHTML( + if ($attribute == wfMsg( 'fptc-categoryname' )) { + $wgOut->addHTML( sprintf( - '<div class="fptc_tag" style="font-size:%dpx;">%s</div>', - $this->fontSizeMin + ( $this->fontSizeMax - $this->fontSizeMin ) * $tag->getRate(), - $attribute == wfMsg( 'fptc-categoryname' ) - ? $wgOut->parseInline( + '<div class="fptc_tag" style="font-size:%dpx;">', + $this->fontSizeMin + ( $this->fontSizeMax - $this->fontSizeMin ) * $tag->getRate()) . + $this->sandboxParse( + // $wgOut->parseInline( sprintf( '[[:%s:%s|%s]]', self::CATEGORY_PAGE, $tag->getValue(), $tag->getValue() ) - ) - : $wgOut->parseInline( - sprintf( - '[[:%s:%s/%s/%s|%s]]', - self::SPECIALPAGE_PREFIX, - self::ATTRIBUTE_VALUE_INDEX_SPECIALPAGE, - $attribute, - $tag->getValue(), - $tag->getValue() - ) - ) - ) - ); + ) . '</div>'); + } else { + $wgOut->addHTML( + sprintf('<div class="fptc_tag" style="font-size:%dpx;">', + $this->fontSizeMin + ( $this->fontSizeMax - $this->fontSizeMin ) * $tag->getRate()) . + html::element( 'a', array('href' => + SpecialPage::getTitleFor( self::ATTRIBUTE_VALUE_INDEX_SPECIALPAGE)->getLinkURL( + array('property' => $attribute, 'value' => $tag->getValue()))), $tag->getValue()) . + '</div>' + ); + } } + + private function sandboxParse($wikiText) { + global $wgTitle, $wgUser; + $myParser = new Parser(); + $myParserOptions = ParserOptions::newFromUser($wgUser); + $result = $myParser->parse($wikiText, $wgTitle, $myParserOptions); + return $result->getText(); + } /** * Prints the result of the search for attribute <code>attribute</code> to @@ -343,6 +362,7 @@ '<a href=' . $possibleAttribute . '>' . $possibleAttribute . '</a>' ); + if ( $w < count( $proposal->getProposal() ) ) { $wgOut->addHTML( ', ' ); } Modified: trunk/extensions/FreqPatternTagCloud/freqpatterntagcloud.sql =================================================================== --- trunk/extensions/FreqPatternTagCloud/freqpatterntagcloud.sql 2012-05-29 20:08:17 UTC (rev 115461) +++ trunk/extensions/FreqPatternTagCloud/freqpatterntagcloud.sql 2012-05-30 14:22:08 UTC (rev 115462) @@ -8,7 +8,7 @@ CREATE INDEX /*i*/p_id ON /*_*/fptc_associationrules (p_id); CREATE TABLE IF NOT EXISTS /*_*/fptc_items ( - `o_id` INT(8) NOT NULL, + `o_id` varbinary(255) NOT NULL, `rule_id` INT NOT NULL, `item_order` TINYINT(1) NOT NULL, PRIMARY KEY ( `o_id` , `rule_id` ) Modified: trunk/extensions/FreqPatternTagCloud/includes/FrequentPattern.php =================================================================== --- trunk/extensions/FreqPatternTagCloud/includes/FrequentPattern.php 2012-05-29 20:08:17 UTC (rev 115461) +++ trunk/extensions/FreqPatternTagCloud/includes/FrequentPattern.php 2012-05-30 14:22:08 UTC (rev 115462) @@ -4,7 +4,7 @@ * Frequent Pattern Tag Cloud Plug-in * Frequent pattern functions * - * @author Tobias Beck, University of Heidelberg + * @author Tobias Beck (TB), University of Heidelberg * @author Andreas Fay, University of Heidelberg * @version 1.0 */ @@ -80,6 +80,10 @@ $res = $dbr->query("SELECT GROUP_CONCAT(DISTINCT o_id) FROM ".$dbr->tableName("smw_rels2")." WHERE p_id = ".mysql_real_escape_string($attributeId)." + GROUP BY p_id + UNION SELECT GROUP_CONCAT(DISTINCT value_xsd) + FROM ".$dbr->tableName("smw_atts2")." + WHERE p_id = ".mysql_real_escape_string($attributeId)." GROUP BY p_id"); } $row = $res->fetchRow(); @@ -94,9 +98,15 @@ AND ids.smw_namespace = 14 GROUP BY catlinks.cl_from"); } else { + // TB: Table smw_rels2 and smw_atts2 are independent because s_id appears only in one of both tables at a time $res = $dbr->query("SELECT GROUP_CONCAT(o_id) FROM ".$dbr->tableName("smw_rels2")." WHERE p_id = ".mysql_real_escape_string($attributeId)." + GROUP BY s_id + UNION SELECT GROUP_CONCAT(value_xsd) + FROM ".$dbr->tableName("smw_atts2")." As a + INNER JOIN ".$dbr->tableName("smw_ids")." AS i ON i.smw_id = a.p_id + WHERE (i.smw_namespace <> 102 OR length(i.smw_iw) = 0) AND p_id = ".mysql_real_escape_string($attributeId)." GROUP BY s_id"); } $transactions = array(); @@ -116,12 +126,12 @@ foreach ($rule->getAssumption() as $item) { $dbw->query("INSERT INTO ".$dbw->tableName("fptc_items")." (o_id, rule_id, item_order) - VALUES (".mysql_real_escape_string($item).", ".mysql_real_escape_string($ruleId).", 0)"); + VALUES ('".mysql_real_escape_string($item)."', ".mysql_real_escape_string($ruleId).", 0)"); } foreach ($rule->getConclusion() as $item) { $dbw->query("INSERT INTO ".$dbw->tableName("fptc_items")." (o_id, rule_id, item_order) - VALUES (".mysql_real_escape_string($item).", ".mysql_real_escape_string($ruleId).", 1)"); + VALUES ('".mysql_real_escape_string($item)."', ".mysql_real_escape_string($ruleId).", 1)"); } } @@ -166,7 +176,8 @@ $attributeId = $row[0]; $res->free(); - // Get id of assumption + // Get id of assumption from table smw_ids + // TB: Or name of assumtion from table smw_atts2 if (wfMsg("fptc-categoryname") == $attribute) { $res = $dbr->query("SELECT smw_id FROM ".$dbr->tableName("smw_ids")." @@ -174,11 +185,15 @@ AND smw_namespace = 14 AND LENGTH(smw_iw) = 0"); } else { - $res = $dbr->query("SELECT smw_id - FROM ".$dbr->tableName("smw_ids")." - WHERE smw_title = '".mysql_real_escape_string($assumption)."' - AND smw_namespace = 0 - AND LENGTH(smw_iw) = 0"); + $res = $dbr->query("(SELECT smw_id + FROM ".$dbr->tableName("smw_ids")." + WHERE smw_title = '".mysql_real_escape_string($assumption)."' + AND smw_namespace = 0 + AND LENGTH(smw_iw) = 0) + UNION + (SELECT a.value_xsd FROM ".$dbr->tableName("smw_atts2")." AS a INNER JOIN ".$dbr->tableName("smw_ids")." AS i ON i.smw_id = a.p_id + WHERE (i.smw_namespace <> 102 OR length(i.smw_iw) = 0) AND a.value_xsd = '".mysql_real_escape_string($assumption)."') + ORDER BY smw_id desc"); } $row = $res->fetchRow(); $assumptionId = $row[0]; @@ -189,18 +204,23 @@ FROM ".$dbr->tableName("fptc_associationrules")." rules, ".$dbr->tableName("fptc_items")." items WHERE rules.rule_id = items.rule_id AND item_order = 0 - AND o_id = ".mysql_real_escape_string($assumptionId)." + AND o_id = '".mysql_real_escape_string($assumptionId)."' AND NOT EXISTS( SELECT 1 FROM ".$dbr->tableName("fptc_items")." WHERE rule_id = rules.rule_id AND item_order = 0 AND o_id != items.o_id ) ORDER BY rule_support DESC, rule_confidence DESC"); $conclusions = array(); while ($row = $res->fetchRow()) { // Get conclusions - $resItems = $dbr->query("SELECT smw_title + $resItems = $dbr->query("(SELECT smw_title FROM ".$dbr->tableName("smw_ids")." ids, ".$dbr->tableName("fptc_items")." items WHERE ids.smw_id = items.o_id AND item_order = 1 - AND rule_id = ".mysql_real_escape_string($row['rule_id'])); - + AND rule_id = ".mysql_real_escape_string($row['rule_id']).") + UNION + (SELECT value_xsd AS smw_title FROM ".$dbr->tableName("smw_atts2")." atts2, ".$dbr->tableName("fptc_items")." items + WHERE atts2.value_xsd = items.o_id + AND item_order = 1 + AND rule_id = ".mysql_real_escape_string($row['rule_id']).")"); + // Only consider rules with single conclusion if ($resItems->numRows() > 1) { continue; @@ -217,6 +237,7 @@ /** * Shows all rules (for debugging purposes) + * TB: Attention, attribute types which are saved in table smw_atts2 are not yet considered here * * @return void * @throws SQLException Modified: trunk/extensions/FreqPatternTagCloud/includes/TagCloud.php =================================================================== --- trunk/extensions/FreqPatternTagCloud/includes/TagCloud.php 2012-05-29 20:08:17 UTC (rev 115461) +++ trunk/extensions/FreqPatternTagCloud/includes/TagCloud.php 2012-05-30 14:22:08 UTC (rev 115462) @@ -4,7 +4,7 @@ * Frequent Pattern Tag Cloud Plug-in * TagCloud * - * @author Tobias Beck, University of Heidelberg + * @author Tobias Beck (TB), University of Heidelberg * @author Andreas Fay, University of Heidelberg * @version 1.0 */ @@ -94,9 +94,12 @@ $res = $dbr->query("SELECT SUM(cat_pages) FROM ".$dbr->tableName("category")); } else { - $res = $dbr->query("SELECT COUNT(1) - FROM ".$dbr->tableName("smw_rels2")." - WHERE p_id = ".mysql_real_escape_string($this->_attributeId)); + // TB: Select only relevant tags in table smw_atts2 through JOIN with table smw_ids + $res = $dbr->query("SELECT SUM(num) + FROM ((SELECT COUNT(1) num FROM ".$dbr->tableName("smw_rels2")." WHERE p_id = ".mysql_real_escape_string($this->_attributeId).") + UNION (SELECT COUNT(1) num FROM ".$dbr->tableName("smw_atts2")." AS a + INNER JOIN ".$dbr->tableName("smw_ids")." AS i ON i.smw_id = a.p_id + WHERE (i.smw_namespace <> 102 OR length(i.smw_iw) = 0) AND p_id = ".mysql_real_escape_string($this->_attributeId).")) t"); } $row = $res->fetchRow(); @@ -116,11 +119,17 @@ AND LENGTH(smw_iw) = 0 ORDER BY smw_title"); } else { + // TB: Get tags also from table smw_atts2 $res = $dbr->query("SELECT smw_id, smw_title, (SELECT COUNT(1) FROM ".$dbr->tableName("smw_rels2")." WHERE o_id = smw_id AND p_id = ".mysql_real_escape_string($this->_attributeId).")/$numValues AS rate - FROM ".$dbr->tableName("smw_ids")." - WHERE smw_namespace = 0 - AND LENGTH(smw_iw) = 0 - AND smw_id <> ".mysql_real_escape_string($this->_attributeId)." + FROM ".$dbr->tableName("smw_ids")." + WHERE smw_namespace = 0 + AND LENGTH(smw_iw) = 0 + AND smw_id <> ".mysql_real_escape_string($this->_attributeId)." + UNION + SELECT 'atts2', a.value_xsd as smw_title, (SELECT COUNT(1) FROM ".$dbr->tableName("smw_atts2")." WHERE value_xsd = a.value_xsd AND p_id = ".mysql_real_escape_string($this->_attributeId).")/$numValues AS rate + FROM ".$dbr->tableName("smw_atts2")." AS a INNER JOIN + ".$dbr->tableName("smw_ids")." AS i ON i.smw_id = a.p_id + WHERE (i.smw_namespace <> 102 OR length(i.smw_iw) = 0) AND p_id = ".mysql_real_escape_string($this->_attributeId)." ORDER BY smw_title"); } Modified: trunk/extensions/FreqPatternTagCloud/includes/computation/FrequentPatternAlgorithm.php =================================================================== --- trunk/extensions/FreqPatternTagCloud/includes/computation/FrequentPatternAlgorithm.php 2012-05-29 20:08:17 UTC (rev 115461) +++ trunk/extensions/FreqPatternTagCloud/includes/computation/FrequentPatternAlgorithm.php 2012-05-30 14:22:08 UTC (rev 115462) @@ -26,7 +26,8 @@ $numerator = 0; $denominator = 0; foreach ($transactions as $transaction) { - // For each occurrence of the assumption -> increase denominator + set_time_limit(0); + // For each occurence of the assumption -> increase denominator // If the conclusion occurs too -> increase numerator // Check if transaction contains assumption @@ -84,7 +85,8 @@ $count = count($itemset); $members = pow(2,$count); $powerset = array(); - for ($i = 0; $i < $members; $i++) { + for ($i = 0; $i < $members; $i++) { + set_time_limit(0); $b = sprintf("%0".$count."b",$i); $out = array(); for ($j = 0; $j < $count; $j++) { @@ -122,6 +124,7 @@ // Generate subset A of X where X is frequent itemset such that A => (X-A) foreach ($this->computePowerSet($itemset->getItems()) as $subsetOfX) { + set_time_limit(0); if (count($subsetOfX) == 0 || $subsetOfX == $itemset->getItems()) { // Ignore empty set and identity continue; Modified: trunk/extensions/FreqPatternTagCloud/includes/computation/FrequentPatternApriori.php =================================================================== --- trunk/extensions/FreqPatternTagCloud/includes/computation/FrequentPatternApriori.php 2012-05-29 20:08:17 UTC (rev 115461) +++ trunk/extensions/FreqPatternTagCloud/includes/computation/FrequentPatternApriori.php 2012-05-30 14:22:08 UTC (rev 115462) @@ -21,55 +21,58 @@ return array(); } else { - // Get all 1-frequent itemsets - foreach ($items as $item) { - $freq = 0; - foreach ($transactions as $transaction) { - if (in_array($item, $transaction)) { - $freq++; - } - } - - if ((float)$freq / $numTransactions >= $minSupport) { - $allFrequentItemsets[] = new FrequentItemset(array($item), (float)$freq / $numTransactions); - } - } - - // Now compute all k-frequent itemsets - $freqK_1Itemsets = $allFrequentItemsets; - while (count($freqK_1Itemsets) > 0) { - $freqKItemsets = $this->generateCandidates($freqK_1Itemsets); - - $freqK_1Itemsets = array(); - - // Check support for each candidate - foreach ($freqKItemsets as $freqItemset) { + // Get all 1-frequent itemsets + foreach ($items as $item) { + set_time_limit(0); $freq = 0; foreach ($transactions as $transaction) { - $inArray = true; - foreach ($freqItemset->getItems() as $item) { - if (!in_array($item, $transaction)) { - $inArray = false; - break; - } - } - - if ($inArray) { + if (in_array($item, $transaction)) { $freq++; } } if ((float)$freq / $numTransactions >= $minSupport) { - $freqItemset->setSupport((float)$freq / $numTransactions); - $freqK_1Itemsets[] = $allFrequentItemsets[] = $freqItemset; - } else { - unset($freqItemset); + $allFrequentItemsets[] = new FrequentItemset(array($item), (float)$freq / $numTransactions); } } + + // Now compute all k-frequent itemsets + $freqK_1Itemsets = $allFrequentItemsets; + while (count($freqK_1Itemsets) > 0) { + $freqKItemsets = $this->generateCandidates($freqK_1Itemsets); + + $freqK_1Itemsets = array(); + + // Check support for each candidate + foreach ($freqKItemsets as $freqItemset) { + set_time_limit(0); + $freq = 0; + foreach ($transactions as $transaction) { + set_time_limit(0); + $inArray = true; + foreach ($freqItemset->getItems() as $item) { + if (!in_array($item, $transaction)) { + $inArray = false; + break; + } + } + + if ($inArray) { + $freq++; + } + } + + if ((float)$freq / $numTransactions >= $minSupport) { + $freqItemset->setSupport((float)$freq / $numTransactions); + $freqK_1Itemsets[] = $allFrequentItemsets[] = $freqItemset; + } else { + unset($freqItemset); + } + } + } + + return $allFrequentItemsets; } - - return $allFrequentItemsets; - } } @@ -85,6 +88,7 @@ $freqItemsetA = $freqK_1Itemsets[$a]; for ($b = $a + 1; $b < count($freqK_1Itemsets); $b++) { + set_time_limit(0); $freqItemsetB = $freqK_1Itemsets[$b]; // Check whether they have i=k-2 items in common Added: trunk/extensions/FreqPatternTagCloud/javascripts/jquery.parseJSON.js =================================================================== --- trunk/extensions/FreqPatternTagCloud/javascripts/jquery.parseJSON.js (rev 0) +++ trunk/extensions/FreqPatternTagCloud/javascripts/jquery.parseJSON.js 2012-05-30 14:22:08 UTC (rev 115462) @@ -0,0 +1,36 @@ +jQuery( document ).ready( function( $ ) { + +/** + * Frequent Pattern Tag Cloud Plug-in + * Addition of parseJSON for older jQuery versions + * + * @author Tobias Beck, University of Heidelberg + * @author Andreas Fay, University of Heidelberg + * @version 1.0 + */ + +/** + * Enable parseJSON + */ + if (!$j.parseJSON) { ( function() { + $j.extend({ + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + data = jQuery.trim( data ); + if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") + .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) { + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + } else { + jQuery.error( "Invalid JSON: " + data ); + } + } + }); + + })(jQuery); +} +}); Property changes on: trunk/extensions/FreqPatternTagCloud/javascripts/jquery.parseJSON.js ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/extensions/FreqPatternTagCloud/javascripts/main.js =================================================================== --- trunk/extensions/FreqPatternTagCloud/javascripts/main.js 2012-05-29 20:08:17 UTC (rev 115461) +++ trunk/extensions/FreqPatternTagCloud/javascripts/main.js 2012-05-30 14:22:08 UTC (rev 115462) @@ -2,7 +2,7 @@ * Frequent Pattern Tag Cloud Plug-in * Main javascript * - * @author Tobias Beck, University of Heidelberg + * @author Tobias Beck (TB), University of Heidelberg * @author Andreas Fay, University of Heidelberg * @version 1.0 */ @@ -28,7 +28,7 @@ } }); - var attribute = $j("#fptc_attributeName").val(); + var attribute = $j("#fptc_baseAttribute").text(); // Context menu for tag cloud $j(".fptc_tag a").contextMenu({ @@ -46,9 +46,14 @@ } }, function(action, el, pos, menu) { if (action == "browse") { - window.location = el.attr("href"); + window.location = el.attr("href"); } else if (action == "browse_similar_tag") { - window.location = el.attr("href").replace(new RegExp(encodeURI(el.text())), menu.attr("title")); + // TB: Changes due to the support of all attribute types + var newDirName = menu.attr("title"); + var oldDirName = el.text(); + // Construct the corresponding URL + // window.location = el.attr("href").replace(new RegExp(encodeURI(el.text())), menu.attr("title")); + window.location = el.attr("href").replace(oldDirName, newDirName); } }); @@ -62,4 +67,4 @@ }); } }); -}); \ No newline at end of file +}); _______________________________________________ MediaWiki-CVS mailing list MediaWiki-CVS@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs