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 / FetchFeatureProviderByReferenceOperation.java @ 44198

History | View | Annotate | Download (4.84 KB)

1

    
2
package org.gvsig.fmap.dal.store.jdbc2.spi.operations;
3

    
4
import java.sql.Connection;
5
import java.sql.PreparedStatement;
6
import java.sql.ResultSet;
7
import java.sql.SQLException;
8
import java.util.ArrayList;
9
import java.util.List;
10
import org.gvsig.expressionevaluator.ExpressionBuilder;
11
import org.gvsig.fmap.dal.exception.DataException;
12
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
13
import org.gvsig.fmap.dal.feature.FeatureType;
14
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
15
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
16
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCSQLException;
17
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
18
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
19
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
20
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
21
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_FEATURE_TYPE;
22
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_TABLE;
23
import org.gvsig.fmap.geom.DataTypes;
24

    
25

    
26
public class FetchFeatureProviderByReferenceOperation extends AbstractConnectionOperation {
27
    private final FeatureType featureType;
28
    private final FeatureReferenceProviderServices reference;
29
    private final TableReference table;
30

    
31
    public FetchFeatureProviderByReferenceOperation(
32
            JDBCHelper helper,
33
            FeatureReferenceProviderServices reference,
34
            FeatureType featureType,
35
            TableReference table
36
        ) {
37
        super(helper);
38
        this.reference = reference;
39
        this.table = table;
40
        this.featureType = featureType;
41
    }
42

    
43
    @Override
44
    public final Object perform(Connection conn) throws DataException {
45
        FeatureProvider feature = fetchFeatureProviderByReference(
46
                conn,
47
                reference, 
48
                featureType,
49
                table
50
        );
51
        return feature;
52
    }
53
       
54
    public FeatureProvider fetchFeatureProviderByReference(
55
            Connection conn,
56
            FeatureReferenceProviderServices reference,
57
            // FeatureType storeType,
58
            FeatureType featureType,
59
            TableReference table
60
        ) throws DataException {
61
        List<FeatureAttributeDescriptor> columns = new ArrayList<>();        
62
        
63
        // FeatureAttributeDescriptor[] primaryKey = storeType.getPrimaryKey();
64
        String[] primaryKeys = reference.getKeyNames();
65
        
66
        JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
67
        ExpressionBuilder expbuilder = sqlbuilder.expression();
68

    
69
        for (FeatureAttributeDescriptor attr : featureType) {
70
            if( attr.getType()==DataTypes.GEOMETRY ) {
71
                sqlbuilder.select().column().name(attr.getName()).as_geometry();
72
                columns.add(attr);
73
            } else {
74
                sqlbuilder.select().column().name(attr.getName());
75
                columns.add(attr);
76
            }
77
        }
78
        sqlbuilder.select().from().table()
79
                .database(this.table.getDatabase())
80
                .schema(this.table.getSchema())
81
                .name(this.table.getTable());
82
        for (String name : primaryKeys )  {
83
            if( !sqlbuilder.select().has_column(name) ) {
84
                sqlbuilder.select().column().name(name);
85
                columns.add(featureType.getAttributeDescriptor(name));
86
            }
87
            Object value = reference.getKeyValue(name);
88
            if( value == null ) {
89
                sqlbuilder.select().where().and(
90
                    expbuilder.is_null(expbuilder.column(name))
91
                );                
92
            } else {
93
                sqlbuilder.select().where().and(
94
                    expbuilder.eq(
95
                        expbuilder.column(name), 
96
                        expbuilder.parameter(name).value(value)
97
                    )
98
                );              
99
            }
100
        }
101
        sqlbuilder.select().limit(1);
102
        sqlbuilder.setProperties(
103
                ExpressionBuilder.Variable.class, 
104
                PROP_FEATURE_TYPE, featureType,
105
                PROP_TABLE, table
106
        );
107
        String sql = sqlbuilder.select().toString();
108

    
109
        PreparedStatement st = null;
110
        ResultSet rs = null;
111
        try {
112
            st = conn.prepareStatement(sql);
113
            sqlbuilder.setParameters(st);
114
            rs = JDBCUtils.executeQuery(st, sql);
115
            if (!rs.next()) {
116
                return null;
117
            }
118
            FeatureProvider data = this.helper.createFeature(featureType);
119
            this.helper.fetchFeature(data, rs, columns.toArray(new FeatureAttributeDescriptor[columns.size()])); 
120
            return data;
121

    
122
        } catch (SQLException ex) {
123
            throw new JDBCSQLException(ex);
124
        } finally {
125
            JDBCUtils.closeQuietly(st);
126
            JDBCUtils.closeQuietly(rs);
127
        }        
128
    }
129
    
130
}