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

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

    
167
}