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