Revision 46050 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

View differences:

ResultSetForSetProviderOperation.java
52 52
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase;
53 53
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_FEATURE_TYPE;
54 54
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_JDBCHELPER;
55
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_QUERY;
55 56
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_SYMBOLTABLE;
56 57
import static org.gvsig.fmap.dal.store.jdbc2.spi.JDBCSQLBuilderBase.PROP_TABLE;
57 58
import org.gvsig.fmap.geom.DataTypes;
58 59
import org.gvsig.tools.dynobject.DynField;
59 60
import org.gvsig.tools.evaluator.Evaluator;
61
import org.gvsig.tools.util.ContainerUtils;
60 62

  
61 63
public class ResultSetForSetProviderOperation extends AbstractConnectionOperation {
62 64

  
......
117 119
            List<FeatureAttributeDescriptor> columns,
118 120
            List<String> extraColumnNames
119 121
    ) {
120
        double tolerance = -1; //query.getScale();
122
        double tolerance = -1; //query.getScale(); 
121 123
        ExpressionBuilder expbuilder = sqlbuilder.expression();
122 124
        SelectBuilder select = sqlbuilder.select();
123 125

  
......
141 143
        if (query != null && query.hasConstantsAttributeNames()) {
142 144
            constantsAttributeNames = query.getConstantsAttributeNames();
143 145
        }
146
        ArrayList<ExpressionBuilder.Value> valuesToRemoveFeatureType = new ArrayList<>();
144 147
        for (FeatureAttributeDescriptor attr : setType) {
145 148
            if (attr.isComputed()) {
146
//              if(StringUtils.isNotBlank(System.getenv("ENABLE_COMPUTED_SQL_ATTR"))) {
149
//              if(StringUtils.isNotBlank(System.getenv("ENABLE_COMPUTED_SQL_ATTR"))) { 
147 150
                if (attr.getRelationType() == DynField.RELATION_TYPE_NONE) {
148 151
                    FeatureAttributeEmulator attrEmulator = attr.getFeatureAttributeEmulator();
149 152
                    if (attrEmulator instanceof FeatureAttributeEmulatorExpression) {
150 153
                        FeatureAttributeEmulatorExpression x = (FeatureAttributeEmulatorExpression) attrEmulator;
151 154
                        Expression exp = x.getExpression();
152
                        if (exp != null && !exp.isEmpty() && this.helper.supportExpression(setType, exp.getPhrase())) {
153
                            Code code = exp.getCode();
154
                            select.column()
155
                                    .value(code.toValue(expbuilder))
156
                                    .as(attr.getName());
157
                            if (!extraColumnNames.contains(attr.getName())) {
158
                                extraColumnNames.add(attr.getName());
155

  
156
                        if (query != null && query.hasGroupByColumns()) {
157
                            String aggregate = query.getAggregate(this.table.getTable(), attr.getName());
158
                            if (this.query.isAGroupByColumn(attr.getName())) {
159
                                if (!select.has_column(attr.getName())) {
160
                                    select.column().value(exp.getCode().toValue()).as(attr.getName());
161
                                }
162
                                if (extraColumnNames != null && !extraColumnNames.contains(attr.getName())) {
163
                                    extraColumnNames.add(attr.getName());
164
                                }
165
                            } else if (aggregate == null) {
166
                                select.column().value(expbuilder.constant(null)).as(attr.getName());
167
                            } else {
168
                                String fn = this.query.getAggregateFunctions().get(attr.getName());
169
                                ExpressionBuilder.Function aggregateExp = expbuilder.function(fn, exp.getCode().toValue());
170
                                if (!select.has_column(attr.getName())) {
171
                                    select.column().value(aggregateExp).as(attr.getName());
172
                                }
173
                                if (extraColumnNames != null && !extraColumnNames.contains(attr.getName())) {
174
                                    extraColumnNames.add(attr.getName());
175
                                }
159 176
                            }
177
                        } else {
178
                            if (exp != null && !exp.isEmpty() && this.helper.supportExpression(setType, exp.getPhrase())) {
179
                                Code code = exp.getCode();
180
                                select.column()
181
                                        .value(code.toValue(expbuilder))
182
                                        .as(attr.getName());
183
                                if (extraColumnNames != null && !extraColumnNames.contains(attr.getName())) {
184
                                    extraColumnNames.add(attr.getName());
185
                                }
186
                            }
187

  
160 188
                        }
161 189
                    }
162 190
                }
......
209 237
                    if (!select.has_column(attr.getName())) {
210 238
                        select.column().value(aggregateExp).as(attr.getName());
211 239
                    }
212
                    if (!extraColumnNames.contains(attr.getName())) {
240
                    if (extraColumnNames!=null && !extraColumnNames.contains(attr.getName())) {
213 241
                        extraColumnNames.add(attr.getName());
214 242
                    }
215 243
                }
......
217 245
            for (String attrName : query.getGroupByColumns()) {
218 246
                if (allExtraColumns.get(attrName) != null) { //from setType and query
219 247
                    EditableFeatureAttributeDescriptor attr = allExtraColumns.get(attrName);
220
                    select.group_by(expbuilder.column(attrName));
248
                    ExpressionBuilder.Variable col = expbuilder.column(attrName);
249
                    select.group_by(col);
250
                    // En el groupBy no queremos que se sustituya el nombre del campo calculado
251
                    // por su expresion. Se encarga el formater y lo evitamos quitandole el ftype
252
                    // al value.
253
                    valuesToRemoveFeatureType.add(col);
221 254
                    Expression exp = ((FeatureAttributeEmulatorExpression) attr.getFeatureAttributeEmulator()).getExpression();
222 255
                    if (!select.has_column(attrName)) {
223 256
                        select.column().value(exp.getCode().toValue()).as(attrName);
224 257
                    }
225
                    if (!extraColumnNames.contains(attr.getName())) {
258
                    if (extraColumnNames!=null && !extraColumnNames.contains(attr.getName())) {
226 259
                        extraColumnNames.add(attrName);
227 260
                    }
228 261
                } else if (setType.get(attrName) != null && setType.getAttributeDescriptor(attrName).isComputed()) {
229 262
                    FeatureAttributeDescriptor attr = setType.getAttributeDescriptor(attrName);
230
                    select.group_by(expbuilder.column(attrName));
263
                    ExpressionBuilder.Variable col = expbuilder.column(attrName);
264
                    select.group_by(col);
265
                    valuesToRemoveFeatureType.add(col);
231 266
                    Expression exp = ((FeatureAttributeEmulatorExpression) attr.getFeatureAttributeEmulator()).getExpression();
232 267
                    if (!select.has_column(attrName)) {
233 268
                        select.column().value(exp.getCode().toValue()).as(attrName);
234 269
                    }
235
                    if (!extraColumnNames.contains(attr.getName())) {
270
                    if (extraColumnNames!=null && !extraColumnNames.contains(attr.getName())) {
236 271
                        extraColumnNames.add(attrName);
237 272
                    }
238 273
                } else if (setType.get(attrName) == null) {
......
268 303
                                select.column()
269 304
                                        .value(code.toValue(expbuilder))
270 305
                                        .as(attr.getName());
271
                                if (!extraColumnNames.contains(attr.getName())) {
306
                                if (extraColumnNames!=null && !extraColumnNames.contains(attr.getName())) {
272 307
                                    extraColumnNames.add(attr.getName());
273 308
                                }
274 309
                            }
......
312 347
                        if (!select.has_column(attrName)) {
313 348
                            select.column().value(exp.getCode().toValue()).as(attrName);
314 349
                        }
315
                        if (!extraColumnNames.contains(attrName)) {
350
                        if (extraColumnNames!=null && !extraColumnNames.contains(attrName)) {
316 351
                            extraColumnNames.add(attrName);
317 352
                        }
318 353
                    } else if (setType.get(attrName) != null && setType.getAttributeDescriptor(attrName).isComputed()) {
......
320 355
                        if (!select.has_column(attrName)) {
321 356
                            select.column().value(exp.getCode().toValue()).as(attrName);
322 357
                        }
323
                        if (!extraColumnNames.contains(attrName)) {
358
                        if (extraColumnNames!=null && !extraColumnNames.contains(attrName)) {
324 359
                            extraColumnNames.add(attrName);
325 360
                        }
326 361
                    }
......
386 421
                PROP_FEATURE_TYPE, this.storeType,
387 422
                PROP_TABLE, table,
388 423
                PROP_SYMBOLTABLE, this.query==null? null:this.query.getSymbolTable(),
389
                PROP_JDBCHELPER, this.helper
424
                PROP_JDBCHELPER, this.helper,
425
                PROP_QUERY, this.query
390 426
        );
427
        for (ExpressionBuilder.Value value : valuesToRemoveFeatureType) {
428
            value.setProperty(PROP_FEATURE_TYPE, null);
429
        }
391 430
        this.helper.processSpecialFunctions(sqlbuilder, storeType, extraColumnNames);
392 431
        String sql = sqlbuilder.toString();
393 432
        return sql;

Also available in: Unified diff