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

History | View | Annotate | Download (4.39 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.fmap.dal.exception.DataException;
11
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
12
import org.gvsig.fmap.dal.feature.FeatureType;
13
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
14
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
15
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCSQLException;
16
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
17
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
18
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory.TableReference;
19
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
20
import org.gvsig.fmap.geom.DataTypes;
21

    
22

    
23
public class FetchFeatureProviderByReferenceOperation extends AbstractConnectionOperation {
24
    private final FeatureType featureType;
25
    private final FeatureReferenceProviderServices reference;
26
    private final TableReference table;
27

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

    
40
    @Override
41
    public final Object perform(Connection conn) throws DataException {
42
        FeatureProvider feature = fetchFeatureProviderByReference(
43
                conn,
44
                reference, 
45
                featureType,
46
                table
47
        );
48
        return feature;
49
    }
50
       
51
    public FeatureProvider fetchFeatureProviderByReference(
52
            Connection conn,
53
            FeatureReferenceProviderServices reference,
54
            // FeatureType storeType,
55
            FeatureType featureType,
56
            TableReference table
57
        ) throws DataException {
58
        List<FeatureAttributeDescriptor> columns = new ArrayList<>();        
59
        
60
        // FeatureAttributeDescriptor[] primaryKey = storeType.getPrimaryKey();
61
        String[] primaryKeys = reference.getKeyNames();
62
        
63
        JDBCSQLBuilderBase sqlbuilder = this.createSQLBuilder();
64
        
65
        for (FeatureAttributeDescriptor attr : featureType) {
66
            if( attr.getType()==DataTypes.GEOMETRY ) {
67
                sqlbuilder.select().column().name(attr.getName()).as_geometry();
68
                columns.add(attr);
69
            } else {
70
                sqlbuilder.select().column().name(attr.getName());
71
                columns.add(attr);
72
            }
73
        }
74
        sqlbuilder.select().from().table()
75
                .database(this.table.getDatabase())
76
                .schema(this.table.getSchema())
77
                .name(this.table.getTable());
78
        for (String name : primaryKeys )  {
79
            if( !sqlbuilder.select().has_column(name) ) {
80
                sqlbuilder.select().column().name(name);
81
                columns.add(featureType.getAttributeDescriptor(name));
82
            }
83
            Object value = reference.getKeyValue(name);
84
            if( value == null ) {
85
                sqlbuilder.select().where().and(
86
                    sqlbuilder.isNull(sqlbuilder.column(name))
87
                );                
88
            } else {
89
                sqlbuilder.select().where().and(
90
                    sqlbuilder.eq(
91
                        sqlbuilder.column(name), 
92
                        sqlbuilder.parameter(name).value(value)
93
                    )
94
                );              
95
            }
96
        }
97
        sqlbuilder.select().limit(1);
98

    
99
        String sql = sqlbuilder.select().toString();
100

    
101
        PreparedStatement st = null;
102
        ResultSet rs = null;
103
        try {
104
            st = conn.prepareStatement(sql);
105
            sqlbuilder.setParameters(st);
106
            rs = JDBCUtils.executeQuery(st, sql);
107
            if (!rs.next()) {
108
                return null;
109
            }
110
            FeatureProvider data = this.helper.createFeature(featureType);
111
            this.helper.fetchFeature(data, rs, columns.toArray(new FeatureAttributeDescriptor[columns.size()])); 
112
            return data;
113

    
114
        } catch (SQLException ex) {
115
            throw new JDBCSQLException(ex);
116
        } finally {
117
            JDBCUtils.closeQuietly(st);
118
            JDBCUtils.closeQuietly(rs);
119
        }        
120
    }
121
    
122
}