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

History | View | Annotate | Download (13.8 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.expressionevaluator.ExpressionBuilder;
13
import org.gvsig.expressionevaluator.ExpressionUtils;
14
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
15
import org.gvsig.fmap.dal.feature.Feature;
16
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.FeatureExtraColumns;
18
import org.gvsig.fmap.dal.feature.FeatureQuery;
19
import org.gvsig.fmap.dal.feature.FeatureStore;
20
import org.gvsig.fmap.dal.feature.FeatureType;
21
import org.gvsig.fmap.dal.swing.DALSwingLocator;
22
import org.gvsig.fmap.dal.swing.DataSwingManager;
23
import org.gvsig.fmap.dal.swing.impl.searchPostProcess.distinctOn.AggregateOperation.AggregateOperationFactory;
24
import org.gvsig.fmap.dal.swing.impl.searchPostProcess.distinctOn.FirstAggregateOperation.FirstAggregateOperationFactory;
25
import org.gvsig.fmap.dal.swing.searchPostProcess.AbstractSearchPostProcessFactory;
26
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcess;
27
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcessFactory;
28
import org.gvsig.fmap.dal.swing.searchpanel.SearchParameters;
29
import org.gvsig.tools.ToolsLocator;
30
import org.gvsig.tools.dataTypes.DataType;
31
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
32
import org.gvsig.tools.dynobject.DynClass;
33
import org.gvsig.tools.dynobject.DynClass_v2;
34
import org.gvsig.tools.dynobject.DynField_v2;
35
import org.gvsig.tools.dynobject.DynObject;
36
import org.gvsig.tools.dynobject.DynObjectManager;
37
import org.gvsig.tools.dynobject.DynObjectValueItem;
38
import org.gvsig.tools.i18n.I18nManager;
39
import org.slf4j.LoggerFactory;
40

    
41
/**
42
 * i
43
 *
44
 * @author jovivas
45
 */
46
public class DistinctOnFactory extends AbstractSearchPostProcessFactory {
47

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

    
50
    public static final String NAME = "DistinctOn";
51
    public static final String LABEL = "DistinctOn";
52
    public static final String DESCRIPTION = "DistinctOn_description";
53

    
54
    public DistinctOnFactory() {
55
        super(
56
                NAME,
57
                LABEL,
58
                DESCRIPTION,
59
                null,
60
                null
61
        );
62
    }
63

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

    
70
    @Override
71
    public boolean hasProcessParameters() {
72
        return true;
73
    }
74

    
75
    @Override
76
    public DynObject createProcessParameters(FeatureStore input, FeatureQuery query, SearchParameters searchParams) {
77
        I18nManager i18n = ToolsLocator.getI18nManager();
78
        DynObjectManager dynObjectManager = ToolsLocator.getDynObjectManager();
79
        DynClass_v2 dynClass = (DynClass_v2) dynObjectManager.createDynClass("distinctOn " + input.getName() +"_"+ UUID.randomUUID().toString(), null); 
80
        DynField_v2 dynField = (DynField_v2) dynClass.addDynFieldString("field");
81
        dynField.setLabel(i18n.getTranslation("_Distinct_on_field"));
82
        dynField.setDescription("");
83
        dynField.setGroup(i18n.getTranslation("_Field_to_group_by_unique_values"));
84
        dynField.setOrder(1);
85
        String operation = null;
86
        FeatureType ft = input.getDefaultFeatureTypeQuietly();
87
        List<DynObjectValueItem> attrs = getAtributeNames(input);
88
        if (query.getExtraColumn().size()>0) {
89
//        if (searchParams.getResultColumnNames().size()>0) {
90
////            DynObjectValueItem[] attrs = new DynObjectValueItem[size];
91
////            List<DynObjectValueItem> attrs = new ArrayList<DynObjectValueItem>();
92
            FeatureExtraColumns extraColumns = query.getExtraColumn();
93
//            int newSize = attrs.length+query.getExtraColumn().size();
94
//            DynObjectValueItem[] newAttrs = new DynObjectValueItem[newSize];
95
//            int j = 0;
96
//            for (int i = 0; i < attrs.length; i++) {
97
//                newAttrs[i]=attrs[i];
98
//            }
99

    
100
            for (int i = 0; i < extraColumns.size(); i++) {
101
                EditableFeatureAttributeDescriptor attr = extraColumns.get(i);
102
                DataType dataType = attr.getDataType();
103
                if (!dataType.isContainer()){
104
                    attrs.add( new DynObjectValueItem(attr.getName(), attr.getLabel()));
105
                } 
106
            }
107
            
108
//            for ( EditableFeatureAttributeDescriptor attr : query.getExtraColumn()) {
109
//                if (query.getExtraColumn().get(attrName) != null) {
110
//                    DynObjectValueItem attr = new DynObjectValueItem(query.getExtraColumn().get(attrName), query.getExtraColumn().get(attrName).toJson().getString(label));
111
//                    try{
112
//                        attrs.add(attr);
113
//                    }catch (Exception ex) {
114
//                        LOGGER.warn("Can't add "+ attr.toString(), ex);
115
//                    }
116
//                }
117
//            }
118
           
119
            dynField.setAvailableValues(attrs.toArray(new DynObjectValueItem[attrs.size()]));
120
            for (int i = 0; i < attrs.size(); i++) {
121
                fillParameters( (String) attrs.get(i).getValue(), operation, dynClass, dynField, searchParams, i, ft, extraColumns);
122
                
123
            }
124
//            for (String attrName : query.getAttributeNames()) {
125
//                if (ft.get(attrName) != null) {
126
//                    FeatureAttributeDescriptor attr = (FeatureAttributeDescriptor) ft.get(attrName);
127
//                    fillParameters(attr, firstOperation, dynClass, dynField);
128
//                } else if (query.getExtraColumn().get(attrName) != null) {
129
//                    FeatureAttributeDescriptor attr = query.getExtraColumn().get(attrName);
130
//                    fillParameters(attr, firstOperation, dynClass, dynField);
131
//                }
132
//            }
133

    
134
        } else {
135
            dynField.setAvailableValues(attrs);
136
            for (int i = 0; i < attrs.size(); i++) {  
137
//            }
138
//            for (FeatureAttributeDescriptor attr : input.getDefaultFeatureTypeQuietly()) {
139
                fillParameters( (String) attrs.get(i).getValue(), operation, dynClass, dynField, searchParams, i, ft, null);
140
            }
141
        }
142

    
143
        dynClass.getTags().set(DynFormSPIManager.TAG_DYNFORM_HEIGHT, 250);
144
        dynClass.getTags().set(DynFormSPIManager.TAG_DYNFORM_WIDTH, 350);
145

    
146
        DynObject params = dynObjectManager.createDynObject(dynClass);
147
        return params;
148
    }
149

    
150
    private void fillParameters(String attr,
151
            String operation,
152
            DynClass_v2 dynClass,
153
            DynField_v2 dynField,
154
            SearchParameters searchParams,
155
            int n,
156
            FeatureType ft,
157
            FeatureExtraColumns extraColumns
158
            ) {
159
        I18nManager i18n = ToolsLocator.getI18nManager();
160
        // dynField = (DynField_v2) dynClass.addDynFieldString(attr.getName());
161
        for (FeatureAttributeDescriptor featureAttributeDescriptor : ft) {
162
            if (StringUtils.equals(featureAttributeDescriptor.getName(), attr)) {
163
                Class attrClass = featureAttributeDescriptor.getDataType().getDefaultClass();
164
                List<DynObjectValueItem> availableOperations = fillAggregateOperations (attrClass);
165
                String newOperation = getOperation(attrClass, operation);
166
                if (availableOperations.size() > 0) {
167
                    if(searchParams.getResultColumnNames().contains(attr)){
168
                        dynField = (DynField_v2) dynClass.addDynFieldString(attr);
169
                        dynField.setAvailableValues(availableOperations);
170
                        dynField.setDefaultFieldValue(newOperation);
171
                        dynField.setGroup(i18n.getTranslation("_Visible_columns"));
172
                        dynField.setOrder(2000+n);
173
                    } else {
174
                        dynField = (DynField_v2) dynClass.addDynFieldString(attr);
175
                        dynField.setAvailableValues(availableOperations);
176
                        dynField.setDefaultFieldValue(newOperation);
177
                        dynField.setGroup(i18n.getTranslation("_Hidden_columns"));
178
                        dynField.setOrder(3000+n);
179
                    }
180
                }
181
            }   
182
        }
183
        if (extraColumns != null){
184
            for (int i = 0; i < extraColumns.size(); i++) {
185
                if (StringUtils.equals(extraColumns.get(i).getName(), attr)) {
186
                    Class attrClass = ((FeatureAttributeDescriptor) extraColumns.get(i)).getDataType().getDefaultClass();;
187
                    List<DynObjectValueItem> availableOperations = fillAggregateOperations (attrClass);
188
                    String newOperation = getOperation(attrClass, operation);
189
                    if (availableOperations.size() > 0) {
190
                        if(searchParams.getResultColumnNames().contains(attr)){
191
                            dynField = (DynField_v2) dynClass.addDynFieldString(attr);
192
                            dynField.setAvailableValues(availableOperations);
193
                            dynField.setDefaultFieldValue(newOperation);
194
                            dynField.setGroup(i18n.getTranslation("_Visible_columns"));
195
                            dynField.setOrder(2000+n);
196
                        } else {
197
                            dynField = (DynField_v2) dynClass.addDynFieldString(attr);
198
                            dynField.setAvailableValues(availableOperations);
199
                            dynField.setDefaultFieldValue(newOperation);
200
                            dynField.setGroup(i18n.getTranslation("_Hidden_columns"));
201
                            dynField.setOrder(3000+n);
202
                        }
203
                    }
204
                }            
205
            }
206
        }
207
//        List<DynObjectValueItem> availableOperations = new ArrayList<>();
208
//        for (AggregateOperationFactory factory : DistinctOn.getAggregatesOperationFactories()) {
209
//            if (factory == null) {
210
//                continue;
211
//            }
212
//            if (Comparable.class.isAssignableFrom((Class<?>) attrClass)){
213
//                if (operation == null && factory instanceof FirstAggregateOperationFactory) {
214
//                    operation = factory.getName();
215
//                }
216
//            } else {
217
//                if (operation == null && factory instanceof NothingAggregateOperationFactory) {
218
//                    operation = factory.getName();
219
//                }
220
//            }
221
////            if (firstOperation == null && factory instanceof FirstAggregateOperationFactory) {
222
////                firstOperation = factory.getName();
223
////            }
224
//            if (factory.isApplicable(attrClass)) {
225
//                availableOperations.add(new DynObjectValueItem(
226
//                        factory.getName(),
227
//                        i18n.getTranslation("_" + StringUtils.replaceChars(factory.getName(), ' ', '_'))
228
//                ));
229
//            }
230
//        }
231
        
232

    
233
    }
234

    
235
    private List<DynObjectValueItem>  fillAggregateOperations (Class attrClass){
236
        
237
        I18nManager i18n = ToolsLocator.getI18nManager();
238
        List<DynObjectValueItem> availableOperations = new ArrayList<>();
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
//            } else {
248
//                if (operation == null && factory instanceof NothingAggregateOperationFactory) {
249
//                    operation = factory.getName();
250
//                }
251
//            }
252
            
253
            if (factory.isApplicable(attrClass)) {
254
                availableOperations.add(new DynObjectValueItem(
255
                        factory.getName(),
256
                        i18n.getTranslation("_" + StringUtils.replaceChars(factory.getName(), ' ', '_'))
257
                ));
258
            }
259
        } 
260
        return availableOperations;
261
    }
262
    
263
    private String getOperation (Class attrClass,String operation){
264
        for (AggregateOperationFactory factory : DistinctOn.getAggregatesOperationFactories()) {
265
            if (factory == null) {
266
                continue;
267
            }
268
            if (Comparable.class.isAssignableFrom((Class<?>) attrClass)){
269
                if (operation == null && factory instanceof FirstAggregateOperationFactory) {
270
                    operation = factory.getName();
271
                }
272
            }
273
        } 
274
        return operation;
275
    }
276
    
277
    public static void selfRegister() {
278
        try {
279
            DataSwingManager manager = DALSwingLocator.getDataSwingManager();
280
            manager.registerSearchPostProcess(new DistinctOnFactory());
281
        } catch (Exception ex) {
282
            LOGGER.warn("Can't register distinct on search post process.", ex);
283
        }
284
    }
285

    
286
    private List<DynObjectValueItem> getAtributeNames(FeatureStore input) {
287
        FeatureType ft = input.getDefaultFeatureTypeQuietly();
288
        List<DynObjectValueItem> values = new ArrayList();
289
        for (FeatureAttributeDescriptor attr : ft) {
290
            DataType dataType = attr.getDataType();
291
            if (!dataType.isContainer()){
292
                values.add( new DynObjectValueItem(attr.getName(), attr.getLabel()));
293
            }               
294
        }
295
//        return values.toArray(new DynObjectValueItem[values.size()]);
296
        return values;
297

    
298
    }
299
}