Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.db / org.gvsig.fmap.dal.db.jdbc / src / main / java / org / gvsig / fmap / dal / store / jdbc2 / spi / operations / ResultSetForSetProviderOperation.java @ 43020

History | View | Annotate | Download (5.52 KB)

1
package org.gvsig.fmap.dal.store.jdbc2.spi.operations;
2

    
3
import java.sql.Connection;
4
import java.util.ArrayList;
5
import java.util.Arrays;
6
import java.util.List;
7
import org.apache.commons.lang3.StringUtils;
8
import org.gvsig.fmap.dal.exception.DataException;
9
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
10
import org.gvsig.fmap.dal.feature.FeatureQuery;
11
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
12
import org.gvsig.fmap.dal.feature.FeatureQueryOrderMember;
13
import org.gvsig.fmap.dal.feature.FeatureType;
14
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
15
import org.gvsig.fmap.dal.store.jdbc2.ResulSetControler.ResultSetEntry;
16
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
17
import org.gvsig.fmap.geom.DataTypes;
18
import org.gvsig.tools.evaluator.Evaluator;
19

    
20
public class ResultSetForSetProviderOperation extends AbstractConnectionOperation {
21
    private final String schema;
22
    private final String table;
23
    private final String subquery;
24
    private final String baseFilter;
25
    private final String baseOrder;
26
    private final FeatureType storeType;
27
    private final FeatureType setType;
28
    private final FeatureQuery query;
29
    private final long limit;
30
    private final long offset;
31
    private final int fetchSize;
32
    private final String database;
33

    
34
    public ResultSetForSetProviderOperation(
35
            JDBCHelper helper,
36
            String database,
37
            String schema,
38
            String table,
39
            String subquery,
40
            String baseFilter,
41
            String baseOrder,
42
            FeatureQuery query,
43
            FeatureType storeType,
44
            FeatureType setType,
45
            long limit,
46
            long offset,
47
            int fetchSize
48
        ) {
49
        super(helper);
50
        this.database = database;
51
        this.schema = schema;
52
        this.table = table;
53
        this.subquery = subquery;
54
        this.baseFilter = baseFilter;
55
        this.baseOrder = baseOrder;
56
        this.storeType = storeType;
57
        this.setType = setType;
58
        this.query = query;
59
        this.limit = limit;
60
        this.offset = offset;
61
        this.fetchSize = fetchSize; 
62
    }
63

    
64
    @Override
65
    public final Object perform(Connection conn) throws DataException {
66
        ResultSetEntry rs = createResultSet(
67
                database, schema, table, subquery, 
68
                baseFilter, baseOrder, storeType, setType, query, 
69
                limit, offset, fetchSize);
70
        return rs;
71
    }
72

    
73
    public ResultSetEntry createResultSet(
74
            String database,
75
            String schema,
76
            String table,
77
            String subquery,
78
            String baseFilter,
79
            String baseOrder,
80
            FeatureType storeType,
81
            FeatureType setType,
82
            FeatureQuery query,
83
            long limit,
84
            long offset,
85
            int fetchSize
86
        ) throws DataException {
87
        
88
        JDBCSQLBuilderBase sqlbuilder = createSQLBuilder();
89
        
90
        List<String> primaryKeys = new ArrayList<>();
91
        for(FeatureAttributeDescriptor attr : storeType.getPrimaryKey() ) {
92
            primaryKeys.add(attr.getName());
93
        }
94

    
95
        for(FeatureAttributeDescriptor attr : setType ) {
96
            if( attr.isPrimaryKey() ) {
97
                primaryKeys.remove(attr.getName());
98
            }
99
            if( attr.getType() == DataTypes.GEOMETRY ) {
100
                sqlbuilder.select().column().name(attr.getName()).as_geometry();
101
            } else {
102
                sqlbuilder.select().column().name(attr.getName());
103
            }
104
        }
105
        for(String attrName : primaryKeys ) {
106
            sqlbuilder.select().column().name(attrName);
107
        }
108
        
109
        if( StringUtils.isEmpty(subquery)  ) {
110
            sqlbuilder.select().from().table().database(database).schema(schema).name(table);
111
        } else {
112
            sqlbuilder.select().from().subquery(subquery);
113
        }
114
        
115
        Evaluator filter = query.getFilter();
116
        if( filter != null ) {
117
            String sqlfilter = filter.getSQL();
118
            if( ! StringUtils.isEmpty(sqlfilter) ) {
119
                sqlbuilder.select().where().set( sqlbuilder.custom(sqlfilter) );
120
            }
121
        }
122
        if( ! StringUtils.isEmpty(baseFilter) ) {
123
            sqlbuilder.select().where().and(sqlbuilder.custom(baseFilter));
124
        }
125
        
126
        FeatureQueryOrder order = query.getOrder();
127
        if( order != null ) {
128
            for( FeatureQueryOrderMember member : order ) {
129
                if( member.hasEvaluator() ) {
130
                    String sqlorder = member.getEvaluator().getSQL();
131
                    if( ! StringUtils.isEmpty(sqlorder) ) {
132
                        sqlbuilder.select().order_by()
133
                                .custom(sqlorder);
134
                    }
135
                } else {
136
                    
137
                    sqlbuilder.select().order_by()
138
                            .column(member.getAttributeName())
139
                            .ascending(member.getAscending());
140
                }
141
            }
142
        }
143
        if( !StringUtils.isEmpty(baseOrder) ) {
144
            sqlbuilder.select().order_by().custom(baseOrder);
145
        }
146
        
147
        if( limit > 0 ) {
148
            sqlbuilder.select().limit(limit);
149
        } else {
150
            sqlbuilder.select().limit(query.getLimit());
151
        }
152
        if( offset>0 ) {
153
            sqlbuilder.select().offset(offset);
154
        }
155
        
156
        String sql = sqlbuilder.toString();
157
        ResultSetEntry resultSetEntry = this.helper.getResulSetControler().create(
158
                sql, fetchSize
159
        );
160
        return resultSetEntry;
161
    }
162

    
163
}