|
From: <zep...@us...> - 2008-09-02 02:20:16
|
Revision: 405
http://flatpack.svn.sourceforge.net/flatpack/?rev=405&view=rev
Author: zepernick
Date: 2008-09-02 02:20:25 +0000 (Tue, 02 Sep 2008)
Log Message:
-----------
added the ability to specify the type of column being ordered by: String, Date, Numeric. This allows more control over the sorting.
Modified Paths:
--------------
trunk/flatpack/src/main/java/net/sf/flatpack/ordering/OrderBy.java
trunk/flatpack/src/main/java/net/sf/flatpack/ordering/OrderColumn.java
trunk/flatpack/src/test/java/net/sf/flatpack/pzparser/PZParserOptsTest.java
Modified: trunk/flatpack/src/main/java/net/sf/flatpack/ordering/OrderBy.java
===================================================================
--- trunk/flatpack/src/main/java/net/sf/flatpack/ordering/OrderBy.java 2008-09-02 02:19:23 UTC (rev 404)
+++ trunk/flatpack/src/main/java/net/sf/flatpack/ordering/OrderBy.java 2008-09-02 02:20:25 UTC (rev 405)
@@ -33,14 +33,20 @@
package net.sf.flatpack.ordering;
import java.io.Serializable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Comparator;
+import java.util.Date;
+import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import net.sf.flatpack.structure.Row;
import net.sf.flatpack.util.FPConstants;
import net.sf.flatpack.util.ParserUtils;
+import net.sf.flatpack.xml.MetaData;
/**
* @author paul zepernick
@@ -54,11 +60,10 @@
private static final long serialVersionUID = 5622406168247149895L;
/** collection of order elements to sort by */
- private final ArrayList orderbys = new ArrayList();
+ private final List orderbys = new ArrayList();
+
+ private MetaData metaData;
- /** column meta data */
- private List columnMD = null;
-
/**
* Adds an order element to the sort.
*
@@ -80,6 +85,7 @@
final Row row0 = (Row) arg0;
final Row row1 = (Row) arg1;
int result = 0;
+
for (int i = 0; i < orderbys.size(); i++) {
final OrderColumn oc = (OrderColumn) orderbys.get(i);
@@ -99,8 +105,35 @@
// convert to one type of case so the comparator does not take case
// into account when sorting
- final Comparable comp0 = row0.getValue(ParserUtils.findColumn(oc.getColumnName(), columnMD)).toLowerCase(Locale.getDefault());
- final Comparable comp1 = row1.getValue(ParserUtils.findColumn(oc.getColumnName(), columnMD)).toLowerCase(Locale.getDefault());
+ Comparable comp0 = null;
+ Comparable comp1 = null;
+ String str0 = row0.getValue(ParserUtils.getColumnIndex(row0.getMdkey(), metaData, oc.getColumnName(), null)).toLowerCase(Locale.getDefault());
+ String str1 = row1.getValue(ParserUtils.getColumnIndex(row1.getMdkey(), metaData, oc.getColumnName(), null)).toLowerCase(Locale.getDefault());
+ switch (oc.getSelectedColType()) {
+ case OrderColumn.COLTYPE_STRING:
+ comp0 = str0;
+ comp1 = str1;
+ break;
+ case OrderColumn.COLTYPE_NUMERIC:
+ comp0 = Double.valueOf(ParserUtils.stripNonDoubleChars(str0));
+ comp1 = Double.valueOf(ParserUtils.stripNonDoubleChars(str1));
+ break;
+ case OrderColumn.COLTYPE_DATE:
+ final SimpleDateFormat sdf = new SimpleDateFormat(oc.getDateFormatPattern());
+ try {
+ comp0 = sdf.parse(str0);
+ } catch(ParseException e) {
+ comp0 = getBadDateDefault();
+
+ }
+
+ try {
+ comp1 = sdf.parse(str1);
+ } catch(ParseException e) {
+ comp1 = getBadDateDefault();
+ }
+ break;
+ }
// multiply by the sort indicator to get a ASC or DESC result
result = comp0.compareTo(comp1) * oc.getSortIndicator();
@@ -115,11 +148,27 @@
return result;
}
+ private Date getBadDateDefault() {
+ final Calendar defaultBadDt = new GregorianCalendar();
+ defaultBadDt.set(Calendar.MONTH, 1);
+ defaultBadDt.set(Calendar.YEAR, 1900);
+ defaultBadDt.set(Calendar.DAY_OF_MONTH, 1);
+ return defaultBadDt.getTime();
+ }
+
+
/**
- * @param columnMD
- * The columnMD to set.
+ * @return the metaData
*/
- public void setColumnMD(final List columnMD) {
- this.columnMD = columnMD;
+ public MetaData getMetaData() {
+ return metaData;
}
+
+ /**
+ * @param metaData the metaData to set
+ */
+ public void setMetaData(MetaData metaData) {
+ this.metaData = metaData;
+ }
+
}
Modified: trunk/flatpack/src/main/java/net/sf/flatpack/ordering/OrderColumn.java
===================================================================
--- trunk/flatpack/src/main/java/net/sf/flatpack/ordering/OrderColumn.java 2008-09-02 02:19:23 UTC (rev 404)
+++ trunk/flatpack/src/main/java/net/sf/flatpack/ordering/OrderColumn.java 2008-09-02 02:20:25 UTC (rev 405)
@@ -41,27 +41,62 @@
* @version 2.0
*/
public class OrderColumn {
- /** property name to sort by */
- private String columnName = null;
+
+ /**Specifies descending sort order*/
+ public static final boolean DESC = true;
+
+ /**Specifies Ascending sort order*/
+ public static final boolean ASC = false;
+
+ /**string sort indicator*/
+ public static final int COLTYPE_STRING = 0;
+
+ /**date sort indicator*/
+ public static final int COLTYPE_DATE = 1;
+
+ /**numeric sort indicator*/
+ public static final int COLTYPE_NUMERIC = 2;
+
+ //property name to sort by
+ private String columnName;
- /** 1 = ASC -1 = DESC */
+ //1 = ASC -1 = DESC
private int sortIndicator = 1;
+
+ private int selectedColType;
+
+ private String dateFormatPattern = "yyyyMMdd";
/**
* Constructs a new order by element
*
- * @param columnName -
+ * @param columnName
* column to sort by
- * @param desc -
- * boolean sort DESC?
+ * @param desc
+ * boolean sort DESC. OrderColumn.DESC, OrderColumn.ASC
+ * @param colType
+ * Type of column to be sorted: OrderColumn.COLTYPE_STRING,OrderColumn.COLTYPE_DATE, OrderColum.COLTYPE_NUMERIC
*/
- public OrderColumn(final String columnName, final boolean desc) {
+ public OrderColumn(final String columnName, final boolean desc, final int colType) {
this.columnName = columnName;
+ this.selectedColType = colType;
if (desc) {
this.sortIndicator = -1;
}
}
+
+ /**
+ * Constructs a new order by element
+ *
+ * @param columnName
+ * column to sort by
+ * @param desc
+ * boolean sort DESC. OrderColumn.DESC, OrderColumn.ASC
+ */
+ public OrderColumn(final String columnName, final boolean desc) {
+ this(columnName, desc, OrderColumn.COLTYPE_STRING);
+ }
/**
* @return Returns the propertyName.
@@ -84,4 +119,39 @@
public int getSortIndicator() {
return sortIndicator;
}
+
+ /**
+ * @return the selectedColType
+ */
+ public int getSelectedColType() {
+ return selectedColType;
+ }
+
+ /**
+ * @param selectedColType the selectedColType to set
+ */
+ public void setSelectedColType(int selectedColType) {
+ this.selectedColType = selectedColType;
+ }
+
+ /**
+ * Format pattern to use to parse dates for sorting. Default is yyyyMMdd
+ *
+ * @return the dateFormatPattern
+ */
+ public String getDateFormatPattern() {
+ return dateFormatPattern;
+ }
+
+ /**
+ * Format pattern to use to parse dates for sorting. Default is yyyyMMdd
+ *
+ * @param dateFormatPattern the dateFormatPattern to set
+ * @see java.text.SimpleDateFormat
+
+ */
+ public void setDateFormatPattern(String dateFormatPattern) {
+ this.dateFormatPattern = dateFormatPattern;
+ }
}
+
Modified: trunk/flatpack/src/test/java/net/sf/flatpack/pzparser/PZParserOptsTest.java
===================================================================
--- trunk/flatpack/src/test/java/net/sf/flatpack/pzparser/PZParserOptsTest.java 2008-09-02 02:19:23 UTC (rev 404)
+++ trunk/flatpack/src/test/java/net/sf/flatpack/pzparser/PZParserOptsTest.java 2008-09-02 02:20:25 UTC (rev 405)
@@ -9,6 +9,8 @@
import net.sf.flatpack.DataSet;
import net.sf.flatpack.DefaultParserFactory;
import net.sf.flatpack.Parser;
+import net.sf.flatpack.ordering.OrderBy;
+import net.sf.flatpack.ordering.OrderColumn;
import net.sf.flatpack.util.FPConstants;
import net.sf.flatpack.util.FPInvalidUsageException;
@@ -163,6 +165,66 @@
assertEquals(true, ds.next());
}
+
+ public void testSorting() {
+ DataSet ds;
+ String cols = "fname,lname,dob,anumber\r\npaul,zepernick,06/21/1981,2\r\nbenoit,xhenseval,05/01/1970,12";
+ Parser p = DefaultParserFactory.getInstance().newDelimitedParser(new StringReader(cols), ',', FPConstants.NO_QUALIFIER);
+ ds = p.parse();
+
+ OrderBy order = new OrderBy();
+ order.addOrderColumn(new OrderColumn("fname",OrderColumn.ASC));
+ ds.orderRows(order);
+ ds.next();
+ assertEquals("benoit", ds.getString("fname"));
+
+
+ order = new OrderBy();
+ order.addOrderColumn(new OrderColumn("lname",OrderColumn.DESC));
+ ds.orderRows(order);
+ ds.next();
+ assertEquals("zepernick", ds.getString("lname"));
+
+
+ //test date sorting
+ order = new OrderBy();
+ OrderColumn column = new OrderColumn("dob",OrderColumn.ASC, OrderColumn.COLTYPE_DATE);
+ column.setDateFormatPattern("MM/dd/yyyy");
+ order.addOrderColumn(column);
+ ds.orderRows(order);
+ ds.next();
+ assertEquals("xhenseval", ds.getString("lname"));
+
+
+ //test numeric sorting
+ order = new OrderBy();
+ order.addOrderColumn(new OrderColumn("anumber",OrderColumn.DESC, OrderColumn.COLTYPE_NUMERIC));
+ ds.orderRows(order);
+ ds.next();
+ assertEquals("xhenseval", ds.getString("lname"));
+
+
+ //test bad date format & bad numeric data
+ //06.21.1981 should default to 01/01/1900 since it does not match our date format
+ cols = "fname,lname,dob,anumber\r\npaul,zepernick,06.21.1981,not a number\r\nbenoit,xhenseval,05/01/1970,12";
+ p = DefaultParserFactory.getInstance().newDelimitedParser(new StringReader(cols), ',', FPConstants.NO_QUALIFIER);
+ ds = p.parse();
+ order = new OrderBy();
+ column = new OrderColumn("dob",OrderColumn.ASC, OrderColumn.COLTYPE_DATE);
+ column.setDateFormatPattern("MM/dd/yyyy");
+ order.addOrderColumn(column);
+ ds.orderRows(order);
+ ds.next();
+ assertEquals("zepernick", ds.getString("lname"));
+
+ //not a number should get treated as a 0
+ order = new OrderBy();
+ order.addOrderColumn(new OrderColumn("anumber",OrderColumn.ASC, OrderColumn.COLTYPE_NUMERIC));
+ ds.orderRows(order);
+ ds.next();
+ assertEquals("zepernick", ds.getString("lname"));
+
+ }
public static void main(final String[] args) {
junit.textui.TestRunner.run(PZParserOptsTest.class);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|