Revision 45705

View differences:

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/DistinctOn.java
11 11
import java.util.HashMap;
12 12
import java.util.Map;
13 13
import java.util.Objects;
14
import java.util.UUID;
15
import javax.json.JsonObject;
14 16

  
15 17
import org.gvsig.fmap.dal.DALLocator;
16 18
import org.gvsig.fmap.dal.DataManager;
......
18 20
import org.gvsig.fmap.dal.exception.DataException;
19 21
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
20 22
import org.gvsig.fmap.dal.feature.EditableFeature;
23
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
24
import org.gvsig.fmap.dal.feature.EditableFeatureType;
21 25
import org.gvsig.fmap.dal.feature.Feature;
22 26
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
27
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
28
import org.gvsig.fmap.dal.feature.FeatureExtraColumns;
23 29
import org.gvsig.fmap.dal.feature.FeatureQuery;
24 30
import org.gvsig.fmap.dal.feature.FeatureSet;
25 31
import org.gvsig.fmap.dal.feature.FeatureStore;
26 32
import org.gvsig.fmap.dal.feature.FeatureType;
33
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureAttributeDescriptor;
34
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureAttributeDescriptor;
27 35
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
28 36
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
29 37
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
......
31 39
import org.gvsig.fmap.dal.swing.searchPostProcess.AbstractSearchPostProcess;
32 40
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcessFactory;
33 41
import org.gvsig.tools.ToolsLocator;
42
import org.gvsig.tools.dataTypes.DataType;
34 43
import org.gvsig.tools.dynobject.DynObject;
44
import org.gvsig.tools.dynobject.DynStruct;
35 45
import org.gvsig.tools.folders.FoldersManager;
36 46
import org.gvsig.tools.util.HasAFile;
37 47
import org.slf4j.LoggerFactory;
38 48

  
49

  
39 50
/**
40 51
 *
41 52
 * @author jovivas
......
59 70
    @Override
60 71
    public  SearchPostProcessResult execute (FeatureStore inputStore, FeatureQuery query, DynObject parameters){  
61 72
        String uniqueFieldName;
62
//        Integer uniqueValue;
63 73
        
64 74
        uniqueFieldName = (String) parameters.getDynValue("field");
65
//        uniqueValue = (Integer) parameters.getDynValue("operation");
66 75
        
67 76
        try {
68 77
            // crear ruta de archivo temporal
69 78
            FoldersManager foldersManager = ToolsLocator.getFoldersManager();
70
            File tempFile = foldersManager.getUniqueTemporaryFile("distinctOn_process");
79
            File tempFile = foldersManager.getUniqueTemporaryFile("distinctOn_process_"+ UUID.randomUUID().toString());
71 80
            
72 81
            // crear SERVER STORE
73 82
            DataManager dataManager = DALLocator.getDataManager();
......
79 88
            //Crear tablas en server store
80 89
            JDBCNewStoreParameters parametersResults = serverExplorer.getAddParameters();
81 90
            parametersResults.setDynValue("Table", "results");
82
            FeatureType ft_inputStore = inputStore.getDefaultFeatureType().getEditable();
83
            parametersResults.setDefaultFeatureType(ft_inputStore.getCopy());
84
            
85
//            JDBCNewStoreParameters parametersUValues = serverExplorer.getAddParameters();
86
//            parametersUValues.setDynValue("Table", "uniqueValues");
87
//            EditableFeatureType ftUValues = dataManager.createFeatureType();
88
//            FeatureAttributeDescriptor attrSrc = ft_inputStore.getAttributeDescriptor(uniqueFieldName); // Informacion del campo nombre (aparce debajo e gestor columnas)
89
//            EditableFeatureAttributeDescriptor attr = ftUValues.add(uniqueFieldName, attrSrc.getType(), attrSrc.getSize());
90
//            attr.setIsIndexed(true);
91
//            attr.setAllowIndexDuplicateds(false);
92
//            parametersUValues.setDefaultFeatureType(ftUValues);
91
            FeatureType ft_inputStore = inputStore.getDefaultFeatureType();
92
            EditableFeatureType ft_inputStoreNoContainer = dataManager.createFeatureType();
93
            ft_inputStoreNoContainer.addAll(ft_inputStore);
94
            for (FeatureAttributeDescriptor attr : ft_inputStore) {
95
                DataType dataType = attr.getDataType();
96
                if (dataType.isContainer()){
97
                    ft_inputStoreNoContainer.remove(attr.getName());
98
                } 
99
            }
100
            if (query.getExtraColumn().size()>0) {
101
                FeatureExtraColumns extraColumns = query.getExtraColumn();
102
                for (int i = 0; i < extraColumns.size(); i++) {
103
                    DataType dataType = extraColumns.get(i).getDataType();
104
                    if (!dataType.isContainer()){
105
                        ft_inputStoreNoContainer.add(extraColumns.get(i).getName(), extraColumns.get(i).getType(), extraColumns.get(i).getSize());
106
                    } 
107
                }
108
            }
109
            EditableFeatureType ft_outputStore = dataManager.createFeatureType();
110
            ft_outputStore.addAll(ft_inputStoreNoContainer);
111
            for (FeatureAttributeDescriptor attr : ft_outputStore) {
112
                if(attr.isComputed()){
113
                    ((DefaultFeatureAttributeDescriptor) attr).setFeatureAttributeEmulator((FeatureAttributeEmulator) null);   
114
                }
115
            }
116
            parametersResults.setDefaultFeatureType(ft_outputStore);     
93 117

  
94 118
            serverExplorer.add("H2Spatial", parametersResults, true);
95
//            serverExplorer.add("H2Spatial", parametersUValues, true);
119

  
96 120
            
97 121
            DataStoreParameters storeParametersResults = dataManager.createStoreParameters("H2Spatial");
98 122
            storeParametersResults.setDynValue("database_file",tempFile);
99 123
            storeParametersResults.setDynValue("Table","results");
100
//            storeParameters.setDynValue("DefaultGeometryField","GEOMETRY");
101
//            storeParameters.setDynValue("CRS",gvsig.currentView().getProjection());
124
            
125
            //Creaci?n del store con los resultados
126
            FeatureStore storeResults = (FeatureStore) dataManager.openStore("H2Spatial",storeParametersResults);
102 127

  
103
//            DataStoreParameters storeParametersUValues = dataManager.createStoreParameters("H2Spatial");
104
//            storeParametersUValues.setDynValue("database_file",tempFile);
105
//            storeParametersUValues.setDynValue("Table","uniqueValues");
106
//            
107
            FeatureStore storeResults = (FeatureStore) dataManager.openStore("H2Spatial",storeParametersResults);
108
//            FeatureStore storeUValues = (FeatureStore) dataManager.openStore("H2Spatial",storeParametersUValues);
109
            
110
//            Pair < String, Class >[] values = new Pair [ft_inputStore.size()];
111
//            for (int i = 0; i < ft_inputStore.size(); i++) {
112
//                values[i] = new ImmutablePair<>(ft_inputStore.get(i).getName(),ft_inputStore.get(i).getDataType().getDefaultClass()); 
113
//            }
114
            
128
            // Creaci?n del Map con las funciones de agragado
115 129
            Map <String, AggregateOperation> aggregates = new HashMap <>();
116
            for (FeatureAttributeDescriptor attr : ft_inputStore) {
130
            for (FeatureAttributeDescriptor attr : ft_inputStoreNoContainer) {
117 131
                if (parameters.hasDynValue(attr.getName())){
118 132
                    String operation = (String) parameters.getDynValue(attr.getName());
119 133
                    aggregates.put(
120 134
                            attr.getName(),
121 135
                            (AggregateOperation) aggregatesOperationFactories.get(operation).create()
122 136
                    );
123
                }
124
//                switch(operation){
125
//                    case 0:
126
//                        aggregates.put(attr.getName(), new MinAggregateOperation());
127
//                        break;
128
//                    case 1:
129
//                        aggregates.put(attr.getName(), new MinAggregateOperation());
130
//                    case 2:
131
//                        aggregates.put(attr.getName(), new MinAggregateOperation());
132
//                    case 3:
133
//                        aggregates.put(attr.getName(), new MinAggregateOperation());
134
//                    case 4:
135
//                        aggregates.put(attr.getName(), new MinAggregateOperation());
136
//                        
137
//                }
138
               
137
                }                 
139 138
            }
140 139
            
140
            // distictOn
141
            
141 142
            storeResults.edit(FeatureStore.MODE_APPEND);
142
//            storeUValues.edit();
143
            
144
//            ExpressionBuilder expBuilder = ExpressionUtils.createExpressionBuilder(); // expresiones de filtrado sin preocuparse del tipo de dato
143

  
145 144
            FeatureSet features;
146 145
            if (query != null){
147 146
                features = inputStore.getFeatureSet(query);
......
160 159
                    for (Map.Entry<String, AggregateOperation> entry : aggregates.entrySet()) {
161 160
                        String name = entry.getKey();
162 161
                        AggregateOperation operation = entry.getValue();
163
                        if (operation.isApplicable(feature.get(name))){
164
                            operation.perform(feature.get(name));
162
                        Object value = feature.get(name);
163
                        if (operation.isApplicable(value)){
164
                            operation.perform(value);
165 165
                        }
166 166
                        lastFeature.set(name, operation.getValue()); 
167 167
                    }
168 168
                }else{
169
                    storeResults.insert(lastFeature);
170
                    lastFeature = storeResults.createNewFeature(feature); 
169 171
                    for (Map.Entry<String, AggregateOperation> entry : aggregates.entrySet()) {
170 172
                        String name = entry.getKey();
171 173
                        AggregateOperation operation = entry.getValue();
172 174
                        operation.reset();
173
                        if (operation.isApplicable(feature.get(name))){
174
                            operation.perform(feature.get(name));
175
                        Object value = feature.get(name);
176
                        if (operation.isApplicable(value)){
177
                            operation.perform(value);
175 178
                        }
179
                        lastFeature.set(name, operation.getValue()); 
176 180
                    }
177
                    storeResults.insert(lastFeature);
178
                    lastFeature = storeResults.createNewFeature(feature);       
179 181
                }
180 182
            }
181 183

  
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/FirstAggregateOperation.java
24 24

  
25 25
        @Override
26 26
        public boolean isApplicable(Object... value) {
27
            return Comparable.class.isAssignableFrom((Class<?>) value[0]);
27
            return true;
28 28
        }
29 29
    }
30 30
    
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
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
}
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/LastAggregateOperation.java
24 24

  
25 25
        @Override
26 26
        public boolean isApplicable(Object... value) {
27
            return Comparable.class.isAssignableFrom((Class<?>) value[0]);
27
            return true;
28 28
        }
29 29
    }
30 30
    
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
110 110
import org.gvsig.tools.dynform.DynFormLocator;
111 111
import org.gvsig.tools.dynform.JDynForm;
112 112
import org.gvsig.tools.dynobject.DynObject;
113
import org.gvsig.tools.evaluator.Evaluator;
113 114
import org.gvsig.tools.swing.api.SupportIsEnable;
114 115
import org.gvsig.tools.swing.api.SupportIsVisible;
116
import org.gvsig.tools.swing.api.ToolsSwingUtils;
115 117
import org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue;
116 118
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_GETVALUE;
117 119
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_SETVALUE;
......
1509 1511
            FeatureQuery myQuery = searchParams.getQuery().getCopy();
1510 1512
//            item.addActionListener(new SearchPostProcessListener(this.store, myQuery, manager.getSearchPostProcess(factory)));
1511 1513
            item.addActionListener((ActionEvent e) -> {
1512
                doSearchPostProcess(store, myQuery, manager.getSearchPostProcess(factory));
1514
                doSearchPostProcess(store, myQuery, manager.getSearchPostProcess(factory), searchParams );
1513 1515
            });
1514 1516
            menu.add(item);
1515 1517
        }
......
1558 1560
        final List<Feature> featuresSearchPostProccessResults;
1559 1561
        final FeatureQuery finalQuery;
1560 1562
        finalQuery = null;
1561
        try {
1563
        try {  
1562 1564
            this.tabResults.setEnabledAt(1, true);
1563 1565
            this.tabResults.setSelectedIndex(1);
1564 1566
            featuresSearchPostProccessResults = input.getFeatures(finalQuery, 20);
......
1567 1569
            // al modelo le pasamos el ftype de esas features
1568 1570
            resultPostProcessModel = new SimpleFeaturesTableModelImpl(
1569 1571
                    ftypeSearchPostProccessResults,
1570
                    null,
1572
                    this.parameters.getResultColumnNames(),
1571 1573
                    featuresSearchPostProccessResults
1572 1574
            );
1573 1575

  
......
1606 1608
        this.tblSearchPostProcessResults.setModel(new DefaultTableModel());
1607 1609
    }
1608 1610
    
1609
    private void doSearchPostProcess(FeatureStore store, FeatureQuery query, SearchPostProcessFactory factory){
1611
    private void doSearchPostProcess(FeatureStore store, FeatureQuery query, SearchPostProcessFactory factory, SearchParameters searchParams){
1610 1612
        if (factory.hasProcessParameters()) {
1611
                DynObject parametersPostProcess = factory.createProcessParameters(store);
1613
                DynObject parametersPostProcess = factory.createProcessParameters(store, query, searchParams);
1612 1614
                JDynForm form = DynFormLocator.getDynFormManager().createJDynForm(parametersPostProcess);
1613 1615
                form.setLayoutMode(JDynForm.USE_SEPARATORS);
1614 1616

  
......
1626 1628
                                }
1627 1629
                        ),
1628 1630
                        WindowManager_v2.BUTTONS_OK_CANCEL);
1629

  
1631
                
1632
                dialog.asJComponent().setPreferredSize(ToolsSwingUtils.ensureMaxRows(dialog.asJComponent(), 50));
1630 1633
                dialog.addActionListener((ActionEvent e2) -> {
1631 1634
                    if (dialog.getAction() == WindowManager_v2.BUTTON_OK) {
1632 1635
                        form.getValues(parametersPostProcess); // actualiza el valor de lo los parametros con los valores introducidos por el usuario
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/pom.xml
168 168
        <dependency>
169 169
            <groupId>org.gvsig</groupId>
170 170
            <artifactId>org.gvsig.fmap.dal.impl</artifactId>
171
            <scope>runtime</scope>
171
            <version>2.0.326-SNAPSHOT</version>
172
            <type>jar</type>
172 173
        </dependency>
173 174
        <dependency>
174 175
            <groupId>org.gvsig</groupId>

Also available in: Unified diff