Statistics
| Revision:

svn-gvsig-desktop / 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 @ 46104

History | View | Annotate | Download (13 KB)

1
package org.gvsig.fmap.dal.swing.impl.featurequery;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Component;
5
import java.awt.Dimension;
6
import java.awt.event.ActionEvent;
7
import java.net.URL;
8
import java.util.ArrayList;
9
import java.util.Collections;
10
import java.util.HashMap;
11
import java.util.List;
12
import java.util.Map;
13
import javax.swing.DefaultComboBoxModel;
14
import javax.swing.ImageIcon;
15
import javax.swing.JComponent;
16
import javax.swing.JLabel;
17
import javax.swing.JList;
18
import javax.swing.event.ChangeEvent;
19
import javax.swing.event.ListSelectionEvent;
20
import org.apache.commons.io.FilenameUtils;
21
import org.apache.commons.lang3.StringUtils;
22
import org.gvsig.expressionevaluator.Code;
23
import org.gvsig.expressionevaluator.ExpressionBuilder;
24
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
25
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
26
import org.gvsig.expressionevaluator.ExpressionUtils;
27
import org.gvsig.expressionevaluator.Function;
28
import org.gvsig.expressionevaluator.SymbolTable;
29
import org.gvsig.expressionevaluator.SymbolTableFactory;
30
import org.gvsig.fmap.dal.exception.DataException;
31
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
32
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
33
import org.gvsig.fmap.dal.feature.FeatureQuery;
34
import org.gvsig.fmap.dal.feature.FeatureStore;
35
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
36
import org.gvsig.fmap.dal.feature.FeatureType;
37
import org.gvsig.fmap.dal.swing.impl.featuretype.FeatureAttributeListCellRendererImpl;
38
import org.gvsig.fmap.dal.swing.impl.featuretype.DefaultFeatureAttributesSelectionPanel;
39
import org.gvsig.tools.dataTypes.DataType;
40
import org.gvsig.tools.swing.api.FilteredListController;
41
import org.gvsig.tools.swing.api.ToolsSwingLocator;
42
import org.gvsig.tools.swing.api.ToolsSwingManager;
43
import org.gvsig.tools.swing.icontheme.IconTheme;
44
import org.gvsig.fmap.dal.swing.featurequery.FeatureQueryGroupByPanel;
45
import org.gvsig.timesupport.DataTypes;
46
import org.gvsig.tools.swing.api.FilteredListModel;
47

    
48
/**
49
 *
50
 * @author jjdelcerro
51
 */
52
public class DefaultFeatureQueryGroupByPanel
53
        extends DefaultFeatureQueryGroupByPanelView
54
        implements FeatureQueryGroupByPanel {
55

    
56
    private class AttributesWithAggregateRenderer extends FeatureAttributeListCellRendererImpl {
57

    
58
        @Override
59
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
60
            JLabel c = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); //To change body of generated methods, choose Tools | Templates.
61
            FeatureAttributeDescriptor attrdesc = (FeatureAttributeDescriptor) value;
62
            String aggregate = query.getAggregateFunctions().get(attrdesc.getName());
63
            if (aggregate != null) {
64
                c.setText(c.getText() + "  [" + aggregate + "]");
65
            } else {
66
                c.setText(c.getText() + "  [<NULL>]");
67
            }
68
            return c;
69
        }
70
    }
71

    
72
    private FeatureStore store;
73
    private FeatureType featureType;
74

    
75
    private FilteredListController aggregateFunctionsController;
76
    private DefaultFeatureAttributesSelectionPanel groupByPanel;
77

    
78
    private FeatureQuery query;
79

    
80
    public DefaultFeatureQueryGroupByPanel() {
81
        this.initComponents();
82
    }
83

    
84
    @Override
85
    public JComponent asJComponent() {
86
        return this;
87
    }
88

    
89
    @Override
90
    public ImageIcon loadImage(String imageName) {
91
        String name = FilenameUtils.getBaseName(imageName);
92
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
93
        if (theme.exists(name)) {
94
            return theme.get(name);
95
        }
96
        URL url = this.getClass().getResource(name + ".png");
97
        if (url == null) {
98
            return null;
99
        }
100
        return new ImageIcon(url);
101
    }
102

    
103
    @Override
104
    public void setStore(FeatureStore store) {
105
        try {
106
            this.featureType = store.getDefaultFeatureType();
107
            this.store = store;
108
            this.query = store.createFeatureQuery();
109
            this.groupByPanel.setFeatureType(featureType);
110
            this.groupByPanel.setSelectedNames(query.getGroupByColumns());
111
            this.updateControls();
112
        } catch (DataException ex) {
113
            throw new RuntimeException("Can't assign store", ex);
114
        }
115
    }
