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

History | View | Annotate | Download (10.1 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.gvsig.expressionevaluator.Expression;
18
import org.gvsig.fmap.dal.exception.DataException;
19
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
20
import org.gvsig.fmap.dal.feature.FeatureQuery;
21
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
22
import org.gvsig.fmap.dal.feature.FeatureSet;
23
import org.gvsig.fmap.dal.feature.FeatureStore;
24
import org.gvsig.fmap.dal.feature.FeatureType;
25
import org.gvsig.fmap.dal.swing.searchpanel.SearchParameters;
26
import org.gvsig.tools.ToolsLocator;
27
import org.gvsig.tools.dispose.DisposeUtils;
28
import org.gvsig.tools.dynobject.DynStruct;
29
import org.gvsig.tools.persistence.PersistenceManager;
30
import org.gvsig.tools.persistence.PersistentState;
31
import org.gvsig.tools.persistence.exception.PersistenceException;
32

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
208

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

    
216
        }
217
    }
218

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

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

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

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

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

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

    
277
    void fix(FeatureType featureType) {
278
        List<String> toRemoveAggregateColumns = new ArrayList<>();
279
        Map<String, String> aggregateFunctions = this.query.getAggregateFunctions();
280
        for (Map.Entry<String, String> aggregate : aggregateFunctions.entrySet()) {
281
            String colname = aggregate.getKey();
282
            String funcname = aggregate.getValue();
283
            if( this.query.getExtraColumn().get(colname)==null && featureType.get(colname)==null ) {
284
                toRemoveAggregateColumns.add(colname);
285
            }
286
        }
287
        for (String toRemoveAggregateColumn : toRemoveAggregateColumns) {
288
            this.query.removeAggregateFunction(toRemoveAggregateColumn);
289
        }
290
    }
291
}
292