Revision: 4049
Author: [email protected]
Date: Wed Jan  5 10:05:22 2011
Log: A better fix for bug 3002. A comparator now correctly sorts only the column that contains the error. The Other Values string is better handled here as well.
http://code.google.com/p/power-architect/source/detail?r=4049

Modified:
 /trunk/src/main/java/ca/sqlpower/architect/profile/ColumnValueCount.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/ProfileGraphPanel.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/ProfileResultsViewer.java

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/profile/ColumnValueCount.java Mon Dec 20 15:21:23 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/profile/ColumnValueCount.java Wed Jan 5 10:05:22 2011
@@ -19,6 +19,7 @@
 package ca.sqlpower.architect.profile;

 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;

 import ca.sqlpower.object.AbstractSPObject;
@@ -27,6 +28,7 @@
 import ca.sqlpower.object.annotation.Constructor;
 import ca.sqlpower.object.annotation.ConstructorParameter;
 import ca.sqlpower.object.annotation.Mutator;
+import ca.sqlpower.swingui.table.TableModelSortDecorator;

 /**
  * A simple class for keeping track of a value, the number of occurrences
@@ -49,11 +51,37 @@
* profile. The flag in this class for representing other values should be * checked for the official decision if this value count is all of the other
      * values.
-     *
- * This is used the the TableModelSortDecorator in the library in comparing table
-     * rows so if you update this here, update it there as well.
      */
     public static final String OTHER_VALUE_OBJECT = "Other Values";
+
+    /**
+ * A comparator that correctly sorts the value column of tables now that the value + * column will always contain an entry for other values. Without sorting with this + * comparator a class cast exception will occur if you sort only numeric values.
+     */
+ public static class ColumnValueComparator implements Comparator<Object> {
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public int compare(Object o1, Object o2) {
+ if (o1 instanceof String && ColumnValueCount.OTHER_VALUE_OBJECT.equals((String)o1)) {
+                return 1;
+ } else if (o2 instanceof String && ColumnValueCount.OTHER_VALUE_OBJECT.equals((String)o2)) {
+                return -1;
+            } else if (o1 == null && o2 == null) {
+                 return 0;
+            } else if (o1 == null) {
+                return -1;
+            } else if (o2 == null) {
+                return 1;
+            } else {
+ if (o1.getClass().equals(o2.getClass()) && Comparable.class.isAssignableFrom(o1.getClass())) { + return TableModelSortDecorator.COMPARABLE_COMAPRATOR.compare(o1, o2);
+                }
+ return TableModelSortDecorator.LEXICAL_COMPARATOR.compare(o1, o2);
+            }
+        }
+    }

     private final Object value;
     private final int count;
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ProfileGraphPanel.java Tue Aug 10 09:55:27 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ProfileGraphPanel.java Wed Jan 5 10:05:22 2011
@@ -70,6 +70,7 @@
  *
  */
 public class ProfileGraphPanel {
+
     private JLabel rowCountDisplay;

     private JLabel title;
@@ -366,6 +367,8 @@

FreqValueCountTableModel freqValueCountTableModel = new FreqValueCountTableModel(cr); TableModelSortDecorator sortModel = new TableModelSortDecorator(freqValueCountTableModel); + sortModel.setColumnComparator(freqValueCountTableModel.getColumnClass(2),
+                new ColumnValueCount.ColumnValueComparator());
         freqValueTable.setModel(sortModel);
         sortModel.setTableHeader(freqValueTable.getTableHeader());
         freqValueTable.initColumnSizes();
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ProfileResultsViewer.java Tue Aug 10 09:55:27 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ProfileResultsViewer.java Wed Jan 5 10:05:22 2011
@@ -60,6 +60,7 @@
 import org.apache.log4j.Logger;

 import ca.sqlpower.architect.ArchitectSession;
+import ca.sqlpower.architect.profile.ColumnValueCount;
 import ca.sqlpower.architect.profile.ProfileManager;
 import ca.sqlpower.architect.profile.ProfileResult;
 import ca.sqlpower.architect.profile.TableProfileResult;
@@ -92,7 +93,7 @@
  * A class that manages a viewer component for a set of Profile Results.
  */
 public class ProfileResultsViewer {
-
+
private static final Logger logger = Logger.getLogger(ProfileResultsViewer.class);

     /**
@@ -476,6 +477,8 @@
JTextField columnSearchField = new JTextField("", 25); //$NON-NLS-1$ final FancyExportableJTable columnTable = new FancyExportableJTable(columnTableModel, columnSearchField
                     .getDocument());
+ columnTable.getTableModelSortDecorator().setColumnComparator(columnTableModel.getColumnClass(2),
+                    new ColumnValueCount.ColumnValueComparator());
columnTableModel.addTableModelListener(new TableModelListener() {
                 public void tableChanged(TableModelEvent e) {
                     TableUtils.fitColumnWidths(columnTable, 15);

Reply via email to