116

    
117
    private void initComponents() {
118
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
119

    
120
        toolsSwingManager.translate(this.btnAttributesFilter);
121
        toolsSwingManager.translate(this.tabGroup);
122

    
123
        this.groupByPanel = new DefaultFeatureAttributesSelectionPanel();
124
        this.groupByPanel.allowCalculatedAttributes(true);
125

    
126
        this.pnlGroupByAttributes.setLayout(new BorderLayout());
127
        this.pnlGroupByAttributes.add(this.groupByPanel, BorderLayout.CENTER);
128

    
129
        this.lstAttributes.setCellRenderer(new AttributesWithAggregateRenderer());
130
        this.lstAttributes.addListSelectionListener((ListSelectionEvent e) -> {
131
            if (e.getValueIsAdjusting()) {
132
                return;
133
            }
134
            doSelectAttribute();
135
        });
136

    
137
        this.cboAggretateFunctions.addActionListener((ActionEvent e) -> {
138
            doSelectAttribute();
139
        });
140

    
141
        this.aggregateFunctionsController = toolsSwingManager.createFilteredListController(
142
                lstAttributes,
143
                txtAttributesFilter,
144
                btnAttributesFilter
145
        );
146
        this.aggregateFunctionsController.addChangeListener((ChangeEvent ce) -> {
147
            doSelectAttribute();
148
        });
149
        Dimension sz = this.getPreferredSize();
150
        if (sz.width < DEFAULT_WIDTH) {
151
            sz.width = DEFAULT_WIDTH;
152
        }
153
        if (sz.height < DEFAULT_HEIGHT) {
154
            sz.height = DEFAULT_HEIGHT;
155
        }
156
        this.setPreferredSize(sz);
157
    }
158

    
159
    private void doSelectAttribute() {
160
        String previuos = this.txtCurrentAttributeName.getText();
161
        if (!StringUtils.isBlank(previuos)) {
162
            String aggregate = (String) this.cboAggretateFunctions.getSelectedItem();
163
            if (StringUtils.isBlank(aggregate) || aggregate.equalsIgnoreCase("<NULL>")) {
164
                this.query.getAggregateFunctions().remove(previuos);
165
            } else {
166
                this.query.getAggregateFunctions().put(previuos, aggregate);
167
            }
168
            this.updateControls();
169
        }
170

    
171
        FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) this.lstAttributes.getSelectedValue();
172
        if (attr == null) {
173
            return;
174
        }
175
        this.txtCurrentAttributeName.setText(attr.getName());
176
        String aggregate = this.query.getAggregateFunctions().get(attr.getName());
177
        if (StringUtils.isBlank(aggregate) || aggregate.equalsIgnoreCase("<NULL>")) {
178
            this.cboAggretateFunctions.setSelectedIndex(0);
179
        } else {
180
            this.cboAggretateFunctions.setSelectedItem(aggregate);
181
        }
182
    }
183

    
184
    private void updateControls() {
185
        int indexAttributes = this.lstAttributes.getSelectedIndex();
186
        if (this.cboAggretateFunctions.getModel().getSize() < 1) {
187
            List<String> aggregateFunctions = new ArrayList<>();
188
            java.util.function.Function<String, Integer> isAllowed = ((FeatureStoreProviderFactory) (store.getProviderFactory())).allowFunction();
189
            ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
190
            for (SymbolTableFactory factory : manager.getSymbolTableFactories()) {
191
                if (StringUtils.equalsIgnoreCase(Function.GROUP_AGGREGATE, factory.getName())) {
192
                    SymbolTable symbolTable = factory.create();
193
                    for (Function function : symbolTable) {
194
                        if (isAllowed.apply(function.name()) != DataType.NO) {
195
                            aggregateFunctions.add(function.name());
196
                        }
197
                    }
198
                    break;
199
                }
200
            }
201
            Collections.sort(aggregateFunctions);
202
            DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
203
            model.addElement("<NULL>");
204
            for (String functionName : aggregateFunctions) {
205
                model.addElement(functionName);
206
            }
207

    
208
            this.cboAggretateFunctions.setModel(model);
209
            this.cboAggretateFunctions.setSelectedIndex(0);
210
            this.txtCurrentAttributeName.setText("");
211
        }
212
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
213
        FilteredListModel model = toolsSwingManager.createFilteredListModel();
214
        for (FeatureAttributeDescriptor attr : featureType) {
215
            model.addElement(attr);
216
        }
217
        for (FeatureAttributeDescriptor attr : featureType.getExtraColumns().getColumns()) {
218
            model.addElement(attr);
219
        }
220
        for (EditableFeatureAttributeDescriptor attr : query.getExtraColumn().getColumns()) {
221
            model.addElement(attr);
222
        }
223
        model.setFilter(this.txtAttributesFilter.getText());
224
        model.sort(true);
225
        this.lstAttributes.setModel(model);
226
        this.lstAttributes.setSelectedIndex(indexAttributes);
227
        this.txtCurrentAttributeName.setText("");
228
        this.cboAggretateFunctions.setSelectedIndex(0);
229

    
230
        // 
231
        //groupByPanel.setSelectedNames(query.getGroupByColumns());
232
    }
