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 / searchPostProcess / distinctOn / DistinctOnFactory.java @ 46301

History | View | Annotate | Download (12.7 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.fmap.dal.swing.impl.searchPostProcess.distinctOn;
7

    
8
import java.util.ArrayList;
9
import java.util.List;
10
import java.util.UUID;
11
import org.apache.commons.lang3.StringUtils;
12
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
13
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
14
import org.gvsig.fmap.dal.feature.FeatureExtraColumns;
15
import org.gvsig.fmap.dal.feature.FeatureQuery;
16
import org.gvsig.fmap.dal.feature.FeatureStore;
17
import org.gvsig.fmap.dal.feature.FeatureType;
18
import org.gvsig.fmap.dal.swing.DALSwingLocator;
19
import org.gvsig.fmap.dal.swing.DataSwingManager;
20
import org.gvsig.fmap.dal.swing.impl.searchPostProcess.distinctOn.AggregateOperation.AggregateOperationFactory;
21
import org.gvsig.fmap.dal.swing.impl.searchPostProcess.distinctOn.FirstAggregateOperation.FirstAggregateOperationFactory;
22
import org.gvsig.fmap.dal.swing.impl.searchPostProcess.distinctOn.NullAggregateOperation.NullAggregateOperationFactory;
23
import org.gvsig.fmap.dal.swing.searchPostProcess.AbstractSearchPostProcessFactory;
24
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcess;
25
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcessFactory;
26
import org.gvsig.fmap.dal.swing.searchpanel.SearchParameters;
27
import org.gvsig.tools.ToolsLocator;
28
import org.gvsig.tools.dataTypes.DataType;
29
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
30
import org.gvsig.tools.dynobject.DynClass_v2;
31
import org.gvsig.tools.dynobject.DynField_v2;
32
import org.gvsig.tools.dynobject.DynObject;
33
import org.gvsig.tools.dynobject.DynObjectManager;
34
import org.gvsig.tools.dynobject.DynObjectValueItem;
35
import org.gvsig.tools.i18n.I18nManager;
36
import org.slf4j.LoggerFactory;
37

    
38
/**
39
 * i
40
 *
41
 * @author jovivas
42
 */
43
public class DistinctOnFactory extends AbstractSearchPostProcessFactory {
44

    
45
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(DistinctOnFactory.class);
46

    
47
    public static final String NAME = "DistinctOn";
48
    public static final String LABEL = "DistinctOn";
49
    public static final String DESCRIPTION = "DistinctOn_description";
50

    
51
    public DistinctOnFactory() {
52
        super(
53
                NAME,
54
                LABEL,
55
                DESCRIPTION,
56
                null,
57
                null
58
        );
59
    }
60

    
61
    @Override
62
    public SearchPostProcess createProcess(SearchPostProcessFactory factory, FeatureStore input, FeatureQuery query, DynObject parameters) {
63
        SearchPostProcess process = new DistinctOn(this, input, query, parameters);
64
        return process;
65
    }
66

    
67
    @Override
68
    public boolean hasProcessParameters() {
69
        return true;
70
    }
71

    
72
    @Override
73
    public DynObject createProcessParameters(FeatureStore input, FeatureQuery query, SearchParameters searchParams) {
74
        I18nManager i18n = ToolsLocator.getI18nManager();
75
        DynObjectManager dynObjectManager = ToolsLocator.getDynObjectManager();
76
        DynClass_v2 dynClass = (DynClass_v2) dynObjectManager.createDynClass("distinctOn " + input.getName() +"_"+ UUID.randomUUID().toString(), null); 
77
        DynField_v2 dynField = (DynField_v2) dynClass.addDynFieldString("field");
78
        dynField.setLabel(i18n.getTranslation("_Distinct_on_field"));
79
        dynField.setDescription("");
80
        dynField.setGroup(i18n.getTranslation("_Field_to_group_by_unique_values"));
81
        dynField.setOrder(1);
82
        String operation = null;
83
        FeatureType ft = input.getDefaultFeatureTypeQuietly();
84
        List<DynObjectValueItem> attrs = getAtributeNames(input);
85
        if (query.getExtraColumn().size()>0) {
86
            FeatureExtraColumns extraColumns = query.getExtraColumn();
87

    
88
            for (int i = 0; i < extraColumns.size(); i++) {
89
                EditableFeatureAttributeDescriptor attr = extraColumns.get(i);
90
                DataType dataType = attr.getDataType();
91
                if (!dataType.isContainer()){
92
                    attrs.add( new DynObjectValueItem(attr.getName(), attr.getLabel()));
93
                } 
94
            }
95
            
96
            dynField.setAvailableValues(attrs.toArray(new DynObjectValueItem[attrs.size()]));
97
            for (int i = 0; i < attrs.size(); i++) {
98
                fillParameters( (String) attrs.get(i).getValue(), operation, dynClass, dynField, searchParams, i, ft, extraColumns);
99
                
100
            }
101
        } else {
102
            dynField.setAvailableValues(attrs);
103
            for (int i = 0; i < attrs.size(); i++) {  
104
                fillParameters( (String) attrs.get(i).getValue(), operation, dynClass, dynField, searchParams, i, ft, null);
105
            }
106
        }
107
        
108
        DynField_v2 addTableToProjectDynField = (DynField_v2) dynClass.addDynFieldBoolean("addTableToProject");
109
        addTableToProjectDynField.setDefaultFieldValue(false);
110
        addTableToProjectDynField.setLabel(i18n.getTranslation("_Add_table_to_project"));
111
        addTableToProjectDynField.setDescription("");
112
        addTableToProjectDynField.setGroup(i18n.getTranslation("_Other_parameters"));
113
        addTableToProjectDynField.setOrder(4000);
114
        
115

    
116
        dynClass.getTags().set(DynFormSPIManager.TAG_DYNFORM_HEIGHT, 250);
117
        dynClass.getTags().set(DynFormSPIManager.TAG_DYNFORM_WIDTH, 350);
118

    
119
        DynObject params = dynObjectManager.createDynObject(dynClass);
120
        return params;
121
    }
122

    
123
    private void fillParameters(String attr,
124
            String operation,
125
            DynClass_v2 dynClass,
126
            DynField_v2 dynField,
127
            SearchParameters searchParams,
128
            int n,
129
            FeatureType ft,
130
            FeatureExtraColumns extraColumns
131
            ) {
132
        I18nManager i18n = ToolsLocator.getI18nManager();
133
        // dynField = (DynField_v2) dynClass.addDynFieldString(attr.getName());
134
        for (FeatureAttributeDescriptor featureAttributeDescriptor : ft) {
135
            if (StringUtils.equals(featureAttributeDescriptor.getName(), attr)) {
136
                Class attrClass = featureAttributeDescriptor.getDataType().getDefaultClass();
137
                List<DynObjectValueItem> availableOperations = fillAggregateOperations (attrClass);
138
                if (availableOperations.size() > 0) {
139
                    if(searchParams.getResultColumnNames().contains(attr)){
140
                        String newOperation = getOperation(attrClass, operation);
141
                        dynField = (DynField_v2) dynClass.addDynFieldString(attr);
142
                        dynField.setAvailableValues(availableOperations);
143
                        dynField.setDefaultFieldValue(newOperation);
144
                        dynField.setGroup(i18n.getTranslation("_Visible_columns"));
145
                        dynField.setOrder(2000+n);
146
                    } else {
147
                        String newOperation = getOperation(attrClass, NullAggregateOperationFactory.NAME);
148
                        dynField = (DynField_v2) dynClass.addDynFieldString(attr);
149
                        dynField.setAvailableValues(availableOperations);
150
                        dynField.setDefaultFieldValue(newOperation);
151
                        dynField.setGroup(i18n.getTranslation("_Hidden_columns"));
152
                        dynField.setOrder(3000+n);
153
                    }
154
                }
155
            }   
156
        }
157
        if (extraColumns != null){
158
            for (int i = 0; i < extraColumns.size(); i++) {
159
                if (StringUtils.equals(extraColumns.get(i).getName(), attr)) {
160
                    Class attrClass = ((FeatureAttributeDescriptor) extraColumns.get(i)).getDataType().getDefaultClass();;
161
                    List<DynObjectValueItem> availableOperations = fillAggregateOperations (attrClass);
162
                    if (availableOperations.size() > 0) {
163
                        if(searchParams.getResultColumnNames().contains(attr)){
164
                            String newOperation = getOperation(attrClass, operation);
165
                            dynField = (DynField_v2) dynClass.addDynFieldString(attr);
166
                            dynField.setAvailableValues(availableOperations);
167
                            dynField.setDefaultFieldValue(newOperation);
168
                            dynField.setGroup(i18n.getTranslation("_Visible_columns"));
169
                            dynField.setOrder(2000+n);
170
                        } else {
171
                            String newOperation = getOperation(attrClass, NullAggregateOperationFactory.NAME);
172
                            dynField = (DynField_v2) dynClass.addDynFieldString(attr);
173
                            dynField.setAvailableValues(availableOperations);
174
                            dynField.setDefaultFieldValue(newOperation);
175
                            dynField.setGroup(i18n.getTranslation("_Hidden_columns"));
176
                            dynField.setOrder(3000+n);
177
                        }
178
                    }
179
                }            
180
            }
181
        }
182
//        List<DynObjectValueItem> availableOperations = new ArrayList<>();
183
//        for (AggregateOperationFactory factory : DistinctOn.getAggregatesOperationFactories()) {
184
//            if (factory == null) {
185
//                continue;
186
//            }
187
//            if (Comparable.class.isAssignableFrom((Class<?>) attrClass)){
188
//                if (operation == null && factory instanceof FirstAggregateOperationFactory) {
189
//                    operation = factory.getName();
190
//                }
191
//            } else {
192
//                if (operation == null && factory instanceof NothingAggregateOperationFactory) {
193
//                    operation = factory.getName();
194
//                }
195
//            }
196
////            if (firstOperation == null && factory instanceof FirstAggregateOperationFactory) {
197
////                firstOperation = factory.getName();
198
////            }
199
//            if (factory.isApplicable(attrClass)) {
200
//                availableOperations.add(new DynObjectValueItem(
201
//                        factory.getName(),
202
//                        i18n.getTranslation("_" + StringUtils.replaceChars(factory.getName(), ' ', '_'))
203
//                ));
204
//            }
205
//        }
206
        
207

    
208
    }
209

    
210
    private List<DynObjectValueItem>  fillAggregateOperations (Class attrClass){
211
        
212
        I18nManager i18n = ToolsLocator.getI18nManager();
213
        List<DynObjectValueItem> availableOperations = new ArrayList<>();
214
        for (AggregateOperationFactory factory : DistinctOn.getAggregatesOperationFactories()) {
215
            if (factory == null) {
216
                continue;
217
            }
218
//            if (Comparable.class.isAssignableFrom((Class<?>) attrClass)){
219
//                if (operation == null && factory instanceof FirstAggregateOperationFactory) {
220
//                    operation = factory.getName();
221
//                }
222
//            } else {
223
//                if (operation == null && factory instanceof NothingAggregateOperationFactory) {
224
//                    operation = factory.getName();
225
//                }
226
//            }
227
            
228
            if (factory.isApplicable(attrClass)) {
229
                availableOperations.add(new DynObjectValueItem(
230
                        factory.getName(),
231
                        i18n.getTranslation("_" + StringUtils.replaceChars(factory.getName(), ' ', '_'))
232
                ));
233
            }
234
        } 
235
        return availableOperations;
236
    }
237
    
238
    private String getOperation (Class attrClass,String operation){
239
        for (AggregateOperationFactory factory : DistinctOn.getAggregatesOperationFactories()) {
240
            if (factory == null) {
241
                continue;
242
            }
243
            if (Comparable.class.isAssignableFrom((Class<?>) attrClass)){
244
                if (operation == null && factory instanceof FirstAggregateOperationFactory) {
245
                    operation = factory.getName();
246
                }
247
            }
248
        } 
249
        return operation;
250
    }
251
    
252
    public static void selfRegister() {
253
        try {
254
            DataSwingManager manager = DALSwingLocator.getDataSwingManager();
255
            manager.registerSearchPostProcess(new DistinctOnFactory());
256
        } catch (Exception ex) {
257
            LOGGER.warn("Can't register distinct on search post process.", ex);
258
        }
259
    }
260

    
261
    private List<DynObjectValueItem> getAtributeNames(FeatureStore input) {
262
        FeatureType ft = input.getDefaultFeatureTypeQuietly();
263
        List<DynObjectValueItem> values = new ArrayList();
264
        I18nManager i18n = ToolsLocator.getI18nManager();
265
        for (FeatureAttributeDescriptor attr : ft) {
266
            DataType dataType = attr.getDataType();
267
            if (!dataType.isContainer()){
268
                values.add( new DynObjectValueItem(attr.getName(), i18n.getTranslation(attr.getLabel())));
269
            }               
270
        }
271
//        return values.toArray(new DynObjectValueItem[values.size()]);
272
        return values;
273

    
274
    }
275
}