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 43020 jjdelcerro
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 43358 jjdelcerro
import org.apache.commons.lang3.ArrayUtils;
7 43020 jjdelcerro
import org.apache.commons.lang3.StringUtils;
8 43355 jjdelcerro
import org.gvsig.fmap.dal.ExpressionBuilder.Config;
9 43020 jjdelcerro
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 43026 jjdelcerro
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
14 43020 jjdelcerro
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 43377 jjdelcerro
    protected Object perform_operation() throws Exception {
67 43020 jjdelcerro
        ResultSetEntry rs = createResultSet(
68
                database, schema, table, subquery,
69
                baseFilter, baseOrder, storeType, setType, query,
70
                limit, offset, fetchSize);
71
        return rs;
72
    }
73 43377 jjdelcerro
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 43020 jjdelcerro
    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 43358 jjdelcerro
        List<FeatureAttributeDescriptor> columns = new ArrayList<>();
94 43020 jjdelcerro
95 43355 jjdelcerro
        double tolerance = -1 ; //query.getScale();
96 43020 jjdelcerro
        JDBCSQLBuilderBase sqlbuilder = createSQLBuilder();
97
98
        List<String> primaryKeys = new ArrayList<>();
99
        for(FeatureAttributeDescriptor attr : storeType.getPrimaryKey() ) {
100
            primaryKeys.add(attr.getName());
101
        }
102 43093 jjdelcerro
        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 43358 jjdelcerro
            sqlbuilder.select().order_by().column(sqlbuilder.identifier(attrName)).ascending();
107 43093 jjdelcerro
        }
108 43358 jjdelcerro
        String[] constantsAttributeNames = null;
109
        if(query !=null && query.hasConstantsAttributeNames() ) {
110
            constantsAttributeNames = query.getConstantsAttributeNames();
111
        }
112 43020 jjdelcerro
        for(FeatureAttributeDescriptor attr : setType ) {
113 43358 jjdelcerro
            if( ArrayUtils.contains(constantsAttributeNames, attr.getName()) ) {
114
                continue;
115
            }
116 43020 jjdelcerro
            if( attr.isPrimaryKey() ) {
117
                primaryKeys.remove(attr.getName());
118
            }
119
            if( attr.getType() == DataTypes.GEOMETRY ) {
120 43355 jjdelcerro
                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 43358 jjdelcerro
                columns.add(attr);
131 43020 jjdelcerro
            } else {
132
                sqlbuilder.select().column().name(attr.getName());
133 43358 jjdelcerro
                columns.add(attr);
134 43020 jjdelcerro
            }
135
        }
136
        for(String attrName : primaryKeys ) {
137
            sqlbuilder.select().column().name(attrName);
138 43358 jjdelcerro
            columns.add(setType.getAttributeDescriptor(attrName));
139 43020 jjdelcerro
        }
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 43026 jjdelcerro
            for( FeatureQueryOrderMember member : order.members() ) {
161 43020 jjdelcerro
                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 43358 jjdelcerro
                sql, fetchSize, columns.toArray(new FeatureAttributeDescriptor[columns.size()])
191 43020 jjdelcerro
        );
192
        return resultSetEntry;
193
    }
194
195
}