Revision 45308

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.geometry/org.gvsig.fmap.geometry.api/src/main/java/org/gvsig/fmap/geom/GeometryUtils.java
866 866
     * @return 
867 867
     */
868 868
    public static double calculateAngle(Point vertex, Point p){
869
//        Point auxHorizontalRightPoint = GeometryUtils.createPoint(vertex.getX()+1, vertex.getY());
870
//        return calculateAngle(vertex, auxHorizontalRightPoint, p);
871 869

  
872 870
        double angle = Math.atan2(
873 871
                p.getY() - vertex.getY(), 
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/dataaccess/InsertIntoTableFunction.java
55 55
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
56 56
import org.gvsig.fmap.dal.feature.FeatureSet;
57 57
import org.gvsig.fmap.dal.feature.FeatureStore;
58
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureQueryOrder;
58 59
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
59 60
import org.gvsig.tools.dispose.DisposeUtils;
60 61
import org.gvsig.tools.exception.BaseException;
......
162 163
          String member = (String) interpreter.run(order.parameters().get(n));
163 164
          Boolean mode = (Boolean) interpreter.run(order_mode.parameters().get(n));
164 165
          if( queryOrder == null ) {
165
            queryOrder = new FeatureQueryOrder();
166
            queryOrder = new DefaultFeatureQueryOrder();
166 167
          }
167 168
          queryOrder.add(member, mode);
168 169
        }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/dataaccess/SelectFunction.java
57 57
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
58 58
import org.gvsig.expressionevaluator.Code.Callable;
59 59
import org.gvsig.expressionevaluator.spi.AbstractFunction;
60
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureQueryOrder;
60 61

  
61 62
/**
62 63
 *
......
158 159
        String member = (String) interpreter.run(order.parameters().get(n));
159 160
        Boolean mode = (Boolean) interpreter.run(order_mode.parameters().get(n));
160 161
        if( queryOrder == null ) {
161
          queryOrder = new FeatureQueryOrder();
162
          queryOrder = new DefaultFeatureQueryOrder();
162 163
        }
163 164
        queryOrder.add(member, mode);
164 165
      }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/dataaccess/UpdateFunction.java
135 135
                features = featureStore.getFeatureSet();
136 136
            } else {
137 137
                where = this.replaceLocalReferences(symbolTable, where);
138
                FeatureQuery query = featureStore.createFeatureQuery(where.toString(), null, true);
138
                FeatureQuery query = featureStore.createFeatureQuery(where.toString(), (String)null, true);
139 139
                query.retrievesAllAttributes();
140 140
                features = featureStore.getFeatureSet(query);
141 141
            }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureStore.java
24 24

  
25 25
package org.gvsig.fmap.dal.feature.impl;
26 26

  
27
import org.gvsig.fmap.dal.feature.impl.editing.memory.SpatialManager;
28
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureTypeManager;
29
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureManager;
30

  
31 27
import java.util.ArrayList;
32 28
import java.util.Collection;
33 29
import java.util.Collections;
......
39 35
import java.util.Map.Entry;
40 36
import java.util.Set;
41 37
import javax.json.JsonObject;
42

  
43 38
import org.apache.commons.io.FilenameUtils;
44 39
import org.apache.commons.io.IOUtils;
45 40
import org.apache.commons.lang3.StringUtils;
......
50 45
import org.gvsig.expressionevaluator.ExpressionUtils;
51 46
import org.gvsig.expressionevaluator.GeometryExpressionUtils;
52 47
import org.gvsig.fmap.dal.BaseStoresRepository;
53

  
54 48
import org.gvsig.fmap.dal.DALLocator;
55 49
import org.gvsig.fmap.dal.DataManager;
56 50
import org.gvsig.fmap.dal.DataQuery;
......
89 83
import org.gvsig.fmap.dal.feature.FeatureStore;
90 84
import org.gvsig.fmap.dal.feature.FeatureStoreNotification;
91 85
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
86
import org.gvsig.fmap.dal.feature.FeatureStoreTimeSupport;
87
import org.gvsig.fmap.dal.feature.FeatureStoreTransform;
92 88
import org.gvsig.fmap.dal.feature.FeatureStoreTransforms;
93 89
import org.gvsig.fmap.dal.feature.FeatureType;
90
import org.gvsig.fmap.dal.feature.FeatureType.FeatureTypeChanged;
94 91
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
95
import org.gvsig.fmap.dal.feature.FeatureStoreTimeSupport;
96
import org.gvsig.fmap.dal.feature.FeatureStoreTransform;
97
import org.gvsig.fmap.dal.feature.FeatureType.FeatureTypeChanged;
98 92
import org.gvsig.fmap.dal.feature.exception.AlreadyEditingException;
99 93
import org.gvsig.fmap.dal.feature.exception.ConcurrentDataModificationException;
100 94
import org.gvsig.fmap.dal.feature.exception.CreateFeatureException;
......
120 114
import org.gvsig.fmap.dal.feature.exception.StoreUpdateFeatureTypeException;
121 115
import org.gvsig.fmap.dal.feature.exception.ValidateFeaturesException;
122 116
import org.gvsig.fmap.dal.feature.exception.WriteNotAllowedException;
117
import org.gvsig.fmap.dal.feature.impl.dynobjectutils.DynObjectFeatureFacade;
118
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureManager;
119
import org.gvsig.fmap.dal.feature.impl.editing.memory.FeatureTypeManager;
120
import org.gvsig.fmap.dal.feature.impl.editing.memory.SpatialManager;
123 121
import org.gvsig.fmap.dal.feature.impl.featureset.DefaultFeatureSet;
124
import org.gvsig.fmap.dal.feature.impl.dynobjectutils.DynObjectFeatureFacade;
125 122
import org.gvsig.fmap.dal.feature.impl.undo.DefaultFeatureCommandsStack;
126 123
import org.gvsig.fmap.dal.feature.impl.undo.FeatureCommandsStack;
127 124
import org.gvsig.fmap.dal.feature.paging.FeaturePagingHelper;
......
166 163
import org.gvsig.tools.persistence.Persistent;
167 164
import org.gvsig.tools.persistence.PersistentState;
168 165
import org.gvsig.tools.persistence.exception.PersistenceException;
166
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
169 167
import org.gvsig.tools.undo.RedoException;
170 168
import org.gvsig.tools.undo.UndoException;
171 169
import org.gvsig.tools.undo.command.Command;
172 170
import org.gvsig.tools.util.HasAFile;
173
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
174 171
import org.gvsig.tools.util.UnmodifiableBasicMap;
175 172
import org.gvsig.tools.visitor.VisitCanceledException;
176 173
import org.gvsig.tools.visitor.Visitor;
......
2078 2075
    
2079 2076
    @Override
2080 2077
    public Feature findFirst(String filter) throws DataException {
2081
        return this.findFirst(filter, null, true);
2078
        return this.findFirst(filter, (String)null, true);
2082 2079
    }
2083 2080

  
2084 2081
    @Override
......
2091 2088
        FeatureQuery query = this.createFeatureQuery(filter, sortBy, asc);
2092 2089
        return findFirst(query);
2093 2090
    }
2091

  
2092
    @Override
2093
    public Feature findFirst(String filter, Expression sortBy, boolean asc) throws DataException {
2094
        FeatureQuery query = this.createFeatureQuery(filter, sortBy, asc);
2095
        return findFirst(query);
2096
    }
2094 2097
    
2095 2098
    @Override
2096 2099
    public Feature findFirst(Expression filter) throws DataException {
2097
        return this.findFirst(filter, null, true);
2100
        return this.findFirst(filter, (String)null, true);
2098 2101
    }
2099 2102

  
2100 2103
    @Override
......
2109 2112
    }
2110 2113
    
2111 2114
    @Override
2115
    public Feature findFirst(Expression filter, Expression sortBy, boolean asc) throws DataException {
2116
        FeatureQuery query = this.createFeatureQuery(filter, sortBy, asc);
2117
        return findFirst(query);
2118
    }
2119
    
2120
    @Override
2112 2121
    public Feature findFirst(FeatureQuery query) throws DataException {
2113 2122
        if( query == null ) {
2114 2123
            query = this.createFeatureQuery();
......
2665 2674
        return new DefaultFeatureQuery();
2666 2675
    }
2667 2676
    
2677
    @Override
2668 2678
    public FeatureQuery createFeatureQuery(Expression filter, String sortBy, boolean asc) {
2669 2679
        FeatureQuery query = null;
2670 2680
        if( filter!=null ) {
......
2675 2685
            if( query == null ) {
2676 2686
                query = this.createFeatureQuery();
2677 2687
            }
2688
            if ( StringUtils.containsAny(sortBy, "(", ")") ) {
2689
                throw new IllegalArgumentException("Incorrect sortBy expression");
2690
            }
2678 2691
            String[] attrnames;
2679 2692
            if( sortBy.contains(",") ) {
2680 2693
                attrnames = StringUtils.split(sortBy, ",");
......
2702 2715
        return query;
2703 2716
    }
2704 2717
    
2718
    @Override
2705 2719
    public FeatureQuery createFeatureQuery(String filter, String sortBy, boolean asc) {
2706 2720
        if( StringUtils.isBlank(filter) ) {
2707 2721
            return this.createFeatureQuery(
......
2718 2732
        }
2719 2733
    }
2720 2734
    
2735
    public FeatureQuery createFeatureQuery(Expression filter, Expression sortBy, boolean asc) {
2736
        FeatureQuery query = null;
2737
        if( filter != null ) {
2738
            query = this.createFeatureQuery();
2739
            query.setFilter(filter);
2740
        }
2741
        if( sortBy !=  null) {
2742
            if( query == null ) {
2743
                query = this.createFeatureQuery();
2744
            }
2745
            query.getOrder().add(sortBy, asc);
2746
        }
2747
        
2748
        if( query != null ) {
2749
            query.retrievesAllAttributes();
2750
        }
2751
        return query;
2752
    }
2753
    
2754
    public FeatureQuery createFeatureQuery(String filter, Expression sortBy, boolean asc) {
2755
        if( StringUtils.isBlank(filter) ) {
2756
            return this.createFeatureQuery(
2757
                    (Expression)null, 
2758
                    sortBy, 
2759
                    asc
2760
            );
2761
        } else {
2762
            return this.createFeatureQuery(
2763
                    ExpressionUtils.createExpression(filter), 
2764
                    sortBy, 
2765
                    asc
2766
            );
2767
        }
2768
    }
2769
    
2721 2770
    @Override
2722 2771
    public DataQuery createQuery() {
2723 2772
        return createFeatureQuery();
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureQueryOrder.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.dal.feature.impl;
24

  
25
import java.util.ArrayList;
26
import java.util.Collections;
27
import java.util.Comparator;
28
import java.util.Iterator;
29
import java.util.List;
30
import java.util.NoSuchElementException;
31
import org.apache.commons.lang3.StringUtils;
32
import org.gvsig.expressionevaluator.Expression;
33
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
34
import org.gvsig.fmap.dal.feature.Feature;
35
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
36
import org.gvsig.fmap.dal.impl.expressionevaluator.DefaultExpressionEvaluator;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.dynobject.DynStruct;
39
import org.gvsig.tools.evaluator.Evaluator;
40
import org.gvsig.tools.evaluator.EvaluatorData;
41
import org.gvsig.tools.evaluator.EvaluatorException;
42
import org.gvsig.tools.persistence.Persistent;
43
import org.gvsig.tools.persistence.PersistentState;
44
import org.gvsig.tools.persistence.exception.PersistenceException;
45
import org.slf4j.LoggerFactory;
46

  
47
public class DefaultFeatureQueryOrder implements FeatureQueryOrder {
48

  
49
    public static class FeatureQueryOrderMemberImpl implements FeatureQueryOrderMember {
50

  
51
        String attributeName = null;
52
        Evaluator evaluator = null;
53
//        Expression expression = null;
54
        boolean ascending;
55

  
56
        private final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(FeatureQueryOrderMember.class);
57

  
58
        public FeatureQueryOrderMemberImpl() {
59

  
60
        }
61
        
62
        FeatureQueryOrderMemberImpl(String attributeName, boolean ascending) {
63
            this.attributeName = attributeName;
64
            this.ascending = ascending;
65
        }
66

  
67
        FeatureQueryOrderMemberImpl(Evaluator evaluator, boolean ascending) {
68
            this.evaluator = evaluator;
69
            LOGGER.warn("Creating evaluator that will not be able to persist");
70
            this.ascending = ascending;
71
        }
72

  
73
        @Override
74
        public String toString() {
75
            if (this.evaluator != null) {
76
                return this.evaluator.getSQL() + " " + (this.ascending ? "ASC" : "DESC");
77
            }
78
            return (this.ascending ? "+" : "-") + this.attributeName;
79
        }
80

  
81
        public boolean hasEvaluator() {
82
            return this.evaluator != null;
83
        }
84

  
85
        public Evaluator getEvaluator() {
86
            return this.evaluator;
87
        }
88

  
89
        public boolean getAscending() {
90
            return this.ascending;
91
        }
92

  
93
        public String getAttributeName() {
94
            return this.attributeName;
95
        }
96

  
97
        @Override
98
        public void loadFromState(PersistentState state)
99
                throws PersistenceException {
100
            this.attributeName = state.getString("attributeName");
101
            this.ascending = state.getBoolean("ascending");
102
            this.evaluator = (Evaluator) state.get("evaluator");
103
        }
104

  
105
        @Override
106
        public void saveToState(PersistentState state)
107
                throws PersistenceException {
108
            state.set("attributeName", this.attributeName);
109
            state.set("ascending", this.ascending);
110
            if(evaluator instanceof Persistent){
111
                state.set("evaluator", evaluator);
112
            } else {
113
                state.setNull("evaluator");
114
            }
115
        }
116

  
117
        @Override
118
        public FeatureQueryOrderMember clone() throws CloneNotSupportedException {
119
            // Nothing more to clone
120
            return (FeatureQueryOrderMember) super.clone();
121
        }
122

  
123
        public void setAscending(boolean ascending) {
124
            this.ascending = ascending;
125
        }
126

  
127
    }
128

  
129
    private List<FeatureQueryOrderMember> members = new ArrayList();
130
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(DefaultFeatureQueryOrder.class);
131

  
132
    public DefaultFeatureQueryOrder() {
133
    }
134

  
135
    public void copyFrom(FeatureQueryOrder other) {
136
        List<FeatureQueryOrderMember> theMembers = new ArrayList<>();
137
        for (FeatureQueryOrderMember member : other) {
138
            FeatureQueryOrderMember m;
139
            try {
140
                m = member.clone();
141
            } catch (CloneNotSupportedException ex) {
142
                throw new RuntimeException("Can't copy member (" + member.toString() + ").", ex);
143
            }
144
            theMembers.add(m);
145
        }
146
        this.members = theMembers;
147
    }
148

  
149
    @Override
150
    public String toString() {
151
        StringBuilder builder = new StringBuilder();
152
        boolean needComma = false;
153
        for (FeatureQueryOrderMember member : members) {
154
            if (member != null && !StringUtils.isBlank(member.getAttributeName())) {
155
                if (needComma) {
156
                    builder.append(",");
157
                }
158
                builder.append(member.toString());
159
                needComma = true;
160
            }
161
        }
162
        String s = builder.toString();
163
        if (StringUtils.isBlank(s)) {
164
            return null;
165
        }
166
        return s;
167
    }
168

  
169
    public Object add(String order) {
170
        if (StringUtils.isEmpty(order)) {
171
            return null;
172
        }
173
        Object r = null;
174
        String[] attributes = StringUtils.split(order, ',');
175
        for (String attribute : attributes) {
176
            boolean ascending = true;
177
            if (attribute.startsWith("+")) {
178
                ascending = true;
179
                attribute = attribute.substring(1);
180
            } else if (attribute.startsWith("-")) {
181
                ascending = false;
182
                attribute = attribute.substring(1);
183
            }
184
            attribute = attribute.trim();
185
            r = this.add(attribute, ascending);
186
        }
187
        return r;
188
    }
189

  
190
    public Object add(String attributeName, boolean ascending) {
191
        FeatureQueryOrderMember member = new FeatureQueryOrderMemberImpl(
192
                attributeName, ascending);
193
        if (members.add(member)) {
194
            return member;
195
        }
196
        return null;
197
    }
198

  
199
    public Object add(Expression expr, boolean ascending) {
200
        
201
        Evaluator evaluator = new DefaultExpressionEvaluator(expr);
202
        FeatureQueryOrderMember member = new FeatureQueryOrderMemberImpl(
203
                evaluator,
204
                ascending);
205
        if (members.add(member)) {
206
            return member;
207
        }
208
        return null;
209
        
210
    }
211
    
212
    public Iterable<FeatureQueryOrderMember> members() {
213
        //    Me hubiese gustado que FeatureQueryOrder fuese Iterable, pero no se deja por 
214
        //    que FeatureQueryOrderMember es una clase interna y no esta definida en el 
215
        //    momento de poner el :
216
        //            implements Iterable<FeatureQueryOrderMember>
217
        //    Y si saco a una clase independiente FeatureQueryOrderMember se pierde 
218
        //    compatibilidad binaria con quien la esta usando.
219
        //    Para rodearlo, he creado el metodo members.
220
        return new Iterable<FeatureQueryOrderMember>() {
221

  
222
            @Override
223
            public Iterator<FeatureQueryOrderMember> iterator() {
224
                return DefaultFeatureQueryOrder.this.iterator();
225
            }
226
        };
227
    }
228

  
229
    public Iterator<FeatureQueryOrderMember> iterator() {
230
        if (members == null) {
231
            return new Iterator<FeatureQueryOrderMember>() {
232
                @Override
233
                public boolean hasNext() {
234
                    return false;
235
                }
236

  
237
                @Override
238
                public FeatureQueryOrderMember next() {
239
                    throw new NoSuchElementException();
240
                }
241

  
242
                @Override
243
                public void remove() {
244
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
245
                }
246
            };
247
        }
248
        return members.iterator();
249
    }
250

  
251
    public boolean remove(FeatureQueryOrderMember member) {
252
        return members.remove(member);
253
    }
254

  
255
    public void remove(int index) {
256
        members.remove(index);
257
    }
258

  
259
    public void clear() {
260
        members.clear();
261
    }
262

  
263
    public int size() {
264
        return this.members.size();
265
    }
266

  
267
    public int getIndex(String attributeName) {
268
        int n = 0;
269
        for (FeatureQueryOrderMember member : members) {
270
            if (member != null && StringUtils.equalsIgnoreCase(attributeName, member.getAttributeName())) {
271
                return n;
272
            }
273
            n++;
274
        }
275
        return -1;
276
    }
277

  
278
    public void movePrevious(String name) {
279
        int n = this.getIndex(name);
280
        if (n < 1) {
281
            return;
282
        }
283
        Collections.swap(members, n, n - 1);
284
    }
285

  
286
    public void moveNext(String name) {
287
        int n = this.getIndex(name);
288
        if (n >= this.members.size() - 1) {
289
            return;
290
        }
291
        Collections.swap(members, n, n + 1);
292
    }
293

  
294
    public boolean isEmpty() {
295
        return this.members == null || this.members.isEmpty();
296
    }
297

  
298
    public FeatureQueryOrderMember get(String attributeName) {
299
        for (FeatureQueryOrderMember member : members) {
300
            if (member != null && StringUtils.equalsIgnoreCase(attributeName, member.getAttributeName())) {
301
                return member;
302
            }
303
        }
304
        return null;
305
    }
306

  
307
    public boolean contains(String attributeName) {
308
        for (FeatureQueryOrderMember member : members) {
309
            if (member != null && StringUtils.equalsIgnoreCase(attributeName, member.getAttributeName())) {
310
                return true;
311
            }
312
        }
313
        return false;
314
    }
315

  
316
    public Comparator<Feature> getFeatureComparator() {
317
        return new DefaultFeatureComparator(this);
318
    }
319

  
320
    @Override
321
    public DefaultFeatureQueryOrder clone() throws CloneNotSupportedException {
322
        DefaultFeatureQueryOrder clone = (DefaultFeatureQueryOrder) super.clone();
323

  
324
        if (members != null) {
325
            clone.members = new ArrayList(members.size());
326
            for (int i = 0; i < members.size(); i++) {
327
                clone.members.add((members.get(i)).clone());
328
            }
329
        }
330

  
331
        return clone;
332
    }
333

  
334
    public DefaultFeatureQueryOrder getCopy() {
335
        DefaultFeatureQueryOrder aCopy = new DefaultFeatureQueryOrder();
336
        Iterator iter = this.members.iterator();
337
        FeatureQueryOrderMember member;
338
        while (iter.hasNext()) {
339
            member = (FeatureQueryOrderMember) iter.next();
340
            if (member.hasEvaluator()) {
341
//                aCopy.add(member.getEvaluator(), member.getAscending());
342
                LOGGER.warn("Evaluator is not being added to the filter in a class copy");
343
            } else {
344
                aCopy.add(member.getAttributeName(), member.getAscending());
345
            }
346
        }
347
        return aCopy;
348
    }
349

  
350
    /**
351
     * Register the class on PersistenceManager
352
     *
353
     */
354
    public static void registerPersistent() {
355
        DynStruct definitionMember
356
                = ToolsLocator.getPersistenceManager()
357
                        .addDefinition(FeatureQueryOrderMember.class,
358
                                "FeatureQueryOrderMember",
359
                                "FeatureQueryOrderMember Persistent definition",
360
                                null,
361
                                null);
362

  
363
        definitionMember.addDynFieldString("attributeName").setClassOfValue(String.class).setMandatory(false);
364
        definitionMember.addDynFieldObject("expression").setClassOfValue(Expression.class).setMandatory(false);
365
        definitionMember.addDynFieldBoolean("ascending").setMandatory(false);
366

  
367
        DynStruct definition
368
                = ToolsLocator.getPersistenceManager()
369
                        .addDefinition(DefaultFeatureQueryOrder.class,
370
                                "FeatureQueryOrder",
371
                                "FeatureQueryOrder Persistent definition",
372
                                null,
373
                                null);
374

  
375
        definition.addDynFieldList("members").setClassOfItems(FeatureQueryOrderMember.class);
376

  
377
    }
378

  
379
    @Override
380
    public void loadFromState(PersistentState state)
381
            throws PersistenceException {
382
        List<FeatureQueryOrderMember> stateMembers = (List) state.get("members");
383
        this.members = new ArrayList<>();
384
        for (FeatureQueryOrderMember stateMember : stateMembers) {
385
            this.members.add(stateMember);
386
        }
387
    }
388

  
389
    @Override
390
    public void saveToState(PersistentState state) throws PersistenceException {
391
        state.set("members", members);
392

  
393
    }
394

  
395
    private class DefaultFeatureComparator implements Comparator<Feature> {
396

  
397
        private final DefaultFeatureQueryOrder order;
398

  
399
        public DefaultFeatureComparator(DefaultFeatureQueryOrder order) {
400
            this.order = order;
401
            // TODO optimizar en un array???
402

  
403
        }
404

  
405
        private int myCompare(Object arg0, Object arg1) {
406
            if (arg0 == null) {
407
                if (arg1 == null) {
408
                    return 0;
409
                } else {
410
                    return 1;
411
                }
412
            } else if (arg1 == null) {
413
                if (arg0 == null) {
414
                    return 0;
415
                } else {
416
                    return 1;
417
                }
418
            }
419
            if (arg0 instanceof Comparable) {
420
                return ((Comparable) arg0).compareTo(arg1);
421
            } else if (arg1 instanceof Comparable) {
422
                return ((Comparable) arg1).compareTo(arg0) * -1;
423
            }
424

  
425
            if (arg0.equals(arg1)) {
426
                return 0;
427
            } else {
428
                return -1;
429
            }
430

  
431
        }
432

  
433
        @Override
434
        public int compare(Feature f0, Feature f1) {
435
            Iterator iter = this.order.iterator();
436
            int returnValue = 0;
437
//            Feature f0 = (Feature) arg0;
438
//            Feature f1 = (Feature) arg1;
439
            Object item;
440
            String attrName;
441
            Evaluator evaluator;
442
            while (returnValue == 0 && iter.hasNext()) {
443
                item = iter.next();
444
                if (item instanceof String) {
445
                    attrName = (String) item;
446
                    returnValue = this
447
                            .myCompare(f0.get(attrName), f1
448
                                    .get(attrName));
449
                } else {
450
                    evaluator = (Evaluator) item;
451
                    try {
452
                        returnValue = this.myCompare(evaluator
453
                                .evaluate((EvaluatorData) f0), evaluator
454
                                .evaluate((EvaluatorData) f1));
455
                    } catch (EvaluatorException e) {
456
                        throw new DataEvaluatorRuntimeException(e);
457
                    }
458
                }
459
            }
460

  
461
            return returnValue;
462
        }
463

  
464
    }
465

  
466
}
0 467

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/feature/impl/DefaultFeatureQuery.java
100 100

  
101 101
    private Evaluator filter;
