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

View differences:

DistinctOn.java
5 5
 */
6 6
package org.gvsig.fmap.dal.swing.impl.searchPostProcess.distinctOn;
7 7

  
8

  
9 8
import java.io.File;
10 9
import java.util.Collection;
11 10
import java.util.HashMap;
......
36 35
import org.gvsig.fmap.dal.swing.searchPostProcess.SearchPostProcessFactory;
37 36
import org.gvsig.tools.ToolsLocator;
38 37
import org.gvsig.tools.dataTypes.DataType;
38
import org.gvsig.tools.dispose.DisposeUtils;
39 39
import org.gvsig.tools.dynobject.DynObject;
40 40
import org.gvsig.tools.folders.FoldersManager;
41
import org.gvsig.tools.i18n.I18nManager;
42
import org.gvsig.tools.task.SimpleTaskStatus;
41 43
import org.gvsig.tools.util.HasAFile;
42 44
import org.slf4j.LoggerFactory;
43 45

  
44

  
45 46
/**
46 47
 *
47 48
 * @author jovivas
48 49
 */
49
public class DistinctOn extends AbstractSearchPostProcess{
50
    
51
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(DistinctOnFactory.class);
52
    
53
    public DistinctOn (
54
        SearchPostProcessFactory factory,
55
        FeatureStore input,
56
        FeatureQuery query,
57
        DynObject parameters
58
        
59
    ){
60
        super( factory, input, query, parameters);
50
public class DistinctOn extends AbstractSearchPostProcess {
61 51

  
62
    }
52
	private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(DistinctOnFactory.class);
63 53

  
64
    
65
    @Override
66
    public  SearchPostProcessResult execute (FeatureStore inputStore, FeatureQuery query, DynObject parameters){  
67
        String uniqueFieldName;
68
        
69
        uniqueFieldName = (String) parameters.getDynValue("field");
70
        
71
        try {
72
            // crear ruta de archivo temporal
73
            FoldersManager foldersManager = ToolsLocator.getFoldersManager();
74
            File tempFile = foldersManager.getUniqueTemporaryFile("distinctOn_process_"+ UUID.randomUUID().toString());
75
            
76
            // crear SERVER STORE
77
            DataManager dataManager = DALLocator.getDataManager();
78
            JDBCServerExplorerParameters serverParameters = (JDBCServerExplorerParameters) dataManager.createServerExplorerParameters("H2Spatial");
79
            ((HasAFile) serverParameters).setFile(tempFile);
80
            JDBCServerExplorer serverExplorer = (JDBCServerExplorer) dataManager.openServerExplorer("H2Spatial",serverParameters);
54
	public DistinctOn(
55
		SearchPostProcessFactory factory,
56
		FeatureStore input,
57
		FeatureQuery query,
58
		DynObject parameters
59
	) {
60
		super(factory, input, query, parameters);
81 61

  
82
            
83
            //Crear tablas en server store
84
            JDBCNewStoreParameters parametersResults = serverExplorer.getAddParameters();
85
            parametersResults.setDynValue("Table", "results");
86
            FeatureType ft_inputStore = inputStore.getDefaultFeatureType();
87
            EditableFeatureType ft_inputStoreNoContainer = dataManager.createFeatureType();
88
            ft_inputStoreNoContainer.addAll(ft_inputStore);
89
            for (FeatureAttributeDescriptor attr : ft_inputStore) {
90
                DataType dataType = attr.getDataType();
91
                EditableFeatureAttributeDescriptor eattr = ft_inputStoreNoContainer.getEditableAttributeDescriptor(attr.getName());
92
                if (dataType.isContainer()){
93
                    ft_inputStoreNoContainer.remove(attr.getName());
94
                } 
95
                if (eattr.isComputed()){
96
                    eattr.setFeatureAttributeEmulator((FeatureAttributeEmulator) null);  
97
                }    
98
                if (eattr.isPrimaryKey()){
99
                    eattr.setIsPrimaryKey(false); 
100
                }
101
                if (!eattr.allowIndexDuplicateds()){
102
                    eattr.setAllowIndexDuplicateds(true);
103
                }                  
104
            }
105
            Map<String, EditableFeatureAttributeDescriptor> allExtraColumns = new HashMap<>();
106
            for (EditableFeatureAttributeDescriptor column : ft_inputStore.getExtraColumns().getColumns()) {
107
                allExtraColumns.put(column.getName(), column);
108
            }
109
            for (EditableFeatureAttributeDescriptor column : query.getExtraColumn().getColumns()) {
110
                allExtraColumns.put(column.getName(), column);
111
            }
112
            if (allExtraColumns.size()>0) {
113
                for (EditableFeatureAttributeDescriptor column : allExtraColumns.values()) {
114
                    DataType dataType = column.getDataType();
115
                    if (!dataType.isContainer()){
116
                        ft_inputStoreNoContainer.add(column.getName(), column.getType(), column.getSize());
117
                    } 
118
                }
119
            }
62
	}
120 63

  
121
            parametersResults.setDefaultFeatureType(ft_inputStoreNoContainer);     
64
	@Override
65
	public SearchPostProcessResult execute(FeatureStore inputStore, FeatureQuery query, DynObject parameters, SimpleTaskStatus status) {
66
		String uniqueFieldName;
122 67

  
123
            serverExplorer.add("H2Spatial", parametersResults, true);
68
		uniqueFieldName = (String) parameters.getDynValue("field");
124 69

  
125
            
126
            DataStoreParameters storeParametersResults = dataManager.createStoreParameters("H2Spatial");
127
            storeParametersResults.setDynValue("database_file",tempFile);
128
            storeParametersResults.setDynValue("Table","results");
129
            
130
            //Creaci?n del store con los resultados
131
            FeatureStore storeResults = (FeatureStore) dataManager.openStore("H2Spatial",storeParametersResults);
70
		I18nManager i18n = ToolsLocator.getI18nManager();
71
		if (status == null) {
72
			status = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus(i18n.getTranslation("_Executing_post_process"));
73
			status.setAutoremove(true);
74
			status.add();
75
		} else {
76
			status.push();
77
			status.setTitle(i18n.getTranslation("_Executing_post_process"));
78
		}
79
		status.message(i18n.getTranslation("_Creating_data_base"));
132 80

  
133
            // Creaci?n del Map con las funciones de agragado
134
            Map <String, AggregateOperation> aggregates = new HashMap <>();
135
            for (FeatureAttributeDescriptor attr : ft_inputStoreNoContainer) {
136
                if (parameters.hasDynValue(attr.getName())){
137
                    String operation = (String) parameters.getDynValue(attr.getName());
138
                    aggregates.put(
139
                            attr.getName(),
140
                            (AggregateOperation) aggregatesOperationFactories.get(operation).create()
141
                    );
142
                }                 
143
            }
144
            
145
            // distictOn
146
            
147
            storeResults.edit(FeatureStore.MODE_APPEND);
81
		try {
82
			// crear ruta de archivo temporal
83
			FoldersManager foldersManager = ToolsLocator.getFoldersManager();
84
			File tempFile = foldersManager.getUniqueTemporaryFile("distinctOn_process_" + UUID.randomUUID().toString());
148 85

  
149
            FeatureSet features;
150
            if (query != null){
151
                features = inputStore.getFeatureSet(query);
152
            }else{
153
                features = inputStore.getFeatureSet();
154
            }
155
            EditableFeature aggregateFeature = null; 
156
            for (Feature feature : features) {
157
                if (aggregateFeature != null) {
158
                    if (Objects.equals(feature.get(uniqueFieldName), aggregateFeature.get(uniqueFieldName))) {
159
                        for (Map.Entry<String, AggregateOperation> entry : aggregates.entrySet()) {
160
                            String name = entry.getKey();
161
                            AggregateOperation operation = entry.getValue();
162
                            Object value = feature.get(name);
163
                            if (operation.isApplicable(value)) {
164
                                operation.perform(value);
165
                            }
166
                            aggregateFeature.set(name, operation.getValue());
167
                        }
168
                    } else {
169
                        storeResults.insert(aggregateFeature);
170
                        aggregateFeature = null;
171
                    }
172
                }
173
                
174
                if (aggregateFeature == null) {
175
                    aggregateFeature = storeResults.createNewFeature(feature);
176
                    for (Map.Entry<String, AggregateOperation> entry : aggregates.entrySet()) {
177
                        String name = entry.getKey();
178
                        AggregateOperation operation = entry.getValue();
179
                        operation.reset();
180
                        Object value = feature.get(name);
181
                        if (operation.isApplicable(value)) {
182
                            operation.perform(value);
183
                        }
184
                        aggregateFeature.set(name, operation.getValue());
185
                    }
186
                }
86
			// crear SERVER STORE
87
			DataManager dataManager = DALLocator.getDataManager();
88
			JDBCServerExplorerParameters serverParameters = (JDBCServerExplorerParameters) dataManager.createServerExplorerParameters("H2Spatial");
89
			((HasAFile) serverParameters).setFile(tempFile);
90
			JDBCServerExplorer serverExplorer = (JDBCServerExplorer) dataManager.openServerExplorer("H2Spatial", serverParameters);
187 91

  
188
            }
189
            if (aggregateFeature!=null) {
190
                storeResults.insert(aggregateFeature);
191
            }
192
            
193
            storeResults.finishEditing();
92
			//Crear tablas en server store
93
			JDBCNewStoreParameters parametersResults = serverExplorer.getAddParameters();
94
			parametersResults.setDynValue("Table", "results");
95
			FeatureType ft_inputStore = inputStore.getDefaultFeatureType();
96
			EditableFeatureType ft_inputStoreNoContainer = dataManager.createFeatureType();
97
			ft_inputStoreNoContainer.addAll(ft_inputStore);
98
			for (FeatureAttributeDescriptor attr : ft_inputStore) {
99
				DataType dataType = attr.getDataType();
100
				EditableFeatureAttributeDescriptor eattr = ft_inputStoreNoContainer.getEditableAttributeDescriptor(attr.getName());
101
				if (dataType.isContainer()) {
102
					ft_inputStoreNoContainer.remove(attr.getName());
103
				}
104
				if (eattr.isComputed()) {
105
					eattr.setFeatureAttributeEmulator((FeatureAttributeEmulator) null);
106
				}
107
				if (eattr.isPrimaryKey()) {
108
					eattr.setIsPrimaryKey(false);
109
				}
110
				if (!eattr.allowIndexDuplicateds()) {
111
					eattr.setAllowIndexDuplicateds(true);
112
				}
113
			}
114
			Map<String, EditableFeatureAttributeDescriptor> allExtraColumns = new HashMap<>();
115
			for (EditableFeatureAttributeDescriptor column : ft_inputStore.getExtraColumns().getColumns()) {
116
				allExtraColumns.put(column.getName(), column);
117
			}
118
			for (EditableFeatureAttributeDescriptor column : query.getExtraColumn().getColumns()) {
119
				allExtraColumns.put(column.getName(), column);
120
			}
121
			if (allExtraColumns.size() > 0) {
122
				for (EditableFeatureAttributeDescriptor column : allExtraColumns.values()) {
123
					DataType dataType = column.getDataType();
124
					if (!dataType.isContainer()) {
125
						ft_inputStoreNoContainer.add(column.getName(), column.getType(), column.getSize());
126
					}
127
				}
128
			}
129

  
130
			parametersResults.setDefaultFeatureType(ft_inputStoreNoContainer);
131

  
132
			serverExplorer.add("H2Spatial", parametersResults, true);
133

  
134
			DataStoreParameters storeParametersResults = dataManager.createStoreParameters("H2Spatial");
135
			storeParametersResults.setDynValue("database_file", tempFile);
136
			storeParametersResults.setDynValue("Table", "results");
137

  
138
			//Creaci?n del store con los resultados
139
			FeatureStore storeResults = (FeatureStore) dataManager.openStore("H2Spatial", storeParametersResults);
140

  
141
			// Creaci?n del Map con las funciones de agragado
142
			Map<String, AggregateOperation> aggregates = new HashMap<>();
143
			for (FeatureAttributeDescriptor attr : ft_inputStoreNoContainer) {
144
				if (parameters.hasDynValue(attr.getName())) {
145
					String operation = (String) parameters.getDynValue(attr.getName());
146
					aggregates.put(
147
						attr.getName(),
148
						(AggregateOperation) aggregatesOperationFactories.get(operation).create()
149
					);
150
				}
151
			}
152

  
153
			// distictOn
154
			storeResults.edit(FeatureStore.MODE_APPEND);
155

  
156
			FeatureSet features;
157

  
158
			status.message(i18n.getTranslation("_Getting_features_from_query"));
159

  
160
			if (query != null) {
161
				features = inputStore.getFeatureSet(query);
162
			} else {
163
				features = inputStore.getFeatureSet();
164
			}
165
			EditableFeature aggregateFeature = null;
166

  
167
			status.message(i18n.getTranslation("_Processing_features"));
168
			status.setRangeOfValues(0, features.size());
169

  
170
			for (Feature feature : features) {
171
				if (status.isCancellationRequested()) {
172
					DisposeUtils.disposeQuietly(features);
173
					if (storeResults.isEditing()) {
174
						storeResults.cancelEditingQuietly();
175
					}
176

  
177
					status.setTitle(i18n.getTranslation("_Post_process_canceled"));
178
					status.message("");
179
					status.cancel();
180
					return null;
181
				}
182
				if (aggregateFeature != null) {
183
					if (Objects.equals(feature.get(uniqueFieldName), aggregateFeature.get(uniqueFieldName))) {
184
						for (Map.Entry<String, AggregateOperation> entry : aggregates.entrySet()) {
185
							String name = entry.getKey();
186
							AggregateOperation operation = entry.getValue();
187
							Object value = feature.get(name);
188
							if (operation.isApplicable(value)) {
189
								operation.perform(value);
190
							}
191
							aggregateFeature.set(name, operation.getValue());
192
						}
193
					} else {
194
						storeResults.insert(aggregateFeature);
195
						aggregateFeature = null;
196
					}
197
				}
198

  
199
				if (aggregateFeature == null) {
200
					aggregateFeature = storeResults.createNewFeature(feature);
201
					for (Map.Entry<String, AggregateOperation> entry : aggregates.entrySet()) {
202
						String name = entry.getKey();
203
						AggregateOperation operation = entry.getValue();
204
						operation.reset();
205
						Object value = feature.get(name);
206
						if (operation.isApplicable(value)) {
207
							operation.perform(value);
208
						}
209
						aggregateFeature.set(name, operation.getValue());
210
					}
211
				}
212
				status.incrementCurrentValue();
213
			}
214
			if (aggregateFeature != null) {
215
				storeResults.insert(aggregateFeature);
216
			}
217

  
218
			storeResults.finishEditing();
194 219
//            storeUValues.finishEditing();
195
            
196
            SearchPostProcessResult searchPostProcessResult = new DefaultSearchPostProcessResult(storeResults,null);
197
            return searchPostProcessResult;
198
               
199
        } catch (DataException | ValidateDataParametersException ex) {
200
            LOGGER.warn("Can't execute distinct on search post process.", ex);
201
        }
202
                   
203
        return null;
204
    }
205
    
206
    private static Map<String, AggregateOperationFactory> aggregatesOperationFactories = new HashMap<>();
207
    public static void registerAggregateOperation(AggregateOperationFactory aggregateOperationFactory){
208
        aggregatesOperationFactories.put(aggregateOperationFactory.getName(), aggregateOperationFactory);
209
    }
210
    
211
    public static Collection<AggregateOperationFactory> getAggregatesOperationFactories(){
212
        return aggregatesOperationFactories.values();
213
    }
214
    
215
    
216
    
220

  
221
			SearchPostProcessResult searchPostProcessResult = new DefaultSearchPostProcessResult(storeResults, null);
222
			status.setTitle(i18n.getTranslation("_Post_process_ended"));
223
			status.message("");
224
			return searchPostProcessResult;
225

  
226
		} catch (DataException | ValidateDataParametersException ex) {
227
			LOGGER.warn("Can't execute distinct on search post process.", ex);
228
		} finally {
229
			status.pop();
230
		}
231

  
232
		return null;
233
	}
234

  
235
	private static Map<String, AggregateOperationFactory> aggregatesOperationFactories = new HashMap<>();
236

  
237
	public static void registerAggregateOperation(AggregateOperationFactory aggregateOperationFactory) {
238
		aggregatesOperationFactories.put(aggregateOperationFactory.getName(), aggregateOperationFactory);
239
	}
240

  
241
	public static Collection<AggregateOperationFactory> getAggregatesOperationFactories() {
242
		return aggregatesOperationFactories.values();
243
	}
244

  
217 245
}
218

  

Also available in: Unified diff