Fz-29 has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/365091 )

Change subject: Work in progress Add support for hierarchy fields in Drilldown
......................................................................

Work in progress
Add support for hierarchy fields in Drilldown

Change-Id: Ic465b978a1f40f00c66fbdf1b29f8ebe71f2fc55
---
M CargoHierarchy.php
M CargoUtils.php
M drilldown/CargoSpecialDrilldown.php
3 files changed, 172 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Cargo 
refs/changes/91/365091/1

diff --git a/CargoHierarchy.php b/CargoHierarchy.php
index 983008c..8a41eba 100644
--- a/CargoHierarchy.php
+++ b/CargoHierarchy.php
@@ -13,6 +13,10 @@
        public $mLeft = 0;
        public $mRight = 0;
 
+       // Helper class member for Drilldown
+       public $mPageCount = 0;
+       public $mExclusivePageCount = 0;
+
        function __construct( $curTitle = '__pseudo_root__' ) {
                $this->mTitle = $curTitle;
                $this->mChildren = array();
@@ -42,6 +46,7 @@
                        $curParentNode = $fullTree->getLastNodeForLevel( 
$numBullets );
                        $curParentNode->addChild( new CargoHierarchy( $lineText 
) );
                }
+               $fullTree->computeLeftRight();
                return $fullTree;
        }
 
@@ -55,7 +60,6 @@
 
        function generateHierarchyStructureTableData() {
                $tableData = array();
-               $this->computeLeftRight();
                //  Preorder traversal using Stack data structure
                $stack = new SplStack();
                $stack->push( $this );
@@ -83,4 +87,63 @@
                $this->mRight = $counter;
                $counter += 1;
        }
+
+       function computeNodeCountByFilter( $f, $fullTextSearchTerm, 
$appliedFilters ) {
+               $cdb = CargoUtils::getDB();
+               $countArg = "";
+
+               list( $tableNames, $conds, $joinConds ) = $f->getQueryParts( 
$fullTextSearchTerm, $appliedFilters );
+               if ( $f->fieldDescription->mIsList ) {
+                       $countArg = "_rowID";
+                       $fieldTableName = $f->tableName . '__' . $f->name;
+                       $tableNames[] = $fieldTableName;
+                       // $fieldName = CargoUtils::escapedFieldName( $cdb, 
$fieldTableName, '_value' );
+                       $fieldName = '_value';
+                       $joinConds[$fieldTableName] = 
CargoUtils::joinOfMainAndFieldTable( $cdb, $f->tableName, $fieldTableName );
+               } else {
+                       $countArg = "_ID";
+                       $fieldName = $f->name;
+                       $fieldTableName = $f->tableName;
+               }
+
+               // Join hierarchy structure table __hierarchy with the main 
table
+               $hierarchyTableName = $f->tableName . '__' . $f->name . 
'__hierarchy';
+               $tableNames[] = $hierarchyTableName;
+
+               $joinConds[$hierarchyTableName] = 
CargoUtils::joinOfSingleFieldAndHierarchyTable( $cdb, 
+                       $fieldTableName, $fieldName, $hierarchyTableName );
+
+               // Need of following?
+               // if ( $f->searchableFiles ) {
+               //      $countClause = "COUNT(DISTINCT 
cargo__{$f->tableName}._pageID) AS total";
+               // } else {
+               //      $countClause = "COUNT(*) AS total";
+               // }
+
+               $countClause = "COUNT(DISTINCT($countArg)) AS total";
+               $hierarchyConds = array();
+               $exclusiveHierarchyConds = array();
+               $hierarchyConds[] = "_left >= $this->mLeft";
+               $hierarchyConds[] = "_right <= $this->mRight";
+               $exclusiveHierarchyConds[] = "_left = $this->mLeft";
+
+               // Hierarchy Node Count
+               $res = $cdb->select( $tableNames, array( $countClause ), 
array_merge( $conds, $hierarchyConds ),
+                       null, null, $joinConds );
+               $count = 0;
+               while ( $row = $cdb->fetchRow( $res ) ) {
+                       $count = $row['total'];
+               }
+               $this->mPageCount = $count;
+               $cdb->freeResult( $res );
+               // Exclusive Node Count 
+               $res = $cdb->select( $tableNames, array( $countClause ), 
array_merge( $conds, $exclusiveHierarchyConds ),
+                       null, null, $joinConds );
+               $count = 0;
+               while ( $row = $cdb->fetchRow( $res ) ) {
+                       $count = $row['total'];
+               }
+               $this->mExclusivePageCount = $count;
+               $cdb->freeResult( $res );
+       }
 }
