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 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.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
}