Revision 45308
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 |
} |
Also available in: Unified diff