\ No newline at end of file
diff --git a/CargoUtils.php b/CargoUtils.php
index eaf1392..a1686be 100644
--- a/CargoUtils.php
+++ b/CargoUtils.php
@@ -908,6 +908,15 @@
                );
        }
 
+       public static function joinOfSingleFieldAndHierarchyTable( $cdb, 
$singleFieldTableName, $fieldColumnName, $hierarchyTableName ) {
+               return array(
+                       'LEFT OUTER JOIN',
+                       self::escapedFieldName( $cdb, $singleFieldTableName, 
$fieldColumnName ) .
+                               ' = ' .
+                               self::escapedFieldName( $cdb, 
$hierarchyTableName, '_value' )
+               );
+       }
+
        public static function escapedInsert( $db, $tableName, $fieldValues ) {
                // Put quotes around the field names - needed for Postgres,
                // which otherwise lowercases all field names.
diff --git a/drilldown/CargoSpecialDrilldown.php 
b/drilldown/CargoSpecialDrilldown.php
index 5cc2126..7891829 100644
--- a/drilldown/CargoSpecialDrilldown.php
+++ b/drilldown/CargoSpecialDrilldown.php
@@ -528,6 +528,92 @@
                return $results_line;
        }
 
+       function printUnappliedFilterValuesForHierarachy( $cur_url, $f, 
$fullTextSearchTerm, $applied_filters ) {
+               $results_line = "";
+               // construct the CargoHierarchyTree for drilldown
+               $hierarchyTreeRoot = CargoHierarchy::newFromWikiText( 
$f->fieldDescription->mHierarchyStructure );
+               $num_printed_values = 0;
+               // count and print side by side
+               // TODO implement for list of hierarchy type
+               if( true || $f->fieldDescription->mIsList === false ){
+            $stack = new SplStack();
+            // preorder traversal of the tree
+            $stack->push( $hierarchyTreeRoot );
+            while( !$stack->isEmpty() ) {
+               $node = $stack->pop();
+                if( $node != ")" ) {
+                                       if( $node->mLeft !== 1 ) {
+                                               // check if its not 
__pseudo_root__ node, then only print
+                                               
$node->computeNodeCountByFilter( $f, $fullTextSearchTerm, $applied_filters );
+                       if ( $num_printed_values++ > 0 ) {
+                                                       $results_line .= " · ";
+                                               }
+                                               $results_line .= 
$this->getFilterByValueHrefElements( $f, $node->mTitle, $node->mPageCount, 
$cur_url );
+                                               
+                                       }
+                                       if( count( $node->mChildren ) > 0 ) {
+                        if( $node->mLeft !== 1 ) {
+                                                       $results_line .= " · ";
+                                                       $results_line .= "(" . 
$this->getFilterByValueHrefElements( $f, $node->mTitle . " only" , 
$node->mExclusivePageCount, $cur_url );
+                               $stack->push( ")" );
+                                               }
+                                               $i = count( $node->mChildren ) 
- 1;
+                                               while( $i >= 0 )
+                        {
+                            $stack->push($node->mChildren[$i]);
+                            $i = $i - 1;
+                        }
+                    }
+                }
+                else {
+                    $results_line .= ") ";
+                }
+            }
+        }
+               return $results_line;
+       }
+
+       function getFilterByValueHrefElements( $f, $value_str, $num_results, 
$cur_url ) {
+               
+               global $wgCargoDrilldownSmallestFontSize, 
$wgCargoDrilldownLargestFontSize;
+               // set font-size values for filter "tag cloud", if the
+               // appropriate global variables are set
+               if ( $wgCargoDrilldownSmallestFontSize > 0 && 
$wgCargoDrilldownLargestFontSize > 0 ) {
+                       $lowest_num_results = min( $filter_values );
+                       $highest_num_results = max( $filter_values );
+                       if ( $lowest_num_results != $highest_num_results ) {
+                               $scale_factor = ( 
$wgCargoDrilldownLargestFontSize - $wgCargoDrilldownSmallestFontSize ) /
+                                       ( log( $highest_num_results ) - log( 
$lowest_num_results ) );
+                       }
+               }
+               
+               $result_line_part = "";
+               $filter_text = "";
+               $filter_text = $this->printFilterValue( $f, $value_str );
+               $filter_text .= " ($num_results)";
+               $filter_url = $cur_url . urlencode( str_replace( ' ', '_', 
$f->name ) ) . '=' .
+                       urlencode( str_replace( ' ', '_', $value_str ) );
+               if ( $wgCargoDrilldownSmallestFontSize > 0 && 
$wgCargoDrilldownLargestFontSize > 0 ) {
+                       if ( $lowest_num_results != $highest_num_results ) {
+                               $font_size = round( ((log( $num_results ) - 
log( $lowest_num_results )) * $scale_factor ) +
+                                       $wgCargoDrilldownSmallestFontSize );
+                       } else {
+                               $font_size = ( 
$wgCargoDrilldownSmallestFontSize + $wgCargoDrilldownLargestFontSize ) / 2;
+                       }
+                       $result_line_part .= "\n\t\t\t\t\t\t" . 
Html::rawElement( 'a',
+                               array( 'href' => $filter_url,
+                                       'title' => $this->msg( 
'cargo-drilldown-filterbyvalue' )->text(),
+                                       'style' => "font-size: {$font_size}px"
+                                       ), $filter_text );
+               } else {
+                       $result_line_part .= "\n\t\t\t\t\t\t" . 
Html::rawElement( 'a',
+                               array( 'href' => $filter_url,
+                                       'title' => $this->msg( 
'cargo-drilldown-filterbyvalue' )->text()
+                               ), $filter_text );
+               }
+               return $result_line_part;
+       }
+
        /**
         * Copied from Miga, also written by Yaron Koren
         * (https://github.com/yaronkoren/miga/blob/master/NumberUtils.js)
@@ -936,7 +1022,18 @@
                global $wgCargoDrilldownMinValuesForComboBox;
 
                $fieldType = $f->fieldDescription->mType;
-               if ( $fieldType == 'Date' || $fieldType == 'Datetime' ) {
+               $isHierarchy = $f->fieldDescription->mIsHierarchy;
+               if( $cur_url === null ) {
+                       // If $cur_url wasn't passed in, we have to create it.
+                       $cur_url = $this->makeBrowseURL( $this->tableName, 
$this->fullTextSearchTerm, $this->applied_filters, $f->name );
+                       $cur_url .= ( strpos( $cur_url, '?' ) ) ? '&' : '?';
+               }
+
+               if( $isHierarchy ) {
+                       $results_line = 
$this->printUnappliedFilterValuesForHierarachy( $cur_url, $f,
+                               $this->fullTextSearchTerm, 
$this->applied_filters );
+                       return $this->printFilterLine( $f->name, false, true, 
$results_line );
+               } else if ( $fieldType == 'Date' || $fieldType == 'Datetime' ) {
                        $filter_values = $f->getTimePeriodValues( 
$this->fullTextSearchTerm, $this->applied_filters );
                } else {
                        $filter_values = $f->getAllValues( 
$this->fullTextSearchTerm, $this->applied_filters );
@@ -958,10 +1055,7 @@
                } elseif ( count( $filter_values ) >= 
$wgCargoDrilldownMinValuesForComboBox ) {
                        $results_line = $this->printComboBoxInput( 
$filter_name, 0, $filter_values );
                        $normal_filter = false;
-               } else {
-                       // If $cur_url wasn't passed in, we have to create it.
-                       $cur_url = $this->makeBrowseURL( $this->tableName, 
$this->fullTextSearchTerm, $this->applied_filters, $f->name );
-                       $cur_url .= ( strpos( $cur_url, '?' ) ) ? '&' : '?';
+               } else {                        
                        $results_line = $this->printUnappliedFilterValues( 
$cur_url, $f, $filter_values );
                }
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic465b978a1f40f00c66fbdf1b29f8ebe71f2fc55
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Cargo
Gerrit-Branch: master
Gerrit-Owner: Fz-29 <f29ah...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to