Revision 21563 branches/Mobile_Compatible_Hito_1/libFMap_data/src/org/gvsig/data/vectorial/expressionevaluator/FeatureComparator.java

View differences:

FeatureComparator.java
1
package org.gvsig.data.vectorial.expressionevaluator;
2

  
3
import java.util.Comparator;
4
import java.util.Iterator;
5

  
6
import org.gvsig.data.exception.ReadException;
7
import org.gvsig.data.vectorial.IFeature;
8
import org.gvsig.data.vectorial.IFeatureAttributeDescriptor;
9
import org.gvsig.data.vectorial.IFeatureID;
10
import org.gvsig.data.vectorial.IFeatureType;
11
import org.gvsig.data.vectorial.IsNotFeatureSettingException;
12

  
13
public class FeatureComparator implements Comparator {
14
	protected String expresionString;
15
	protected IFeatureType featureType;
16
	protected ComparatorToken[] tokens;
17

  
18
	public FeatureComparator(IFeatureType featureType,String expresion){
19
		this.featureType=featureType;
20
		this.expresionString=expresion;
21
		this.initExpressionList();
22

  
23
	}
24

  
25
	protected void initExpressionList(){
26
		String[] stokens = this.expresionString.split(",");
27
		tokens = new ComparatorToken[stokens.length];
28
		String stoken;
29
		int i;
30
		for (i=0;i<stokens.length;i++){
31
			stoken = stokens[i].trim();
32
			tokens[i] = new ComparatorToken(stoken,this.featureType);
33
		}
34
	}
35

  
36
	private IFeature toFeature(Object arg) throws ReadException, IsNotFeatureSettingException{
37
		if (arg instanceof IFeatureID){
38
			return ((IFeatureID)arg).getFeature(featureType);
39
		} else {
40
			return (IFeature)arg;
41
		}
42
	}
43

  
44
	public int compare(Object arg0, Object arg1) {
45
		IFeature feature0, feature1;
46
		try {
47
			feature0 = toFeature(arg0);
48
			feature1 = toFeature(arg1);
49
		} catch (ReadException e1) {
50
			throw new RuntimeException(e1);
51
			//FIXME: OJO!!!! Revisar la excepcion que lanzamos aqui!!!!
52
			// Tendriamos que lanzar un ReadException, pero
53
			// no podemos por implementar el interface 'Comparator'.
54

  
55
		} catch (IsNotFeatureSettingException e) {
56
			throw new RuntimeException(e);
57
		}
58

  
59

  
60
		int i,result;
61

  
62
		for (i=0;i<tokens.length;i++){
63
			try {
64
				result=tokens[i].compareFeatures(feature0, feature1);
65
			} catch (ReadException e) {
66
				throw new RuntimeException(e);
67
				//FIXME: OJO!!!! Revisar la excepcion que lanzamos aqui!!!!
68
				// Tendriamos que lanzar un ReadException, pero
69
				// no podemos por implementar el interface 'Comparator'.
70
			}
71
			if (result != 0){
72
				return result;
73
			}
74
		}
75
		// Son iguales sus valores, pero si devolvemos
76
		// un 0 java puede considera que 'ES EL MISMO OBJETO'
77
		// y decidir NO A?ADIR a una lista una de las dos
78
		// features.
79
		// Por eso comparamo primero sus 'FeatureID' y
80
		// si son iguales devolvemos un 0 (es la misma feature)
81
		// sino devuelve -1.
82

  
83
		if (feature0.getID().equals(feature1.getID())){
84
			return 0;
85
		}
86
		return -1;
87
	}
88

  
89
	private class ComparatorToken{
90
		private String textToken;
91
		private String textParser;
92
		private boolean ascendent=true;
93
		private ExpresionEvaluator parser;
94
		private IFeatureType featureType;
95
		private boolean isSimple=false;
96

  
97
		public ComparatorToken(String textToken,IFeatureType featureType){
98
			this.textToken= textToken;
99
			this.featureType= featureType;
100

  
101
			if (this.textToken.toLowerCase().endsWith(" desc")){
102
				this.textParser = this.textToken.substring(0,this.textToken.length()-5);
103
				this.ascendent=false;
104
			} else if (this.textToken.toLowerCase().endsWith(" asc")) {
105
				this.textParser = this.textToken.substring(0,this.textToken.length()-4);
106
			} else{
107
				this.textParser = this.textToken;
108
			}
109
			Iterator iter = this.featureType.iterator();
110
			IFeatureAttributeDescriptor attribute;
111
			while (iter.hasNext()){
112
				attribute = (IFeatureAttributeDescriptor)iter.next();
113
				if (attribute.getName().equalsIgnoreCase(this.textParser)){
114
					this.isSimple=true;
115
					this.textParser=attribute.getName();
116
					break;
117
				}
118
			}
119
			if (!this.isSimple){
120
				this.parser = new ExpresionEvaluator(this.textParser,this.featureType);
121
			}
122

  
123
		}
124

  
125
		public int compareFeatures(IFeature feature0,IFeature feature1) throws ReadException{
126
			Comparable value0,value1;
127
			if (this.isSimple){
128
				value0 = (Comparable)feature0.get(this.textParser);
129
				value1 = (Comparable)feature1.get(this.textParser);
130
			}else{
131
				value0 = parser.getValue(feature0);
132
				value1 = parser.getValue(feature1);
133
			}
134
			if (ascendent){
135
				if (value0 == null){
136
					return 1;
137
				} else if (value1 == null){
138
					return -1;
139
				}
140
				return value0.compareTo(value1);
141
			}else{
142
				if (value1 == null){
143
					return 1;
144
				} else if (value0 == null){
145
					return -1;
146
				}
147
				return value1.compareTo(value0);
148
			}
149

  
150
		}
151

  
152
	}
153

  
154

  
155

  
156
}
1
package org.gvsig.data.vectorial.expressionevaluator;
2

  
3
import java.util.Comparator;
4
import java.util.Iterator;
5

  
6
import org.gvsig.data.ReadException;
7
import org.gvsig.data.vectorial.Feature;
8
import org.gvsig.data.vectorial.FeatureAttributeDescriptor;
9
import org.gvsig.data.vectorial.FeatureID;
10
import org.gvsig.data.vectorial.FeatureType;
11
import org.gvsig.data.vectorial.IsNotFeatureSettingException;
12
import org.opengis.filter.Filter;
13
import org.opengis.filter.FilterFactory2;
14
import org.opengis.filter.expression.Expression;
15
import org.opengis.filter.sort.SortBy;
16
import org.opengis.filter.sort.SortOrder;
17

  
18
public class FeatureComparator implements Comparator {
19
	protected FeatureType featureType;
20
	SortBy[] order;
21

  
22
	public FeatureComparator(FeatureType featureType, SortBy[] order){
23
		this.featureType=featureType;
24
		this.order=order;
25
	}
26

  
27
	private Feature toFeature(Object arg) throws ReadException, IsNotFeatureSettingException{
28
		if (arg instanceof FeatureID){
29
			return ((FeatureID)arg).getFeature(featureType);
30
		} else {
31
			return (Feature)arg;
32
		}
33
	}
34

  
35
	public int compare(Object arg0, Object arg1) {
36
		Feature feature0, feature1;
37
		try {
38
			feature0 = toFeature(arg0);
39
			feature1 = toFeature(arg1);
40
		} catch (ReadException e1) {
41
			throw new RuntimeException(e1);
42
			//FIXME: OJO!!!! Revisar la excepcion que lanzamos aqui!!!!
43
			// Tendriamos que lanzar un ReadException, pero
44
			// no podemos por implementar el interface 'Comparator'.
45

  
46
		} catch (IsNotFeatureSettingException e) {
47
			throw new RuntimeException(e);
48
		}
49

  
50
		for (int i=0;i<order.length;i++){
51
			int result = compareFeatures(feature0, 
52
					feature1, 
53
					order[i].getSortOrder(),
54
					(FeatureAttributeDescriptor)featureType.get(order[i].getPropertyName().getPropertyName())
55
					);
56
			if (result!=0) return result; 
57
		}
58
		
59
		
60
		// Son iguales sus valores, pero si devolvemos
61
		// un 0 java puede considera que 'ES EL MISMO OBJETO'
62
		// y decidir NO A?ADIR a una lista una de las dos
63
		// features.
64
		// Por eso comparamo primero sus 'FeatureID' y
65
		// si son iguales devolvemos un 0 (es la misma feature)
66
		// sino devuelve -1.
67

  
68
		if (feature0.getID().equals(feature1.getID())){
69
			return 0;
70
		}
71
		return -1;
72
	}
73
	
74
	public int compareFeatures(Feature feature1, 
75
			Feature feature2, 
76
			SortOrder order,
77
			FeatureAttributeDescriptor type){
78
		
79
		int reverse = 1;
80
		if (order.equals(SortOrder.DESCENDING))
81
			reverse=-1;
82
		int pos = type.ordinal();
83
		if (feature1.get(pos).equals(feature2.get(pos)))
84
			return 0;
85
		if (type.getDataType().equals(FeatureAttributeDescriptor.TYPE_BOOLEAN)){
86
			if (feature1.getBoolean(pos)== false) return -1 * reverse;
87
		}else if (type.getDataType().equals(FeatureAttributeDescriptor.TYPE_BYTE)){
88
			if (feature1.getByte(pos)<feature2.getByte(pos)) return -1 * reverse;
89
		}else if (type.getDataType().equals(FeatureAttributeDescriptor.TYPE_DATE)){
90
			if (feature1.getDate(pos).before(feature2.getDate(pos))) return -1 * reverse;
91
		}else if (type.getDataType().equals(FeatureAttributeDescriptor.TYPE_DOUBLE)){
92
			if (feature1.getDouble(pos)<feature2.getDouble(pos)) return -1 * reverse;
93
		}else if (type.getDataType().equals(FeatureAttributeDescriptor.TYPE_FLOAT)){
94
			if (feature1.getFloat(pos)<feature2.getFloat(pos)) return -1 * reverse;
95
		}else if (type.getDataType().equals(FeatureAttributeDescriptor.TYPE_INT)){
96
			if (feature1.getInt(pos)<feature2.getInt(pos)) return -1 * reverse;
97
		}else if (type.getDataType().equals(FeatureAttributeDescriptor.TYPE_LONG)){
98
			if (feature1.getLong(pos)<feature2.getLong(pos)) return -1 * reverse;
99
		}else if (type.getDataType().equals(FeatureAttributeDescriptor.TYPE_STRING)){
100
			return feature1.getString(pos).compareTo(feature2.getString(pos)) * reverse;
101
		}else if (type.getDataType().equals(FeatureAttributeDescriptor.TYPE_GEOMETRY)){
102
			return -1; //TODO: How to order by geometries?
103
		}
104
		
105
		return reverse;
106
	}
107

  
108

  
109

  
110

  
111
}

Also available in: Unified diff