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

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

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

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

    
65
    @Override
66
    protected Object perform_operation() throws Exception {
67
        ResultSetEntry rs = createResultSet(
68
                database, schema, table, subquery, 
69
                baseFilter, baseOrder, storeType, setType, query, 
70
                limit, offset, fetchSize);
71
        return rs;
72
    }
73
    
74
    @Override
75
    public Object perform(Connection conn) throws DataException {
76
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
77
    }
78
    
79
    public ResultSetEntry createResultSet(
80
            String database,
81
            String schema,
82
            String table,
83
            String subquery,
84
            String baseFilter,
85
            String baseOrder,
86
            FeatureType storeType,
87
            FeatureType setType,
88
            FeatureQuery query,
89
            long limit,
90
            long offset,
91
            int fetchSize
92
        ) throws DataException {
93
        List<FeatureAttributeDescriptor> columns = new ArrayList<>();
94
        
95
        double tolerance = -1 ; //query.getScale();
96
        JDBCSQLBuilderBase sqlbuilder = createSQLBuilder();
97
        
98
        List<String> primaryKeys = new ArrayList<>();
99
        for(FeatureAttributeDescriptor attr : storeType.getPrimaryKey() ) {
100
            primaryKeys.add(attr.getName());
101
        }
102
        for(String attrName : primaryKeys ) {
103
            // Ordenamos siempre por las claves primarias para garantizar 
104
            // un orden predecible. Ademas se precisa indicar un orden para
105
            // usar OFFSET.
106
            sqlbuilder.select().order_by().column(sqlbuilder.identifier(attrName)).ascending();
107
        }
108
        String[] constantsAttributeNames = null;
109
        if(query !=null && query.hasConstantsAttributeNames() ) {
110
            constantsAttributeNames = query.getConstantsAttributeNames();
111
        }
112
        for(FeatureAttributeDescriptor attr : setType ) {
113
            if( ArrayUtils.contains(constantsAttributeNames, attr.getName()) ) {
114
                continue;
115
            }
116
            if( attr.isPrimaryKey() ) {
117
                primaryKeys.remove(attr.getName());
118
            }
119
            if( attr.getType() == DataTypes.GEOMETRY ) {
120
                if( tolerance<=0 || !sqlbuilder.getConfig().has_functionality(Config.ST_Simplify)) {
121
                    sqlbuilder.select().column().name(attr.getName()).as_geometry();
122
                } else {
123
                    sqlbuilder.select().column().value(
124
                        sqlbuilder.ST_Simplify( 
125
                            sqlbuilder.column(attr.getName()),
126
                            sqlbuilder.constant(tolerance)
127
                        )
128
                    ).as_geometry();
129
                }
130
                columns.add(attr);
131
            } else {
132
                sqlbuilder.select().column().name(attr.getName());
133
                columns.add(attr);
134
            }
135
        }
136
        for(String attrName : primaryKeys ) {
137
            sqlbuilder.select().column().name(attrName);
138
            columns.add(setType.getAttributeDescriptor(attrName));
139
        }
140
        
141
        if( StringUtils.isEmpty(subquery)  ) {
142
            sqlbuilder.select().from().table().database(database).schema(schema).name(table);
143
        } else {
144
            sqlbuilder.select().from().subquery(subquery);
145
        }
146
        
147
        Evaluator filter = query.getFilter();
148
        if( filter != null ) {
149
            String sqlfilter = filter.getSQL();
150
            if( ! StringUtils.isEmpty(sqlfilter) ) {
151
                sqlbuilder.select().where().set( sqlbuilder.custom(sqlfilter) );
152
            }
153
        }
154
        if( ! StringUtils.isEmpty(baseFilter) ) {
155
            sqlbuilder.select().where().and(sqlbuilder.custom(baseFilter));
156
        }
157
        
158
        FeatureQueryOrder order = query.getOrder();
159
        if( order != null ) {
160
            for( FeatureQueryOrderMember member : order.members() ) {
161
                if( member.hasEvaluator() ) {
162
                    String sqlorder = member.getEvaluator().getSQL();
163
                    if( ! StringUtils.isEmpty(sqlorder) ) {
164
                        sqlbuilder.select().order_by()
165
                                .custom(sqlorder);
166
                    }
167
                } else {
168
                    
169
                    sqlbuilder.select().order_by()
170
                            .column(member.getAttributeName())
171
                            .ascending(member.getAscending());
172
                }
173
            }
174
        }
175
        if( !StringUtils.isEmpty(baseOrder) ) {
176
            sqlbuilder.select().order_by().custom(baseOrder);
177
        }
178
        
179
        if( limit > 0 ) {
180
            sqlbuilder.select().limit(limit);
181
        } else {
182
            sqlbuilder.select().limit(query.getLimit());
183
        }
184
        if( offset>0 ) {
185
            sqlbuilder.select().offset(offset);
186
        }
187
        
188
        String sql = sqlbuilder.toString();
189
        ResultSetEntry resultSetEntry = this.helper.getResulSetControler().create(
190
                sql, fetchSize, columns.toArray(new FeatureAttributeDescriptor[columns.size()])
191
        );
192
        return resultSetEntry;
193
    }
194

    
195
}