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. |