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 @ 43026

History | View | Annotate | Download (5.53 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.List;
6
import org.apache.commons.lang3.StringUtils;
7
import org.gvsig.fmap.dal.exception.DataException;
8
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
9
import org.gvsig.fmap.dal.feature.FeatureQuery;
10
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
11
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
12
import org.gvsig.fmap.dal.feature.FeatureType;
13
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
14
import org.gvsig.fmap.dal.store.jdbc2.ResulSetControler.ResultSetEntry;
15
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
16
import org.gvsig.fmap.geom.DataTypes;
17
import org.gvsig.tools.evaluator.Evaluator;
18

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

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

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

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

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

    
162
}