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

View differences:

DistinctOnFactory.java
7 7

  
8 8
import java.util.ArrayList;
9 9
import java.util.List;
10
import java.util.UUID;
10 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;
11 16
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.FeatureExtraColumns;
12 18
import org.gvsig.fmap.dal.feature.FeatureQuery;
13 19
import org.gvsig.fmap.dal.feature.FeatureStore;
14 20
import org.gvsig.fmap.dal.feature.FeatureType;
......
19 25
import org.gvsig.fmap.dal.swing.searchPostProcess.AbstractSearchPostProcessFactory;
20 26
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcess;
21 27
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcessFactory;
28
import org.gvsig.fmap.dal.swing.searchpanel.SearchParameters;
22 29
import org.gvsig.tools.ToolsLocator;
30
import org.gvsig.tools.dataTypes.DataType;
23 31
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
24 32
import org.gvsig.tools.dynobject.DynClass;
25 33
import org.gvsig.tools.dynobject.DynClass_v2;
......
36 44
 * @author jovivas
37 45
 */
38 46
public class DistinctOnFactory extends AbstractSearchPostProcessFactory {
39
    
47

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

  
42 50
    public static final String NAME = "DistinctOn";
43 51
    public static final String LABEL = "DistinctOn";
44 52
    public static final String DESCRIPTION = "DistinctOn_description";
......
65 73
    }
66 74

  
67 75
    @Override
68
    public DynObject createProcessParameters(FeatureStore input) {
76
    public DynObject createProcessParameters(FeatureStore input, FeatureQuery query, SearchParameters searchParams) {
69 77
        I18nManager i18n = ToolsLocator.getI18nManager();
70 78
        DynObjectManager dynObjectManager = ToolsLocator.getDynObjectManager();
71
        DynClass_v2 dynClass = (DynClass_v2) dynObjectManager.createDynClass("distinctOn"+input.getName(), null);
79
        DynClass_v2 dynClass = (DynClass_v2) dynObjectManager.createDynClass("distinctOn " + input.getName() +"_"+ UUID.randomUUID().toString(), null); 
72 80
        DynField_v2 dynField = (DynField_v2) dynClass.addDynFieldString("field");
73 81
        dynField.setLabel(i18n.getTranslation("_Distinct_on_field"));
74 82
        dynField.setDescription("");
75
        dynField.setAvailableValues(getAtributeNames(input));
76 83
        dynField.setGroup(i18n.getTranslation("_Field_to_group_by_unique_values"));
77
        String firstOperation = null;
78
        for (FeatureAttributeDescriptor attr : input.getDefaultFeatureTypeQuietly()) {
79
//            dynField = (DynField_v2) dynClass.addDynFieldString(attr.getName());
80
            Class attrClass = attr.getDataType().getDefaultClass();
81
            List <DynObjectValueItem> availableOperations = new ArrayList<>();
82
            for (AggregateOperationFactory factory : DistinctOn.getAggregatesOperationFactories()) {
83
                if (factory == null){
84
                    continue;
85
                }
86
                if (firstOperation == null && factory instanceof FirstAggregateOperationFactory){
87
                    firstOperation = factory.getName();
88
                }
89
                if (factory.isApplicable(attrClass)){
90
                    availableOperations.add(new DynObjectValueItem(
91
                            factory.getName(),
92
                            i18n.getTranslation("_"+StringUtils.replaceChars(factory.getName(), ' ', '_'))
93
                    ));
94
                }   
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
                } 
95 106
            }
96
            if (availableOperations.size() > 0){
97
                dynField = (DynField_v2) dynClass.addDynFieldString(attr.getName());
98
                dynField.setAvailableValues(availableOperations);
99
                dynField.setDefaultFieldValue(firstOperation);
100
                dynField.setGroup(i18n.getTranslation("_Aggregate_operations"));
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
                
101 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
            }
102 141
        }
142

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

  
106 146
        DynObject params = dynObjectManager.createDynObject(dynClass);
107 147
        return params;
108 148
    }
109 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
    
110 277
    public static void selfRegister() {
111 278
        try {
112 279
            DataSwingManager manager = DALSwingLocator.getDataSwingManager();
......
116 283
        }
117 284
    }
118 285

  
119
    
120
    private DynObjectValueItem[] getAtributeNames(FeatureStore input) {
286
    private List<DynObjectValueItem> getAtributeNames(FeatureStore input) {
121 287
        FeatureType ft = input.getDefaultFeatureTypeQuietly();
122
        DynObjectValueItem[] values = new DynObjectValueItem[ft.size()];
123
        for (int i = 0; i < ft.size(); i++) {   
124
            values[i] = new DynObjectValueItem(ft.get(i).getName(),ft.get(i).getName());   
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
            }               
125 294
        }
295
//        return values.toArray(new DynObjectValueItem[values.size()]);
126 296
        return values;
127
        
297

  
128 298
    }
129 299
}

Also available in: Unified diff