102 102

  
103
    private FeatureQueryOrder order = new FeatureQueryOrder();
103
    private FeatureQueryOrder order = new DefaultFeatureQueryOrder();
104 104

  
105 105
    private long limit;
106 106

  
......
457 457

  
458 458
    @Override
459 459
    public void setOrder(FeatureQueryOrder order) {
460
        this.order = order;
460
        if(order == null){
461
            this.order = new DefaultFeatureQueryOrder();
462
        } else {
463
            this.order = order;
464
        }
461 465
    }
462 466

  
463 467
    @Override
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.impl/src/main/java/org/gvsig/fmap/dal/impl/DALDefaultImplLibrary.java
39 39
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureAttributeDescriptor;
40 40
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureExtraColumns;
41 41
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureQuery;
42
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureQueryOrder;
42 43
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureReference;
43 44
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureReferenceSelection;
44 45
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureSelection;
......
123 124
        
124 125
        
125 126
        DefaultFeatureQuery.registerPersistent();
127
        DefaultFeatureQueryOrder.registerPersistent();
126 128
        DefaultFeatureReference.registerPersistent();
127 129
        DefaultFeatureStoreTransforms.registerPersistent();
128 130
        AbstractFeatureStoreTransform.registerPersistent();
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/featuretable/table/DefaultFeatureTableModel.java
436 436
    public void setColumnOrder(String name, boolean ascending)
