Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dal / src / org / gvsig / fmap / dal / feature / impl / featureset / FeatureDataComparator.java @ 28782

History | View | Annotate | Download (2.77 KB)

1
package org.gvsig.fmap.dal.feature.impl.featureset;
2

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

    
6
import org.gvsig.fmap.dal.exception.DataEvaluatorRuntimeException;
7
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
8
import org.gvsig.fmap.dal.feature.FeatureType;
9
import org.gvsig.fmap.dal.feature.FeatureQueryOrder.FeatureQueryOrderMember;
10
import org.gvsig.fmap.dal.feature.impl.DefaultFeature;
11
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureStore;
12
import org.gvsig.fmap.dal.feature.spi.FeatureData;
13
import org.gvsig.tools.evaluator.Evaluator;
14
import org.gvsig.tools.evaluator.EvaluatorException;
15

    
16
/*
17
*
18
* Compara dos Feature o FeatureData.
19
*/
20
public class FeatureDataComparator implements Comparator {
21

    
22
        private FeatureQueryOrder order;
23
        private DefaultFeature f1;
24
        private DefaultFeature f2;
25
        private DefaultFeatureStore store;
26
        private OrderElement[] elements = null;
27

    
28
        private class OrderElement {
29
                FeatureQueryOrderMember order = null;
30
                int fieldIndex = -1;
31
        }
32

    
33
        public FeatureDataComparator(DefaultFeatureStore store, FeatureQueryOrder order) {
34
                this.order = order;
35
                this.store = store;
36
                this.f1 = new DefaultFeature(this.store);
37
                this.f2 = new DefaultFeature(this.store);
38
        }
39

    
40
        private void initElements(FeatureType type) {
41
                elements = new OrderElement[this.order.size()];
42
                OrderElement cur;
43
                Iterator iter = order.iterator();
44
                FeatureQueryOrderMember orderItem;
45
                int i = 0;
46
                while (iter.hasNext()) {
47
                        cur = new OrderElement();
48
                        cur.order = (FeatureQueryOrderMember) iter.next();
49
                        if (!cur.order.hasEvaluator()) {
50
                                cur.fieldIndex = type.getIndex(cur.order.getAttributeName());
51
                        }
52
                        elements[i] = cur;
53
                        i++;
54
                }
55

    
56
        }
57

    
58
        public int compare(Object arg0, Object arg1) {
59
                FeatureQueryOrderMember order;
60
                Comparable v1;
61
                Comparable v2;
62
                Object o1;
63
                Object o2;
64
                int v;
65
                int fieldIndex;
66

    
67
                f1.setData((FeatureData) arg0);
68
                f2.setData((FeatureData) arg1);
69

    
70
                if (elements == null){
71
                        initElements(f1.getType());
72
                }
73

    
74
                OrderElement element;
75

    
76
                for (int i = 0; i < elements.length; i++) {
77
                        element = elements[i];
78

    
79
                        if (element.order.hasEvaluator()) {
80
                                Evaluator evaluator = element.order.getEvaluator();
81
                                try {
82
                                        o1 = evaluator.evaluate(f1);
83
                                        o2 = evaluator.evaluate(f2);
84
                                } catch (EvaluatorException e) {
85
                                        throw new DataEvaluatorRuntimeException(e);
86
                                }
87
                        } else {
88
                                o1 = f1.get(element.fieldIndex);
89
                                o2 = f2.get(element.fieldIndex);
90
                        }
91
                        if (o1 == null) {
92
                                if (o2 == null) {
93
                                        return 0;
94
                                } else {
95
                                        v = 1;
96
                                }
97
                        } else {
98
                                if (o1 instanceof Comparable && o2 instanceof Comparable) {
99
                                        v1 = (Comparable) o1;
100
                                        v2 = (Comparable) o2;
101
                                        v = v1.compareTo(v2);
102
                                } else {
103
                                        v = -1;
104
                                }
105
                        }
106

    
107
                        if (v != 0) {
108
                                if (element.order.getAscending()) {
109
                                        return v;
110
                                } else {
111
                                        return -v;
112
                                }
113
                        }
114
                }
115
                return 0;
116
        }
117

    
118
}