233

    
234
    public Map<String, String> getFixedConversion() {
235
//      Map<String, String> fixed = new HashMap<>();
236
//      ExpressionBuilder builder = ExpressionUtils.createExpressionBuilder();
237
//
238
//      for (Map.Entry<String, String> aggregate : this.query.getAggregateFunctions().entrySet()) {
239
//          String key = aggregate.getKey();
240
//          String value = aggregate.getValue();
241
//          FeatureAttributeDescriptor attr = this.featureType.getAttributeDescriptorFromAll(value);
242
//          if(attr==null) {
243
//              attr = this.query.getExtraColumn().get(value);
244
//              if(attr==null) {
245
//                  fixed.put(key, value);
246
//                  continue;
247
//              }
248
//          }
249
//          if(StringUtils.equalsIgnoreCase(key, "SUM")) {
250
//            switch (attr.getType()) {
251
//                case DataTypes.BOOLEAN:
252
//                case DataTypes.STRING:
253
//                    value = builder.let(
254
//                            attr.getName(),
255
//                            builder.toInteger(
256
//                                    builder.variable(attr.getName()
257
//                                    )
258
//                            )
259
//                    ).toString();
260
//            }
261
//          }
262
//          fixed.put(key, value);
263
//          
264
//      }
265
// 
266
//      return fixed;   
267
        return this.query.getAggregateFunctions();
268
    }
269

    
270
    @Override
271
    public FeatureQuery fetch(FeatureQuery query) {
272
        if (query == null) {
273
            FeatureQuery q = this.query.getCopy();
274
            q.getAggregateFunctions().clear();
275
            q.getAggregateFunctions().putAll(getFixedConversion());
276
            return q;
277
        }
278
        query.getGroupByColumns().clear();
279
        query.getGroupByColumns().addAll(this.groupByPanel.getSelectedNames());
280
        query.getAggregateFunctions().clear();
281
        query.getAggregateFunctions().putAll(getFixedConversion());
282

    
283
        return query;
284
    }
285

    
286
    @Override
287
    public FeatureQuery fetch() {
288
        return this.fetch(null);
289
    }
290

    
291
    public void removeTypeConversion() {
292
        Map<String, String> fixed = new HashMap<>();
293

    
294
        for (Map.Entry<String, String> aggregate : this.query.getAggregateFunctions().entrySet()) {
295
            String key = aggregate.getKey();
296
            String value = aggregate.getValue();
297
            FeatureAttributeDescriptor attr = this.featureType.getAttributeDescriptorFromAll(value);
298
            if (attr == null) {
299
                attr = this.query.getExtraColumn().get(value);
300
                if (attr == null) {
301
                    switch (key.toLowerCase()) {
302
                        case "sum":
303
                            Code code = ExpressionUtils.compile(value);
304
                            if (code instanceof Code.Callable) {
305
                                Code.Callable callable = (Code.Callable) code;
306
                                switch (callable.name().toLowerCase()) {
307
                                    case ExpressionBuilder.FUNCTION_LET:
308
                                        value = ((Code.Identifier) callable.parameters().get(0)).name();
309
                                        break;
310
                                }
311
                            }
312
                            break;
313
                    }
314

    
315
                }
316
            }
317

    
318
            fixed.put(key, value);
319

    
320
        }
321

    
322
        query.getAggregateFunctions().clear();
323
        query.getAggregateFunctions().putAll(fixed);
324

    
325
    }
326

    
327
    @Override
328
    public void put(FeatureQuery query) {
329
        this.query.copyFrom(query);
330
//    removeTypeConversion();
331
        groupByPanel.setSelectedNames(query.getGroupByColumns());
332
        groupByPanel.setExtraColumns(query.getExtraColumn().getColumns());
333
        this.updateControls();
334
    }
335

    
336
    public static void selfRegister() {
337

    
338
    }
339

    
340
}