litesoft
@ 947
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
// This Source Code is in the Public Domain per: http://unlicense.org package org.litesoft.orsup.base; import java.util.*; import org.litesoft.core.simpletypes.nonpublic.*; import org.litesoft.orsup.selection.*; /** * This class supports sorting of Persistent Objects in memory similar to the SQL's "ORDER BY" clause. * <p/> * Since the ordering of "null" values in SQL is unspecified, it has been decided * for "ASCending" to place them first, and * for "DESCending" to place them last. */ public class POOrderBy { public static class Result { public static final Result NULL = new Result( null ); private final Comparator<PersistentObject<?>> mComparator; public Result( Comparator<PersistentObject<?>> pComparator ) { mComparator = pComparator; } public Comparator<PersistentObject<?>> getComparator() { return mComparator; } } public static Result getComparator( MetaDataForPO pMD, OrderBy pOrderByClause ) { if ( (pOrderByClause == null) ) { return Result.NULL; } if ( isAcceptable( pMD, pOrderByClause ) ) { return new Result( createComparator( pMD, pOrderByClause ) ); } return null; } private static boolean isAcceptable( MetaDataForPO pMD, OrderBy pOrderByClause ) { AttributeAccessorSCD scd = pMD.getAccessorSCDoptional( pOrderByClause.getColumnDefinition().getName() ); if ( (scd != null) && scd.isPersisted() && SupplimentedSCD.Form.Local.equals( scd.getForm() ) && scd.isColumnTypeComparable() ) { OrderBy zSubOrderBy = pOrderByClause.getSubOrderBy(); return (zSubOrderBy == null) || isAcceptable( pMD, zSubOrderBy ); } return false; } private static MyComparator createComparator( MetaDataForPO pMD, OrderBy pOrderByClause ) { if ( pOrderByClause == null ) { return null; } AttributeAccessorSCD scd = pMD.getAccessorSCDrequired( pOrderByClause.getColumnDefinition().getName() ); return new MyComparator( pMD.getPOregistrationName(), scd, pOrderByClause.isDescending(), createComparator( pMD, pOrderByClause.getSubOrderBy() ) ); } private static class MyComparator implements Comparator<PersistentObject<?>> { private String mPORegisteredName; private AttributeAccessorSCD mSCD; private boolean mDecending; private MyComparator mSubComparator; public MyComparator( String pPORegisteredName, AttributeAccessorSCD pSCD, boolean pDecending, MyComparator pSubComparator ) { mPORegisteredName = pPORegisteredName; mSCD = pSCD; mDecending = pDecending; mSubComparator = pSubComparator; } private void chkType( PersistentObject<?> pPO ) { if ( !mPORegisteredName.equals( pPO.getRegisteredName() ) ) { throw new ClassCastException( "PO type: '" + pPO.getRegisteredName() + // "' != '" + mPORegisteredName + "'" ); } } @SuppressWarnings({"unchecked"}) private Comparable getValueOnPO( PersistentObject<?> pPO ) { return (Comparable) mSCD.getValueOnPO( pPO ); } @Override public int compare( PersistentObject<?> pPO1, PersistentObject<?> pPO2 ) { if ( pPO1.equals( pPO2 ) ) { return 0; } chkType( pPO1 ); chkType( pPO2 ); return LLcompare( pPO1, pPO2 ); } private int LLcompare( PersistentObject<?> pPO1, PersistentObject<?> pPO2 ) { int i = CompareSupport.compare( getValueOnPO( pPO1 ), getValueOnPO( pPO2 ) ); if ( i != 0 ) { return mDecending ? -i : i; } return (mSubComparator == null) ? 0 : mSubComparator.LLcompare( pPO1, pPO2 ); } } } |
Commits for litesoft/trunk/Java/core/Server/src/org/litesoft/orsup/base/POOrderBy.java
Revision | Author | Commited | Message |
---|---|---|---|
947 Diff | GeorgeS | Fri 06 Jun, 2014 23:36:56 +0000 | Correct Spelling of package! |
151 Diff | GeorgeS | Thu 17 Mar, 2011 04:16:22 +0000 | |
49 Diff | GeorgeS | Mon 12 Apr, 2010 02:59:10 +0000 | License Text |
24 Diff | GeorgeS | Wed 24 Feb, 2010 01:51:38 +0000 | |
2 | GeorgeS | Sun 07 Feb, 2010 12:50:58 +0000 |