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 / searchpanel / DefaultSearchParameters.java @ 46485

History | View | Annotate | Download (10.4 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.searchpanel;
7

    
8
import java.io.ByteArrayInputStream;
9
import java.io.InputStream;
10
import java.util.ArrayList;
11
import java.util.HashMap;
12
import java.util.List;
13
import java.util.Map;
14
import javax.json.Json;
15
import javax.json.JsonObject;
16
import javax.json.JsonReader;
17
import org.apache.commons.collections4.MapUtils;
18
import org.gvsig.expressionevaluator.Expression;
19
import org.gvsig.fmap.dal.exception.DataException;
20
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
21
import org.gvsig.fmap.dal.feature.FeatureQuery;
22
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
23
import org.gvsig.fmap.dal.feature.FeatureSet;
24
import org.gvsig.fmap.dal.feature.FeatureStore;
25
import org.gvsig.fmap.dal.feature.FeatureType;
26
import org.gvsig.fmap.dal.swing.searchpanel.SearchParameters;
27
import org.gvsig.tools.ToolsLocator;
28
import org.gvsig.tools.dispose.DisposeUtils;
29
import org.gvsig.tools.dynobject.DynStruct;
30
import org.gvsig.tools.persistence.PersistenceManager;
31
import org.gvsig.tools.persistence.PersistentState;
32
import org.gvsig.tools.persistence.exception.PersistenceException;
33

    
34
/**
35
 *
36
 * @author jjdelcerro
37
 */
38
public class DefaultSearchParameters implements SearchParameters, Cloneable {
39

    
40
    private List<String> resultColumnNames;
41
    private FeatureQuery query;
42
    private String name;
43
    private Map<String, JsonObject> values;
44
    private int searchMode;
45

    
46
    public DefaultSearchParameters() {
47
        this.resultColumnNames = new ArrayList<>();
48
        this.query = null;
49
        this.values = new HashMap<>();
50
        this.searchMode = DefaultSearchPanel.PANEL_SIMPLIFIED;
51
    }
52

    
53
    @Override
54
    public List<String> getResultColumnNames() {
55
        return this.resultColumnNames;
56
    }
57

    
58
    public List<String> getGroupByColumns() {
59
        return this.query.getGroupByColumns();
60
    }
61

    
62
    public Map<String, String> getAggregateFunctions() {
63
        return this.query.getAggregateFunctions();
64
    }
65

    
66
    public void setQuery(FeatureQuery query) {
67
        this.query = query;
68
    }
69

    
70
    public void setFilter(Expression exp) {
71
        this.query.setFilter(exp);
72
    }
73

    
74
    public FeatureQuery getQuery() {
75
        return this.query;
76
    }
77

    
78
    void setResultColumnNames(List<String> selectedNames) {
79
        throw new UnsupportedOperationException("Not supported yet.");
80
    }
81

    
82
    @Override
83
    public Map<String, JsonObject> getValues() {
84
        return this.values;
85
    }
86

    
87
    public static void registerPersistence() {
88
        PersistenceManager manager = ToolsLocator.getPersistenceManager();
89
        if (manager.getDefinition("SearchParameters") == null) {
90
            DynStruct definition = manager.addDefinition(DefaultSearchParameters.class,
91
                    "DefaultSearchParameters", "DefaultSearchParameters persistence definition", null, null);
92
            definition.addDynFieldList("resultColumnNames").setClassOfItems(String.class);
93
            definition.addDynFieldMap("values").setClassOfItems(String.class);
94
            definition.addDynFieldObject("query").setClassOfValue(FeatureQuery.class).setMandatory(false);
95
            definition.addDynFieldString("name").setClassOfValue(String.class);
96
            definition.addDynFieldInt("searchMode").setClassOfValue(Integer.class);
97
        }
98
    }
99

    
100
    @Override
101
    public void saveToState(PersistentState state) throws PersistenceException {
102
        state.set("resultColumnNames", this.resultColumnNames);
103
        HashMap<String, String> valuesMap = new HashMap<>();
104
        for (String key : this.values.keySet()) {
105
            JsonObject value = this.values.get(key);
106
            valuesMap.put(key, value.toString());
107
        }
108
        state.set("values", valuesMap);
109
        state.set("query", this.query);
110
        state.set("name", this.name);
111
        state.set("searchMode", this.searchMode);
112
    }
113

    
114
    @Override
115
    public void loadFromState(PersistentState state) throws PersistenceException {
116
        this.resultColumnNames = new ArrayList<>(state.getList("resultColumnNames"));
117
        Map<String, String> valuesState = state.getMap("values");
118
        HashMap<String, JsonObject> valuesMap = new HashMap<>();
119

    
120
        for (String key : valuesState.keySet()) {
121
            String value = valuesState.get(key);
122
            InputStream targetStream = new ByteArrayInputStream(value.getBytes());
123
            JsonReader reader = Json.createReader(targetStream);
124
            JsonObject jsonObject = reader.readObject();
125
            valuesMap.put(key, jsonObject);
126
        }
127

    
128
        this.values = valuesMap;
129
        this.query = (FeatureQuery) state.get("query");
130
        this.name = state.getString("name");
131
        try {
132
            this.searchMode = state.getInt("searchMode");
133
        } catch(Exception ex) {
134
            this.searchMode = DefaultSearchPanel.PANEL_SIMPLIFIED;
135
        }
136
    }
137

    
138
    @Override
139
    public String toString() {
140
        if (this.query != null) { // && this.query.getExpressionFilter() != null) {
141
            try {
142
                StringBuilder builder = new StringBuilder();
143
                if (this.query.getExpressionFilter() != null) {
144
                    builder.append(this.query.getExpressionFilter().getPhrase());
145
                }
146
                boolean has = true;
147
                for (EditableFeatureAttributeDescriptor col : this.query.getExtraColumn().getColumns()) {
148
                    if (has) {
149
                        builder.append("\n\n");
150
                        builder.append("ExtraColumn: ");
151
                        has=false;
152
                    } else {
153
                        builder.append(", ");
154
                    }
155
                    builder.append(col.getName());
156
                }
157
                
158
                has = true;
159
                for (String attributeName : this.getResultColumnNames()) {
160
                    if (has) {
161
                        builder.append("\n\n");
162
                        builder.append("ShowFields: ");
163
                        has=false;
164
                    } else {
165
                        builder.append(", ");
166
                    }
167
                    builder.append(attributeName);
168
                }
169
                
170
                has = true;
171
                for (String groupByColumn : this.getGroupByColumns()) {
172
                    if (has) {
173
                        builder.append("\n\n");
174
                        builder.append("GroupBy: ");
175
                        has=false;
176
                    } else {
177
                        builder.append(", ");
178
                    }
179
                    builder.append(groupByColumn);
180
                }
181

    
182
                has = true;
183
                for (String key : this.getAggregateFunctions().keySet()) {
184
                    if (has) {
185
                        builder.append("\n\n");
186
                        builder.append("AggregateFunctions: ");
187
                        has=false;
188
                    } else {
189
                        builder.append(", ");
190
                    }
191
                    builder.append(key);
192
                }
193
                
194
                has = true;
195
                for (FeatureQueryOrder.FeatureQueryOrderMember member : this.query.getOrder().members()) {
196
                    if (has) {
197
                        builder.append("\n\n");
198
                        builder.append("Order: ");
199
                        has=false;
200
                    } else {
201
                        builder.append(", ");
202
                    }
203
                    builder.append(member.getAttributeName());
204
                    builder.append("(");
205
                    builder.append(member.getAscending());
206
                    builder.append(")");
207
                }
208

    
209

    
210
                return builder.toString();
211
            } catch (Exception ex) {
212
                return this.getName();
213
            }
214
        } else {
215
            return this.getName();
216

    
217
        }
218
    }
219

    
220
    @Override
221
    public Object clone() throws CloneNotSupportedException {
222
        DefaultSearchParameters clone = (DefaultSearchParameters) super.clone();
223
        clone.query = this.query.getCopy();
224
        clone.resultColumnNames = new ArrayList(this.resultColumnNames);
225
        HashMap<String, JsonObject> cloneValues = new HashMap<>(this.values);
226
        clone.values = cloneValues;
227
        return clone;
228
    }
229

    
230
    public DefaultSearchParameters getCopy() {
231
        try {
232
            return (DefaultSearchParameters) this.clone();
233
        } catch (CloneNotSupportedException ex) {
234
            return null;
235
        }
236
    }
237

    
238
    @Override
239
    public void copyFrom(SearchParameters params) {
240
        this.resultColumnNames = params.getResultColumnNames();
241
        this.query = params.getQuery().getCopy();
242
        this.name = params.getName();
243
        this.values = params.getValues();
244
    }
245

    
246
    @Override
247
    public String getName() {
248
        return this.name;
249
    }
250

    
251
    @Override
252
    public void setName(String name) {
253
        this.name = name;
254
    }
255

    
256
    @Override
257
    public FeatureType getFeatureType(FeatureStore store) {
258
        FeatureSet fset = null;
259
        try {
260
            fset = store.getFeatureSet(this.query);
261
            FeatureType ft = fset.getDefaultFeatureType();
262
            return ft;
263
        } catch (DataException ex) {
264
            return store.getDefaultFeatureTypeQuietly();
265
        } finally {
266
            DisposeUtils.disposeQuietly(fset);
267
        }
268
    }
269
    
270
    public int getSearchMode()  {
271
        return this.searchMode;
272
    }
273
    
274
    public void setSearchMode(int searchMode) {
275
        this.searchMode = searchMode;
276
    }
277

    
278
    void fix(FeatureType featureType) {
279
        List<String> toRemoveAggregateColumns = new ArrayList<>();
280
        Map<String, String> aggregateFunctions = this.query.getAggregateFunctions();
281
        for (Map.Entry<String, String> aggregate : aggregateFunctions.entrySet()) {
282
            String colname = aggregate.getKey();
283
            String funcname = aggregate.getValue();
284
            if( this.query.getExtraColumn().get(colname)==null && featureType.get(colname)==null ) {
285
                toRemoveAggregateColumns.add(colname);
286
            }
287
        }
288
        for (String toRemoveAggregateColumn : toRemoveAggregateColumns) {
289
            this.query.removeAggregateFunction(toRemoveAggregateColumn);
290
        }
291
        if( this.query.getLimit()==0 ) {
292
            // Esto es por compatibilidad con querys guardados con antelacion
293
            // al cambio para hacer valido el limit 0.
294
            this.query.clearLimit();
295
        }
296
    }
297
}
298