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

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

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

    
125
        } catch (SQLException ex) {
126
            throw new JDBCSQLException(ex);
127
        } finally {
128
            JDBCUtils.closeQuietly(st);
129
            JDBCUtils.closeQuietly(rs);
130
        }        
131
    }
132
    
133
}