437 437
        throws BaseException {
438 438
        FeatureQueryOrder order = this.getFeatureQuery().getOrder();
439
        if (order == null) {
440
            order = new FeatureQueryOrder();
441
            this.getFeatureQuery().setOrder(order);
442
        }
443 439
        order.clear();
444 440
        order.add(name, ascending);
445 441
        this.getFeaturePager().reload();
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/FeatureStore.java
239 239
     */
240 240
    public FeatureQuery createFeatureQuery(Expression filter, String sortBy, boolean asc);
241 241
        
242
    /** 
243
     * Create a {@link FeatureQuery} with the restrictions indicateds.
244
     * 
245
     * "filter" will be null or {@link Expression} valid for the store.
246
     * 
247
     * "sortBy" can be null to use the store's default order.
248
     * 
249
     * The parameter sortBy can be an attribute name or a comma separated list. 
250
     * Each attribute name can be preceded or followed by "+" or "-" to indicate 
251
     * the order to use to sort by that attribute. 
252
     * 
253
     * If no "+" or "-" is indicated, the "asc" parameter will be used to 
254
     * determine if the order is ascending, "true" or decent, "false".
255
     * 
256
     * @param filter an {@link String} expression used to filter the features in the store.
257
     * @param sortBy expression used to order the features in the store.
258
     * @param asc use order ascending, true, or descending, false.
259
     * @return a {@link FeatureQuery} with the restrictions.
260
     * @see {@link FeatureQuery}
261
     */
262
    public FeatureQuery createFeatureQuery(Expression filter, Expression sortBy, boolean asc);
263
    
264
    /** 
265
     * Create a {@link FeatureQuery} with the restrictions indicateds.
266
     * 
267
     * "filter" will be null or {@link Expression} valid for the store.
268
     * 
269
     * "sortBy" can be null to use the store's default order.
270
     * 
271
     * The parameter sortBy can be an attribute name or a comma separated list. 
272
     * Each attribute name can be preceded or followed by "+" or "-" to indicate 
273
     * the order to use to sort by that attribute. 
274
     * 
275
     * If no "+" or "-" is indicated, the "asc" parameter will be used to 
276
     * determine if the order is ascending, "true" or decent, "false".
277
     * 
278
     * @param filter an {@link String} expression used to filter the features in the store.
279
     * @param sortBy expression used to order the features in the store.
280
     * @param asc use order ascending, true, or descending, false.
281
     * @return a {@link FeatureQuery} with the restrictions.
282
     * @see {@link FeatureQuery}
283
     */
284
    public FeatureQuery createFeatureQuery(String filter, Expression sortBy, boolean asc);
285

  
286
    
287
    
242 288
    /**
243 289
     * Returns all available features in the store.
244 290
     *
......
546 592
     */
547 593
    public Feature findFirst(String filter, String sortBy, boolean asc) throws DataException;
548 594

  
595
    
549 596
    /**
550 597
     * Returns the first {@link Feature} that meets the criteria indicated.
551 598
     * 
552 599
     * It is a utility method that calls {@link #findFirst(FeatureQuery)}.
553 600
     * 
554 601
     * @param filter {@link String} expression used to filter the features.
602
     * @param sortBy Expression
603
     * @param asc use order ascending, true, or descending, false.
555 604
     * @return the first {@link Feature} or null if the filter don't return any feature.
556 605
     * @throws DataException 
606
     * @see {@link #findFirst(FeatureQuery)}, {@link #createFeatureQuery(String,String,boolean)}
607
     */
608
    public Feature findFirst(String filter, Expression sortBy, boolean asc) throws DataException;
609

  
610
    /**
611
     * Returns the first {@link Feature} that meets the criteria indicated.
612
     * 
613
     * It is a utility method that calls {@link #findFirst(FeatureQuery)}.
614
     * 
615
     * @param filter {@link String} expression used to filter the features.
616
     * @return the first {@link Feature} or null if the filter don't return any feature.
617
     * @throws DataException 
557 618
     * @see {@link #findFirst(FeatureQuery)}, {@link #createFeatureQuery(Expession,String,boolean)}
558 619
     */
559 620
    public Feature findFirst(Expression filter) throws DataException;
......
590 651
     * 
591 652
     * It is a utility method that calls {@link #findFirst(FeatureQuery)}.
592 653
     * 
654
     * @param filter {@link String} expression used to filter the features.
655
     * @param sortBy expression used to sort features
656
     * @param asc use order ascending, true, or descending, false.
657
     * @return the first {@link Feature} or null if the filter don't return any feature.
658
     * @throws DataException 
659
     * @see {@link #findFirst(FeatureQuery)}, {@link #createFeatureQuery(Expession,String,boolean)}
660
     */
661
    public Feature findFirst(Expression filter, Expression sortBy, boolean asc) throws DataException;
662

  
663
    /**
664
     * Returns the first {@link Feature} that meets the criteria indicated.
665
     * 
666
     * It is a utility method that calls {@link #findFirst(FeatureQuery)}.
667
     * 
593 668
     * @param query to filter and sort the returned feature list
594 669
     * @return the first {@link Feature} or null if the filter don't return any feature.
595 670
     * @throws DataException 
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/FeatureQueryOrder.java
22 22
 */
23 23
package org.gvsig.fmap.dal.feature;
24 24

  
25
import java.util.ArrayList;
26
import java.util.Collections;
27
import java.util.Comparator;
28 25
import java.util.Iterator;
29
import java.util.List;
30
import java.util.NoSuchElementException;
31
import org.apache.commons.lang3.StringUtils;
32 26
import org.gvsig.expressionevaluator.Expression;
33

  
34
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
35
import org.gvsig.tools.ToolsLocator;
36
import org.gvsig.tools.dynobject.DynStruct;
27
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
37 28
import org.gvsig.tools.evaluator.Evaluator;
38
import org.gvsig.tools.evaluator.EvaluatorData;
39
import org.gvsig.tools.evaluator.EvaluatorException;
40 29
import org.gvsig.tools.lang.Cloneable;
41 30
import org.gvsig.tools.persistence.Persistent;
42
import org.gvsig.tools.persistence.PersistentState;
43
import org.gvsig.tools.persistence.exception.PersistenceException;
44
import org.slf4j.LoggerFactory;
45 31

  
46
public class FeatureQueryOrder implements Persistent, Cloneable {
32
/**
33
 *
34
 * @author fdiaz
35
 */
36
public interface FeatureQueryOrder extends Cloneable, Iterable<FeatureQueryOrderMember>, Persistent {
47 37

  
48
    public static class FeatureQueryOrderMember implements Persistent, org.gvsig.tools.lang.Cloneable {
38
    public interface FeatureQueryOrderMember extends Persistent, Cloneable {
49 39

  
50
        String attributeName = null;
51
        Evaluator evaluator = null;
52
        Expression expression = null;
53
        boolean ascending;
40
        FeatureQueryOrderMember clone() throws CloneNotSupportedException;
54 41

  
55
        private final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(FeatureQueryOrderMember.class);
42
        boolean getAscending();
56 43

  
57
        public FeatureQueryOrderMember() {
44
        String getAttributeName();
58 45

  
59
        }
60
        
61
        FeatureQueryOrderMember(String attributeName, boolean ascending) {
62
            this.attributeName = attributeName;
63
            this.ascending = ascending;
64
        }
46
        Evaluator getEvaluator();
65 47

  
66
        FeatureQueryOrderMember(Evaluator evaluator, boolean ascending) {
67
            this.evaluator = evaluator;
68
            LOGGER.warn("Creating evaluator that will not be able to persist");
69
            this.ascending = ascending;
70
        }
48
        boolean hasEvaluator();
71 49

  
72
        @Override
73
        public String toString() {
74
            if (this.evaluator != null) {
75
                return this.evaluator.getSQL() + " " + (this.ascending ? "ASC" : "DESC");
76
            }
77
            return (this.ascending ? "+" : "-") + this.attributeName;
78
        }
50
        void setAscending(boolean ascending);
79 51

  
80
        public boolean hasEvaluator() {
81
            return this.evaluator != null;
82
        }
83

  
84
        public Evaluator getEvaluator() {
85
            return this.evaluator;
86
        }
87

  
88
        public boolean getAscending() {
89
            return this.ascending;
90
        }
91

  
92
        public String getAttributeName() {
93
            return this.attributeName;
94
        }
95

  
96
        @Override
97
        public void loadFromState(PersistentState state)
98
                throws PersistenceException {
99
            this.attributeName = state.getString("attributeName");
100
            this.ascending = state.getBoolean("ascending");
101
            // Note: evaluator dont persist
102
//            this.evaluator = (Evaluator) state.get("evaluator");
103
//            this.expression = (Expression) state.get("expression");
104
        }
105

  
106
        @Override
107
        public void saveToState(PersistentState state)
108
                throws PersistenceException {
109
            state.set("attributeName", this.attributeName);
110
            state.set("ascending", this.ascending);
111
//            if (this.evaluator != null) {
112
//                state.set("evaluator", evaluator);
113
//            }
114
//            state.set("expression", this.expression);
115

  
116
        }
117

  
118
        @Override
119
        public FeatureQueryOrderMember clone() throws CloneNotSupportedException {
120
            // Nothing more to clone
121
            return (FeatureQueryOrderMember) super.clone();
122
        }
123

  
124
        public void setAscending(boolean ascending) {
125
            this.ascending = ascending;
126
        }
127

  
128 52
    }
129 53

  
130
    private List<FeatureQueryOrderMember> members = new ArrayList();
131
    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(FeatureQueryOrder.class);
54
    Object add(String order);
132 55

  
133
    public FeatureQueryOrder() {
134
    }
56
    Object add(String attributeName, boolean ascending);
135 57

  
136
    public void copyFrom(FeatureQueryOrder other) {
137
        List<FeatureQueryOrderMember> theMembers = new ArrayList<>();
138
        for (FeatureQueryOrderMember member : other.members) {
139
            FeatureQueryOrderMember m;
140
            try {
141
                m = member.clone();
142
            } catch (CloneNotSupportedException ex) {
143
                throw new RuntimeException("Can't copy member (" + member.toString() + ").", ex);
144
            }
145
            theMembers.add(m);
146
        }
147
        this.members = theMembers;
148
    }
58
    Object add(Expression expr, boolean ascending);
149 59

  
150
    @Override
151
    public String toString() {
152
        StringBuilder builder = new StringBuilder();
153
        boolean needComma = false;
154
        for (FeatureQueryOrderMember member : members) {
155
            if (member != null && !StringUtils.isBlank(member.getAttributeName())) {
156
                if (needComma) {
157
                    builder.append(",");
158
                }
159
                builder.append(member.toString());
160
                needComma = true;
161
            }
162
        }
163
        String s = builder.toString();
164
        if (StringUtils.isBlank(s)) {
165
            return null;
166
        }
167
        return s;
168
    }
60
    void clear();
169 61

  
170
    public Object add(String order) {
171
        if (StringUtils.isEmpty(order)) {
172
            return null;
173
        }
174
        Object r = null;
175
        String[] attributes = StringUtils.split(order, ',');
176
        for (String attribute : attributes) {
177
            boolean ascending = true;
178
            if (attribute.startsWith("+")) {
179
                ascending = true;
180
                attribute = attribute.substring(1);
181
            } else if (attribute.startsWith("-")) {
182
                ascending = false;
183
                attribute = attribute.substring(1);
184
            }
185
            attribute = attribute.trim();
186
            r = this.add(attribute, ascending);
187
        }
188
        return r;
189
    }
62
    FeatureQueryOrder clone() throws CloneNotSupportedException;
190 63

  
191
    public Object add(String attributeName, boolean ascending) {
192
        FeatureQueryOrderMember member = new FeatureQueryOrderMember(
193
                attributeName, ascending);
194
        if (members.add(member)) {
195
            return member;
196
        }
197
        return null;
198
    }
64
    boolean contains(String attributeName);
199 65

  
200
//    TODO: Nota: hay que a?adir add de un Expression
201
//    public Object add(Evaluator evaluator, boolean ascending) {
202
//        FeatureQueryOrderMember member = new FeatureQueryOrderMember(
203
//                evaluator,
204
//                ascending);
205
//        if (members.add(member)) {
206
//            return member;
207
//        }
208
//        return null;
209
//    }
210
    public Iterable<FeatureQueryOrderMember> members() {
211
        //    Me hubiese gustado que FeatureQueryOrder fuese Iterable, pero no se deja por 
212
        //    que FeatureQueryOrderMember es una clase interna y no esta definida en el 
213
        //    momento de poner el :
214
        //            implements Iterable<FeatureQueryOrderMember>
215
        //    Y si saco a una clase independiente FeatureQueryOrderMember se pierde 
216
        //    compatibilidad binaria con quien la esta usando.
217
        //    Para rodearlo, he creado el metodo members.
218
        return new Iterable<FeatureQueryOrderMember>() {
66
    void copyFrom(FeatureQueryOrder other);
219 67

  
220
            @Override
221
            public Iterator<FeatureQueryOrderMember> iterator() {
222
                return FeatureQueryOrder.this.iterator();
223
            }
224
        };
225
    }
68
    FeatureQueryOrderMember get(String attributeName);
226 69

  
227
    public Iterator<FeatureQueryOrderMember> iterator() {
228
        if (members == null) {
229
            return new Iterator<FeatureQueryOrderMember>() {
230
                @Override
231
                public boolean hasNext() {
232
                    return false;
233
                }
70
    FeatureQueryOrder getCopy();
234 71

  
235
                @Override
236
                public FeatureQueryOrderMember next() {
237
                    throw new NoSuchElementException();
238
                }
72
    int getIndex(String attributeName);
239 73

  
240
                @Override
241
                public void remove() {
242
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
243
                }
244
            };
245
        }
246
        return members.iterator();
247
    }
74
    boolean isEmpty();
248 75

  
249
    public boolean remove(FeatureQueryOrderMember member) {
250
        return members.remove(member);
251
    }
76
    Iterator<FeatureQueryOrderMember> iterator();
252 77

  
253
    public void remove(int index) {
254
        members.remove(index);
255
    }
78
    Iterable<FeatureQueryOrderMember> members();
256 79

  
257
    public void clear() {
258
        members.clear();
259
    }
80
    void moveNext(String name);
260 81

  
261
    public int size() {
262
        return this.members.size();
263
    }
82
    void movePrevious(String name);
264 83

  
265
    public int getIndex(String attributeName) {
266
        int n = 0;
267
        for (FeatureQueryOrderMember member : members) {
268
            if (member != null && StringUtils.equalsIgnoreCase(attributeName, member.getAttributeName())) {
269
                return n;
270
            }
271
            n++;
272
        }
273
        return -1;
274
    }
84
    boolean remove(FeatureQueryOrderMember member);
275 85

  
276
    public void movePrevious(String name) {
277
        int n = this.getIndex(name);
278
        if (n < 1) {
279
            return;
280
        }
281
        Collections.swap(members, n, n - 1);
282
    }
86
    void remove(int index);
283 87

  
284
    public void moveNext(String name) {
285
        int n = this.getIndex(name);
286
        if (n >= this.members.size() - 1) {
287
            return;
288
        }
289
        Collections.swap(members, n, n + 1);
290
    }
88
    int size();
291 89

  
292
    public boolean isEmpty() {
293
        return this.members == null || this.members.isEmpty();
294
    }
295

  
296
    public FeatureQueryOrderMember get(String attributeName) {
297
        for (FeatureQueryOrderMember member : members) {
298
            if (member != null && StringUtils.equalsIgnoreCase(attributeName, member.getAttributeName())) {
299
                return member;
300
            }
301
        }
302
        return null;
303
    }
304

  
305
    public boolean contains(String attributeName) {
306
        for (FeatureQueryOrderMember member : members) {
307
            if (member != null && StringUtils.equalsIgnoreCase(attributeName, member.getAttributeName())) {
308
                return true;
309
            }
310
        }
311
        return false;
312
    }
313

  
314
    public Comparator<Feature> getFeatureComparator() {
315
        return new DefaultFeatureComparator(this);
316
    }
317

  
318
    @Override
319
    public FeatureQueryOrder clone() throws CloneNotSupportedException {
320
        FeatureQueryOrder clone = (FeatureQueryOrder) super.clone();
321

  
322
        if (members != null) {
323
            clone.members = new ArrayList(members.size());
324
            for (int i = 0; i < members.size(); i++) {
325
                clone.members.add((members.get(i)).clone());
326
            }
327
        }
328

  
329
        return clone;
330
    }
331

  
332
    public FeatureQueryOrder getCopy() {
333
        FeatureQueryOrder aCopy = new FeatureQueryOrder();
334
        Iterator iter = this.members.iterator();
335
        FeatureQueryOrderMember member;
336
        while (iter.hasNext()) {
337
            member = (FeatureQueryOrderMember) iter.next();
338
            if (member.hasEvaluator()) {
339
//                aCopy.add(member.getEvaluator(), member.getAscending());
340
                LOGGER.warn("Evaluator is not being added to the filter in a class copy");
341
            } else {
342
                aCopy.add(member.getAttributeName(), member.getAscending());
343
            }
344
        }
345
        return aCopy;
346
    }
347

  
348
    /**
349
     * Register the class on PersistenceManager
350
     *
351
     */
352
    public static void registerPersistent() {
353
        DynStruct definitionMember
354
                = ToolsLocator.getPersistenceManager()
355
                        .addDefinition(FeatureQueryOrderMember.class,
356
                                "FeatureQueryOrderMember",
357
                                "FeatureQueryOrderMember Persistent definition",
358
                                null,
359
                                null);
360

  
361
        definitionMember.addDynFieldString("attributeName").setClassOfValue(String.class).setMandatory(false);
362
        definitionMember.addDynFieldObject("expression").setClassOfValue(Expression.class).setMandatory(false);
363
        definitionMember.addDynFieldBoolean("ascending").setMandatory(false);
364

  
365
        DynStruct definition
366
                = ToolsLocator.getPersistenceManager()
367
                        .addDefinition(FeatureQueryOrder.class,
368
                                "FeatureQueryOrder",
369
                                "FeatureQueryOrder Persistent definition",
370
                                null,
371
                                null);
372

  
373
        definition.addDynFieldList("members").setClassOfItems(FeatureQueryOrderMember.class);
374

  
375
    }
376

  
377
    @Override
378
    public void loadFromState(PersistentState state)
379
            throws PersistenceException {
380
        List<FeatureQueryOrderMember> stateMembers = (List) state.get("members");
381
        this.members = new ArrayList<>();
382
        for (FeatureQueryOrderMember stateMember : stateMembers) {
383
            this.members.add(stateMember);
384
        }
385
    }
386

  
387
    @Override
388
    public void saveToState(PersistentState state) throws PersistenceException {
389
        state.set("members", members);
390

  
391
    }
392

  
393
    private class DefaultFeatureComparator implements Comparator<Feature> {
394

  
395
        private final FeatureQueryOrder order;
396

  
397
        public DefaultFeatureComparator(FeatureQueryOrder order) {
398
            this.order = order;
399
            // TODO optimizar en un array???
400

  
401
        }
402

  
403
        private int myCompare(Object arg0, Object arg1) {
404
            if (arg0 == null) {
405
                if (arg1 == null) {
406
                    return 0;
407
                } else {
408
                    return 1;
409
                }
410
            } else if (arg1 == null) {
411
                if (arg0 == null) {
412
                    return 0;
413
                } else {
414
                    return 1;
415
                }
416
            }
417
            if (arg0 instanceof Comparable) {
418
                return ((Comparable) arg0).compareTo(arg1);
419
            } else if (arg1 instanceof Comparable) {
420
                return ((Comparable) arg1).compareTo(arg0) * -1;
421
            }
422

  
423
            if (arg0.equals(arg1)) {
424
                return 0;
425
            } else {
426
                return -1;
427
            }
428

  
429
        }
430

  
431
        @Override
432
        public int compare(Feature f0, Feature f1) {
433
            Iterator iter = this.order.iterator();
434
            int returnValue = 0;
435
//            Feature f0 = (Feature) arg0;
436
//            Feature f1 = (Feature) arg1;
437
            Object item;
438
            String attrName;
439
            Evaluator evaluator;
440
            while (returnValue == 0 && iter.hasNext()) {
441
                item = iter.next();
442
                if (item instanceof String) {
443
                    attrName = (String) item;
444
                    returnValue = this
445
                            .myCompare(f0.get(attrName), f1
446
                                    .get(attrName));
447
                } else {
448
                    evaluator = (Evaluator) item;
449
                    try {
450
                        returnValue = this.myCompare(evaluator
451
                                .evaluate((EvaluatorData) f0), evaluator
452
                                .evaluate((EvaluatorData) f1));
453
                    } catch (EvaluatorException e) {
454
                        throw new DataEvaluatorRuntimeException(e);
455
                    }
456
                }
457
            }
458

  
459
            return returnValue;
460
        }
461

  
462
    }
463

  
464 90
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/DALLibrary.java
63 63
    @Override
64 64
    protected void doInitialize() throws LibraryException {
65 65
        // Do nothing
66
        FeatureQueryOrder.registerPersistent();
67 66
    }
68 67

  
69 68
    @Override
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/test/java/org/gvsig/fmap/dal/feature/DummyFetureStore.java
816 816
    public long size64() {
817 817
        return 0;
818 818
    }
819

  
820
    @Override
821
    public FeatureQuery createFeatureQuery(Expression filter, Expression sortBy, boolean asc) {
822
        return null;
823
    }
824

  
825
    @Override
826
    public FeatureQuery createFeatureQuery(String filter, Expression sortBy, boolean asc) {
827
        return null;
828
    }
829

  
830
    @Override
831
    public Feature findFirst(String filter, Expression sortBy, boolean asc) throws DataException {
832
        return null;
833
    }
834

  
835
    @Override
836
    public Feature findFirst(Expression filter, Expression sortBy, boolean asc) throws DataException {
837
        return null;
838
    }
819 839
    
820 840
}
trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app.document.table.app/org.gvsig.app.document.table.app.mainplugin/src/main/java/org/gvsig/app/extension/TableFieldOperations.java
23 23
 */
24 24
package org.gvsig.app.extension;
25 25

  
26
import java.util.ArrayList;
27 26
import java.util.HashSet;
28 27
import java.util.Iterator;
29
import java.util.List;
30 28
import java.util.Set;
31

  
32 29
import javax.swing.JOptionPane;
33

  
34
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36

  
37 30
import org.gvsig.andami.IconThemeHelper;
38 31
import org.gvsig.andami.PluginServices;
39 32
import org.gvsig.andami.plugins.Extension;
40 33
import org.gvsig.andami.ui.mdiManager.IWindow;
41 34
import org.gvsig.app.ApplicationLocator;
42 35
import org.gvsig.app.project.documents.table.gui.FeatureTableDocumentPanel;
43
import org.gvsig.fmap.dal.DataStoreNotification;
44 36
import org.gvsig.fmap.dal.exception.DataException;
45 37
import org.gvsig.fmap.dal.feature.Feature;
46 38
import org.gvsig.fmap.dal.feature.FeatureQuery;
......
53 45
import org.gvsig.i18n.Messages;
54 46
import org.gvsig.tools.dispose.DisposableIterator;
55 47
import org.gvsig.tools.exception.BaseException;
48
import org.slf4j.Logger;
49
import org.slf4j.LoggerFactory;
56 50

  
57 51
/**
58 52
 * Operations regarding order and duplicated values.
......
172 166
         * Create order based on selected column
173 167
         * (ascending but descending would be ok too)
174 168
         */
175
        FeatureQueryOrder fqo = new FeatureQueryOrder();
169
        FeatureQueryOrder fqo = fquery.getOrder();
176 170
        fqo.add(fieldName, true);
177 171
        fquery.setOrder(fqo);
178 172
        FeatureSet fset = fstore.getFeatureSet(fquery);
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.fmap.control/src/main/java/org/gvsig/fmap/mapcontrol/dal/feature/swing/table/ConfigurableFeatureTableModel.java
353 353
    public void orderByColumn(String name, boolean ascending)
354 354
        throws BaseException {
355 355
        FeatureQueryOrder order = getHelper().getFeatureQuery().getOrder();
356
        if (order == null) {
357
            order = new FeatureQueryOrder();
358
            getHelper().getFeatureQuery().setOrder(order);
359
        }
360 356
        order.clear();
361 357
        order.add(name, ascending);
362 358
        getHelper().reload();
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.api/src/main/java/org/gvsig/expressionevaluator/Expression.java
1 1
package org.gvsig.expressionevaluator;
2 2

  
3
import org.gvsig.tools.evaluator.Evaluator;
3 4
import org.gvsig.tools.persistence.Persistent;
4 5

  
5 6
/**
......
43 44
    public void setUseBracketsForIdentifiers(boolean useBracketsForIdentifiers);
44 45
    
45 46
    public boolean getUseBracketsForIdentifiers();
47
    
48
    public Evaluator toEvaluator();
46 49
}
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff