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
125
126
127
128
129
130
131
132
133
134
135
package org.litesoft.boviews.podataproviders.support;

import org.litesoft.bo.*;
import org.litesoft.bo.views.*;
import org.litesoft.core.*;
import org.litesoft.core.simpletypes.*;
import org.litesoft.core.typeutils.*;
import org.litesoft.orsup.base.*;
import org.litesoft.orsup.otherattributeaccessors.*;
import org.litesoft.orsup.selection.*;
import org.litesoft.util.*;

public class WhereClauseSupport
{
    private static final WhereClauseFactory FACTORY = WhereClauseFactory.INSTANCE;

    private Finder mFinder;
    private MetaDataForPO mPoMetaData;
    private DerivedFromAttributeSource mDerivedFromAttributeSource;

    public WhereClauseSupport( Finder pFinder, MetaDataForPO pPoMetaData, DerivedFromAttributeSource pDerivedFromAttributeSource )
    {
        mFinder = pFinder == null ? DataStoreLocator.get().getUnfilteredFinder() : pFinder;
        mPoMetaData = pPoMetaData;
        mDerivedFromAttributeSource = pDerivedFromAttributeSource;
    }

    public WhereClause createWhereClause( SSMap... pORed_ANDFiltersNotNullNotEmpty )
    {
        if ( pORed_ANDFiltersNotNullNotEmpty.length == 0 )
        {
            return FACTORY.alwaysTrue();
        }
        WhereClause zWhereClause = FACTORY.alwaysFalse();
        for ( SSMap zMap : pORed_ANDFiltersNotNullNotEmpty )
        {
            WhereClause zMapWhereClause = createWhereClause( zMap );
            if ( FACTORY.alwaysTrue() == zMapWhereClause )
            {
                return zMapWhereClause;
            }
            zWhereClause = FACTORY.or( zWhereClause, zMapWhereClause );
        }
        return zWhereClause;
    }

    protected WhereClause createWhereClause( SSMap pFilters )
    {
        if ( pFilters instanceof NoRowsMatchingFilterMap )
        {
            return FACTORY.alwaysFalse();
        }
        WhereClause zWhereClause = FACTORY.alwaysTrue();
        if ( (pFilters != null) && !pFilters.isEmpty() )
        {
            boolean zEquals = (pFilters instanceof EqualsMatchingFilterMap);
            for ( String zAttributeName : pFilters.keySet() )
            {
                WhereClause zWhereClauseForAttribute = createWhereClause( zEquals, zAttributeName, pFilters.get( zAttributeName ).trim() );
                if ( zWhereClauseForAttribute == FACTORY.alwaysFalse() )
                {
                    return FACTORY.alwaysFalse();
                }
                zWhereClause = FACTORY.and( zWhereClause, zWhereClauseForAttribute );
            }
        }
        return zWhereClause;
    }

    protected WhereClause createWhereClause( boolean pEquals, String pAttributeName, String pAttributeValue )
    {
        if ( pAttributeValue.length() == 0 )
        {
            return FACTORY.alwaysFalse();
        }
        String zAttributePath = mDerivedFromAttributeSource.getDerivedFromAttributePath( pAttributeName );
        if ( zAttributePath == null )
        {
            return createWhereClauseForNonDerivedAttribute( pEquals, pAttributeName, pAttributeValue );
        }

        AttributeAccessorSCDpath.Node[] zPathNodes = new AttributeAccessorSCDpath( mFinder, mPoMetaData )
        {
            @Override
            protected boolean isAcceptableLeaf( AttributeAccessorSCD pSCD )
            {
                return (pSCD instanceof AttributeAccessorSCDsimplePersistedRegular) || (null != getAcceptableRelationship( pSCD ));
            }
        }.createPath( zAttributePath );
        if ( Objects.isNullOrEmpty( zPathNodes ) )
        {
            return createWhereClauseForUnacceptableAttributePath( pEquals, pAttributeName, pAttributeValue, zAttributePath );
        }
        AttributeAccessorSCD zLastAA = zPathNodes[zPathNodes.length - 1].getAttributeAccessor();
        boolean zIsString = BoAttribute.AttributeType.String.equals( zLastAA.getAMD().getType().getBoAttributeType() );
        if ( zPathNodes.length > 1 )
        {
            throw new NotImplementedYetException( "relationships: " + zAttributePath );
        }

        AttributeAccessorSCD zSCD = zPathNodes[0].getAttributeAccessor();
        if ( !zIsString )
        {
            return createWhereClauseForAttributeTypeNotString( pEquals, pAttributeName, pAttributeValue, zSCD );
        }
        if ( pEquals )
        {
            return FACTORY.isEqual( zSCD, pAttributeValue );
        }
        String[] zParts = Strings.parseChar( pAttributeValue, '*' );
        if ( zParts.length == 1 )
        {
            zParts = Utils.appendString( zParts, "" );
        }
        return FACTORY.like( zSCD, zParts );
    }

    @SuppressWarnings({"UnusedParameters"})
    protected WhereClause createWhereClauseForNonDerivedAttribute( boolean pEquals, String pAttributeName, String pAttributeValue )
    {
        return FACTORY.alwaysFalse();  // todo: Decide what to do about non-dervived attributes
    }

    @SuppressWarnings({"UnusedParameters"})
    protected WhereClause createWhereClauseForUnacceptableAttributePath( boolean pEquals, String pAttributeName, String pAttributeValue, String pAttributePath )
    {
        return FACTORY.alwaysFalse();  // todo: Decide to fix AttributeAccessorSCDpathNode to throw exception or DO NOTHING
    }

    @SuppressWarnings({"UnusedParameters"})
    protected WhereClause createWhereClauseForAttributeTypeNotString( boolean pEquals, String pAttributeName, String pAttributeValue, AttributeAccessorSCD pSCD )
    {
        return FACTORY.isEqual( pSCD, pAttributeValue ); // todo: Form not String?
    }
}

Commits for litesoft/trunk/Java/GWT/Server/src/org/litesoft/boviews/podataproviders/support/WhereClauseSupport.java

Diff revisions: vs.
Revision Author Commited Message
809 Diff Diff GeorgeS picture GeorgeS Thu 16 Aug, 2012 04:10:46 +0000
802 Diff Diff GeorgeS picture GeorgeS Wed 15 Aug, 2012 04:04:47 +0000
486 Diff Diff GeorgeS picture GeorgeS Tue 06 Sep, 2011 03:00:59 +0000
398 GeorgeS picture GeorgeS Mon 15 Aug, 2011 19:57:47 +0000