Subversion Repository Public Repository

litesoft

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
122
123
124
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 );
        }

        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

Diff revisions: vs.
Revision Author Commited Message
2 GeorgeS picture GeorgeS Sun 07 Feb, 2010 12:50:58 +0000