Revision 45166

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultCodeBuilder.java
335 335
        @Override
336 336
        public void accept(Visitor visitor) throws BaseException {
337 337
            for( Code arg : this.codes ) {
338
                arg.accept(visitor);
338
                if(arg!=null) {
339
                    arg.accept(visitor);
340
                }
339 341
            }
340 342
        }
341 343

  
......
493 495
                    ExpressionBuilder.Function f = builder.function(this.name());
494 496
                    if( this.parameters()!=null ) {
495 497
                        for (Code parameter : this.parameters()) {
496
                            f.parameter(parameter.toValue(builder));
498
                            if (parameter==null) { 
499
                                f.parameter(null);
500
                            } else {
501
                                f.parameter(parameter.toValue(builder));
502
                            }
497 503
                        }  
498 504
                    }
499 505
                    return f;
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultOptimizer.java
169 169
    }
170 170

  
171 171
    private Code doOptimize(Code code) {
172
        if (code==null) {
173
            return null;
174
        }
172 175
        switch (code.code()) {
173 176
            case Code.CALLABLE:
174 177
                Callable caller = (Callable) code;
......
216 219
                                Codes parameters = caller.parameters();
217 220
                                for (int i = 0; i < parameters.size(); i++) {
218 221
                                    Code arg = parameters.get(i);
219
                                    Code newArg = this.doOptimize(arg);
220
                                    newArgs.add(newArg);
221
                                    if (newArg.code() != Code.CONSTANT) {
222
                                        canOptimize = false;
222
                                    if (arg==null) {
223
                                         newArgs.add(null);
224
                                    } else {
225
                                        Code newArg = this.doOptimize(arg);
226
                                        newArgs.add(newArg);
227
                                        if (newArg.code() != Code.CONSTANT) {
228
                                            canOptimize = false;
229
                                        }
223 230
                                    }
224 231
                                }
225 232
                            }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.api/src/main/java/org/gvsig/fmap/dal/swing/featuretype/FeatureAttributesSelectionPanel.java
29 29
    public FeatureType getFeatureType();
30 30
    
31 31
    public void setExtraColumns(List<EditableFeatureAttributeDescriptor> extraColumns);
32
    
33
    public void allowCalculatedAttributes(boolean allowCalculated);
32 34
        
33 35
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.api/src/main/java/org/gvsig/fmap/dal/swing/featurequery/FeatureQueryCalculatedColumnsPanel.java
22 22
  public FeatureQuery fetch();
23 23

  
24 24
  public void put(FeatureQuery query);
25

  
25
  
26 26
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/fmap/dal/swing/impl/featurequery/DefaultFeatureQueryGroupByPanel.java
17 17
import javax.swing.event.ListSelectionEvent;
18 18
import org.apache.commons.io.FilenameUtils;
19 19
import org.apache.commons.lang3.StringUtils;
20
import org.gvsig.expressionevaluator.Code;
21
import org.gvsig.expressionevaluator.ExpressionBuilder;
22
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_LET;
23 20
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
24 21
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
25
import org.gvsig.expressionevaluator.ExpressionUtils;
26
import org.gvsig.expressionevaluator.Formatter;
27 22
import org.gvsig.expressionevaluator.Function;
28 23
import org.gvsig.expressionevaluator.SymbolTable;
29 24
import org.gvsig.expressionevaluator.SymbolTableFactory;
30
import org.gvsig.fmap.dal.DALLocator;
31 25
import org.gvsig.fmap.dal.exception.DataException;
32 26
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
33 27
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
......
43 37
import org.gvsig.tools.swing.api.ToolsSwingManager;
44 38
import org.gvsig.tools.swing.icontheme.IconTheme;
45 39
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryGroupByPanel;
46
import org.gvsig.tools.dataTypes.DataTypes;
47 40
import org.gvsig.tools.swing.api.FilteredListModel;
48 41

  
49 42
/**
......
120 113
    
121 114
    toolsSwingManager.translate(this.btnAttributesFilter);
122 115
    toolsSwingManager.translate(this.tabGroup);
123
    
116
        
124 117
    this.groupByPanel = new DefaultFeatureAttributesSelectionPanel();
125 118
    this.groupByPanel.allowCalculatedAttributes(true);
126 119

  
......
215 208
    for (FeatureAttributeDescriptor attr : featureType) {
216 209
        model.addElement(attr);
217 210
    }
211
    for (FeatureAttributeDescriptor attr : featureType.getExtraColumns().getColumns()) {
212
        model.addElement(attr);
213
    }
214
    for (EditableFeatureAttributeDescriptor attr : query.getExtraColumn().getColumns()) {
215
        model.addElement(attr);
216
    }
218 217
    model.setFilter(this.txtAttributesFilter.getText());
219 218
    model.sort(true);
220 219
    this.lstAttributes.setModel(model);
......
235 234
    query.getGroupByColumns().addAll(this.groupByPanel.getSelectedNames());
236 235
    query.getAggregateFunctions().clear();
237 236
    query.getAggregateFunctions().putAll(this.query.getAggregateFunctions());
238
    
239
    List<String> selectedNames = this.groupByPanel.getSelectedNames();
240
      for (String selectedName : selectedNames) {
241
          if (this.featureType.getAttributeDescriptor(selectedName) == null) {
242
              try {
243
                  Code selectedNameCode = ExpressionUtils.compile(selectedName);
244
                  if (selectedNameCode.code() == Code.CALLABLE) {
245
                      Code.Callable callable = (Code.Callable) selectedNameCode;
246
                      if (callable.name().equalsIgnoreCase(FUNCTION_LET)) {
247
                          String exp = callable.parameters().get(1).toString();
248
                          String attrNameInExpression = (String) ((ExpressionBuilder.Constant) callable.parameters().get(0).toValue()).value();
249
                          if (query.getExtraColumn().get(attrNameInExpression)!=null) {
250
                              query.getExtraColumn().remove(attrNameInExpression);
251
                          }
252
                          EditableFeatureAttributeDescriptor newExtraColumn = query.getExtraColumn().add(attrNameInExpression);
253
                          newExtraColumn.setDataType(DataTypes.STRING);
254
                          newExtraColumn.setSize(newExtraColumn.getDataType().getDefaultSize());
255
                          newExtraColumn.setFeatureAttributeEmulator(
256
                                  "current_row().getExtraValue('"+attrNameInExpression+"')");
257
                          //a?adirlo a las de visualizar 
258
                      }
259
                  }
260
              } catch (Exception ex) {
261
                  throw new RuntimeException("Not able to create column by expression in groupby query", ex);
262
              }
263
          }
264
      }
265
      
266 237
            
267 238
    return query;
268 239
  }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/fmap/dal/swing/impl/featurequery/DefaultFeatureQueryCalculatedColumnsPanel.java
62 62
public class DefaultFeatureQueryCalculatedColumnsPanel
63 63
        extends DefaultFeatureQueryCalculatedColumnsPanelView
64 64
        implements FeatureQueryCalculatedColumnsPanel {
65
    
66
    private class AttributeListElement extends ListElement {
67
        
68
        public AttributeListElement(FeatureAttributeDescriptor value) {
69
            super(value.getLabel(), value);
70
        }
71
        
72
        @Override
73
        public String getLabel() {
74
            return ((FeatureAttributeDescriptor) this.getValue()).getName();
75
        }
76
        
77
    }
65 78

  
66 79
    private class ColumnController implements DocumentListener, ChangeListener, ActionListener {
67 80

  
......
80 93
        private final JTextComponent txtScale;
81 94
        
82 95
        private final Logger LOGGER = LoggerFactory.getLogger(ColumnController.class);
96
        private final JButton btnColumnMore;
97
        private final JButton btnApplyChanges;
83 98

  
84 99
        public ColumnController(
85 100
                JTextComponent txtName,
......
91 106
                JButton btnExpressionBookmarks,
92 107
                JTextComponent txtSize,
93 108
                JTextComponent txtPrecision,
94
                JTextComponent txtScale
109
                JTextComponent txtScale,
110
                JButton btnApplyChanges,
111
                JButton btnColumnMore
95 112
        ) {
96 113
            this.txtName = txtName;
97 114
            this.cboDataType = cboDataType;
......
103 120
            this.txtSize = txtSize;
104 121
            this.txtPrecision = txtPrecision;
105 122
            this.txtScale = txtScale;
123
            this.btnApplyChanges = btnApplyChanges;
124
            this.btnColumnMore = btnColumnMore;
106 125
            this.hasChanges = false;
107 126
            this.initComponents();
108 127
            this.setEnabled(false);
......
184 203
            this.txtSize.setEnabled(enabled);
185 204
            this.txtPrecision.setEnabled(enabled);
186 205
            this.txtScale.setEnabled(enabled);
206
            this.btnApplyChanges.setEnabled(enabled);
207
            this.btnColumnMore.setEnabled(enabled);
187 208
        }
188 209

  
189 210
        public void clean() {
......
193 214
            this.txtSize.setText("");
194 215
            this.txtPrecision.setText("");
195 216
            this.txtScale.setText("");
217
            this.btnApplyChanges.setEnabled(false);
218
            this.btnColumnMore.setEnabled(false);
219
            this.hasChanges = false;
196 220

  
197 221
        }
198 222

  
......
230 254
                }
231 255
            }
232 256
//            doEnabledByDataType();
257
            this.btnColumnMore.setEnabled(true);
258
            this.btnApplyChanges.setEnabled(false);
233 259
            this.hasChanges = false;
234 260
        }
235 261

  
......
260 286
                LOGGER.warn("Not able to coerce text to integer from scale box.", ex);
261 287
            }
262 288
            this.hasChanges = false;
289
            this.btnColumnMore.setEnabled(true);
290
            this.btnApplyChanges.setEnabled(false);
263 291
            return attr;
264 292
        }
265 293

  
266 294
        private void doHasChanges() {
295
            this.btnApplyChanges.setEnabled(true);
267 296
            this.hasChanges = true;
268 297
        }
269 298

  
......
374 403
                this.btnColumnExpressionBookmarks,
375 404
                this.txtColumnSize,
376 405
                this.txtColumnPrecision,
377
                this.txtColumnScale
406
                this.txtColumnScale,
407
                this.btnApplyChanges,
408
                this.btnColumnMore
378 409
        );
379 410
//        this.lstAttributes.setCellRenderer(new FeatureAttributeListCellRenderer());
380 411

  
......
411 442
        });
412 443

  
413 444
        this.btnAdd.addActionListener((ActionEvent e) -> {
414
            doAdd();
445
            if (checkColumnControllerHasChangesWithUser()) {
446
                doAdd();
447
            }
415 448
        });
416 449

  
417 450
        this.btnRemove.addActionListener((ActionEvent e) -> {
......
433 466
        this.btnColumnMore.addActionListener((ActionEvent e) -> {
434 467
            doColumnMore();
435 468
        });
436

  
469
        
437 470
    }
438 471

  
439 472
    private boolean checkColumnControllerHasChangesWithUser() {
440
        if (columnController.hasChanges()) {
473
        if (this.hasChanges()) {
441 474
            I18nManager i18n = ToolsLocator.getI18nManager();
442 475
            String message = i18n.getTranslation("_Changes_has_not_been_saved_Are_you_sure_you_want_to_continue");
443 476
            String title = i18n.getTranslation("_Changes_not_saved");
......
532 565

  
533 566
    @Override
534 567
    public FeatureQuery fetch(FeatureQuery query) {
568
        if (hasChanges()) {
569
            I18nManager i18n = ToolsLocator.getI18nManager();
570
            String message = i18n.getTranslation("_Changes_has_not_been_saved_Do_you_want_to_save_them_before_continue");
571
            String title = i18n.getTranslation("_Changes_not_saved");
572
            int r = ToolsSwingLocator.getThreadSafeDialogsManager().confirmDialog(message, title,
573
                    JOptionPane.YES_NO_OPTION,
574
                    JOptionPane.QUESTION_MESSAGE);
575
            if (r == JOptionPane.YES_NO_OPTION) {
576
                doApplyChanges();
577
            }
578
        }
579
        
535 580
        if (query == null) {
536 581
            return this.query.getCopy();
537 582
        }
......
564 609
            return;
565 610
        }
566 611
        for (EditableFeatureAttributeDescriptor col : cols) {
567
            ListElement lf = new ListElement(col.getLabel(), col);
612
            ListElement lf = new AttributeListElement(col);
568 613
            this.lstAttributesModel.addElement(lf);
569 614
        }
570 615
        if (this.lstAttributesModel.getSize() > 0) {
......
604 649
        this.columnController.put(newAttr);
605 650
        this.columnController.setEnabled(true);
606 651

  
607
        this.lstAttributesModel.addElement(new ListElement(newAttr.getName(), newAttr));
652
        this.lstAttributesModel.addElement(new AttributeListElement(newAttr));
608 653
        ListElement.setSelected(this.lstAttributes, newAttr);
654
        this.lstAttributes.revalidate();
655
        this.lstAttributes.repaint();
609 656
        this.actualEditableAttribute = newAttr;
610 657

  
611 658
    }
......
647 694
    private void doApplyChanges() {
648 695
        this.columnController.fetch(this.actualEditableAttribute);
649 696
        this.lstAttributes.invalidate();
697
        this.lstAttributes.repaint();
650 698
    }
651 699

  
652 700
    private void doUp(JList lstColumns) {
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/fmap/dal/swing/impl/searchpanel/DefaultSearchPanel.java
8 8
import java.awt.event.ActionListener;
9 9
import java.awt.event.ComponentAdapter;
10 10
import java.awt.event.ComponentEvent;
11
import java.awt.event.ComponentListener;
12 11
import java.net.URL;
13 12
import java.text.DateFormat;
14 13
import java.text.SimpleDateFormat;
......
49 48
import org.gvsig.fmap.dal.DataStore;
50 49
import org.gvsig.fmap.dal.DataStoreProviderFactory;
51 50
import org.gvsig.fmap.dal.complements.Search;
52
import org.gvsig.fmap.dal.exception.DataException;
53 51
import org.gvsig.fmap.dal.feature.Feature;
54 52
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
55 53
import org.gvsig.fmap.dal.feature.FeatureQuery;
......
647 645
            );
648 646
            return;
649 647
        }
650
        lblMsg.setText("Searching...");
648
        lblMsg.setText(ToolsLocator.getI18nManager().getTranslation("_Searching")+"...");
651 649
        setEnabled(false);
652 650
        Thread th = new Thread(() -> {
653 651
                FeatureQuery myQuery = null;
......
969 967
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
970 968
        I18nManager i18n = ToolsLocator.getI18nManager();
971 969
        final FeatureAttributesSelectionPanel panel = DALSwingLocator.getManager().createFeatureAttributeSelectionPanel();
970
        panel.allowCalculatedAttributes(false);
972 971
        FeatureType ftype = this.getFeatureType();
973 972
        try {
974 973
          Feature f = store.findFirst(this.parameters.getQuery());
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/fmap/dal/swing/impl/featuretype/DefaultFeatureAttributesSelectionPanel.java
46 46
    private FilteredListController availableFieldsController;
47 47
    private final List<String> selecteds;
48 48
    private ExpressionPickerController expressionPicker = null;
49
    private boolean allowCalculatedAttributes;
49
    private boolean allowCalculatedAttributes = false;
50 50
    private List<EditableFeatureAttributeDescriptor> extraColumns;
51 51
    
52 52
    public DefaultFeatureAttributesSelectionPanel() {
......
175 175
            return;
176 176
        }
177 177
        int n = this.selecteds.indexOf(attr.getLabel());
178
        if( n<1 || n>=this.selecteds.size()-1 ) {
178
        if( n<0 || n>=this.selecteds.size()-1 ) {
179 179
          return;
180 180
        }
181 181
        Collections.swap(selecteds, n, n+1);
......
197 197
                }
198 198
            }
199 199
        }
200
        if (this.extraColumns!=null && !extraColumns.isEmpty()) {
201
            for (EditableFeatureAttributeDescriptor extraCol : extraColumns) {
202
                if(extraCol.getName().equalsIgnoreCase(myAttr)) {
203
                    return true;
204
                }
205
            }
206
        }
207
        
200 208
        return false;
201 209
    }
202 210

  
......
342 350
        
343 351
        if (this.extraColumns!=null && !this.extraColumns.isEmpty()) {
344 352
            for (FeatureAttributeDescriptor extraCol : this.extraColumns) {
345
                if( !this.extraColumns.contains(extraCol.getName()) ) {
353
                if( !this.selecteds.contains(extraCol.getName()) ) {
346 354
                    modelAvailables.addElement(extraCol.getName());
347 355
                }
348 356
            }
......
409 417
            theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
410 418
        }
411 419
    }
412

  
413
    public void allowCalculatedAttributes(boolean b) {
414
        this.allowCalculatedAttributes = b;
420
    
421
    @Override
422
    public void allowCalculatedAttributes(boolean allowCalculatedAttributes) {
423
        this.allowCalculatedAttributes = allowCalculatedAttributes;
424
        this.btnBookmarks.setVisible(this.allowCalculatedAttributes);
425
        this.btnHistory.setVisible(this.allowCalculatedAttributes);
426
        this.btnExpression.setVisible(this.allowCalculatedAttributes);
427
        this.txtExpression.setVisible(this.allowCalculatedAttributes);
415 428
    }
416 429
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/SQLBuilderBase.java
769 769

  
770 770
        @Override
771 771
        public String getName() {
772
            if (this.name==null) {
773
                return null;
774
            }
772 775
            return this.name.name();
773 776
        }
774 777

  
......
1033 1036
        @Override
1034 1037
        public boolean has_column(String name) {
1035 1038
            for (SelectColumnBuilder column : columns) {
1036
                if (name.equals(column.getName())) {
1039
                if (StringUtils.equals(name, column.getName())) {
1037 1040
                    return true;
1038 1041
                }
1042
                if (StringUtils.equals(name, column.getAlias())) {
1043
                    return true;
1044
                }
1039 1045
            }
1040 1046
            return false;
1041 1047
        }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.h2/src/test/resources/org/gvsig/fmap/dal/store/h2/count.sql
7 7
  FROM ( 
8 8
    SELECT COUNT(*) 
9 9
    FROM "PUBLIC"."test" 
10
    GROUP BY "Long" 
11
    ORDER BY "Long" ASC
10
    GROUP BY "Long"
12 11
  ) as _subquery_alias_ ;
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/CountOperation.java
109 109
                subselect.where().and(expbuilder.toValue(baseFilter));
110 110
            }
111 111

  
112
            FeatureQueryOrder order = query == null ? null : query.getOrder();
113
            if (order != null) {
114
                for (FeatureQueryOrder.FeatureQueryOrderMember member : order.members()) {
115
                    if (member.hasEvaluator()) {
116
                        String sqlorder = member.getEvaluator().getSQL();
117
                        if (!StringUtils.isEmpty(sqlorder)) {
118
                            subselect.order_by().custom(sqlorder);
119
                        }
120
                    } else {
121
                        subselect.order_by()
122
                                .column(member.getAttributeName())
123
                                .ascending(member.getAscending());
124
                    }
125
                }
126
            }
127 112

  
128 113
            List<String> groupbyColumns = query == null ? null : query.getGroupByColumns();
129 114
            if (groupbyColumns != null && !groupbyColumns.isEmpty()) {
......
139 124
                        try {
140 125
                            try {
141 126
                                Code groupByColumnCode = ExpressionUtils.compile(columnName);
142
                                if (groupByColumnCode.code() == Code.CALLABLE) {
143
                                    Code.Callable callable = (Code.Callable) groupByColumnCode;
144
                                    if (callable.name().equalsIgnoreCase(FUNCTION_LET)) {
145
                                        Code exp = callable.parameters().get(1);
146
                                        Code name = callable.parameters().get(0);
147
                                        subselect.column().value(exp.toValue())
148
                                                .as((String) ((Code.Constant) name).value());
149
                                        // nombre que se pone en la parte del groupby debe de ser el nombre de la var del set
150
                                        groupByColumnCode = exp; 
151
                                    }
152
                                }
127
//                                if (groupByColumnCode.code() == Code.CALLABLE) {
128
//                                    Code.Callable callable = (Code.Callable) groupByColumnCode;
129
//                                    if (callable.name().equalsIgnoreCase(FUNCTION_LET)) {
130
//                                        Code exp = callable.parameters().get(1);
131
//                                        Code name = callable.parameters().get(0);
132
//                                        subselect.column().value(exp.toValue())
133
//                                                .as((String) ((Code.Constant) name).value());
134
//                                        // nombre que se pone en la parte del groupby debe de ser el nombre de la var del set
135
//                                        groupByColumnCode = exp; 
136
//                                    }
137
//                                }
153 138
                                subselect.group_by(groupByColumnCode.toValue());
154 139
                            } catch (Exception ex) {
155 140
                                throw new RuntimeException("Not able to create column by expression in groupby query", ex);
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
26 26
import java.sql.Connection;
27 27
import java.util.ArrayList;
28 28
import java.util.List;
29
import java.util.Map;
29 30
import org.apache.commons.lang3.ArrayUtils;
30 31
import org.apache.commons.lang3.StringUtils;
31 32
import org.gvsig.expressionevaluator.Code;
32 33
import org.gvsig.expressionevaluator.Expression;
33 34
import org.gvsig.expressionevaluator.ExpressionBuilder;
34
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_LET;
35 35
import org.gvsig.expressionevaluator.ExpressionUtils;
36 36
import org.gvsig.fmap.dal.SQLBuilder.SelectBuilder;
37 37
import org.gvsig.fmap.dal.exception.DataException;
......
165 165
        }
166 166
       
167 167
       if( query !=null && query.hasGroupByColumns() ) {
168
            for (Map.Entry<String, String> entry : query.getAggregateFunctions().entrySet()) {
169
                 EditableFeatureAttributeDescriptor attr = query.getExtraColumn().get(entry.getKey());
170
               if( attr!=null ) {
171
                    Expression exp = ((FeatureAttributeEmulatorExpression) attr.getFeatureAttributeEmulator()).getExpression();
172
                    ExpressionBuilder.Function aggregateExp = expbuilder.function(entry.getValue(),exp.getCode().toValue());
173
                    if (!select.has_column(attr.getName())) {
174
                        select.column().value(aggregateExp).as(attr.getName());
175
                    }
176
                    if (!extraColumnNames.contains(attr.getName())) {
177
                        extraColumnNames.add(attr.getName());
178
                    }
179
               }
180
            }
168 181
            for(String attrName : query.getGroupByColumns() ) {
169 182
                if (this.setType.getExtraColumns().get(attrName) != null) {
170 183
                    EditableFeatureAttributeDescriptor attr = this.setType.getExtraColumns().get(attrName);
171 184
                    select.group_by(expbuilder.column(attrName));
172 185
                    Expression exp = ((FeatureAttributeEmulatorExpression) attr.getFeatureAttributeEmulator()).getExpression();
173
                    select.column().value(exp.getCode().toValue()).as(attrName);
174
                    extraColumnNames.add(attrName);
186
                    if (!select.has_column(attrName)) {
187
                        select.column().value(exp.getCode().toValue()).as(attrName);
188
                    }
189
                    if (!extraColumnNames.contains(attr.getName())) {
190
                        extraColumnNames.add(attrName);
191
                    }
175 192
                } else if (setType.get(attrName) == null) {
176 193
                    try {
177 194
                        Code code = ExpressionUtils.compile(attrName);
178
                        if( code.code()==Code.CALLABLE ) {
179
                            Code.Callable callable = (Code.Callable) code;
180
                            if( callable.name().equalsIgnoreCase(FUNCTION_LET) ) { 
181
                                code = callable.parameters().get(1);
182
                                Code name = callable.parameters().get(0);
183
                                select.column().value(callable.parameters().get(1).toValue())
184
                                        .as((String) ((Code.Constant)name).value());
185
                                extraColumnNames.add((String) ((Code.Constant)name).value());
186
                            }
187
                        }
188 195
                        select.group_by(code.toValue());
189 196
                    } catch (Exception ex) {
190 197
                        throw new RuntimeException("Not able to create column by expression in groupby query", ex);
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/resources-plugin/i18n/text.properties
1475 1475
_Bring_to_front=Traer al frente
1476 1476
_Send_to_back=Enviar al fondo
1477 1477
_Move_ahead=Mover adelante
1478
_Move_behind=Mover detr\u00e1s
1478
_Move_behind=Mover detr\u00e1s
1479
_Changes_has_not_been_saved_Do_you_want_to_save_them_before_continue=Hay cambios no guardados.\n\u00bfDesea que se guarden antes de continuar?
1480
_Searching=Buscando
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/resources-plugin/i18n/text_en.properties
1395 1395
_Bring_to_front=Bring to front
1396 1396
_Send_to_back=Send to back
1397 1397
_Move_ahead=Move ahead
1398
_Move_behind=Move behind
1398
_Move_behind=Move behind
1399
_Changes_has_not_been_saved_Do_you_want_to_save_them_before_continue=Changes has not been saved.\nDo you want to save them before continue?
1400
_Searching=Searching

Also available in: Unified diff