Statistics
| Revision:

root / org.gvsig.dgn / trunk / org.gvsig.dgn / org.gvsig.dgn.provider / src / main / java / org / gvsig / fmap / dal / store / dgn / PostProcessFeatures.java @ 108

History | View | Annotate | Download (5.44 KB)

1
package org.gvsig.fmap.dal.store.dgn;
2

    
3
import java.util.ArrayList;
4
import java.util.Collections;
5
import java.util.Comparator;
6
import java.util.Iterator;
7
import java.util.List;
8
import org.gvsig.fmap.dal.feature.FeatureType;
9
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
10
import org.gvsig.fmap.dal.store.dgn.DGNStoreProvider.TimeCounter;
11
import org.gvsig.fmap.geom.Geometry;
12
import org.gvsig.fmap.geom.GeometryLocator;
13
import org.gvsig.fmap.geom.GeometryManager;
14
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
15
import org.gvsig.fmap.geom.primitive.Envelope;
16
import org.slf4j.Logger;
17
import org.slf4j.LoggerFactory;
18

    
19
public class PostProcessFeatures {
20

    
21
    private static final Logger logger = LoggerFactory.getLogger(PostProcessFeatures.class);
22

    
23
    private final FeatureType featureType;
24
    private final DGNStoreParameters parameters;
25
    private Envelope envelope;
26
    private final int geomSubtype;
27
    private PostProcessFilterOperation filter = null;
28

    
29
    public PostProcessFeatures(DGNStoreParameters parameters, FeatureType featureType) {
30
        this.featureType = featureType;
31
        this.parameters = parameters;
32
        if (parameters.ignoreZs()) {
33
            this.geomSubtype = Geometry.SUBTYPES.GEOM2D;
34
        } else {
35
            this.geomSubtype = featureType.getDefaultGeometryAttribute().getGeomType().getSubType();
36
        }
37
    }
38

    
39
    private DGNStoreParameters getDGNParameters() {
40
        return this.parameters;
41
    }
42

    
43
    private PostProcessFilterOperation getFilter() {
44
        if (this.filter == null) {
45
            this.filter = new PostProcessFilterOperation(
46
                    getDGNParameters(),
47
                    featureType
48
            );
49
        }
50
        return this.filter;
51
    }
52

    
53
    public List<FeatureProvider> apply(List<FeatureProvider> rows) throws CreateEnvelopeException {
54

    
55
        TimeCounter tc_total = new TimeCounter();
56
        TimeCounter tc_accept = new TimeCounter();
57

    
58
        PostProcessFilterOperation filter = this.getFilter();
59

    
60
        List<FeatureProvider> result = null;
61

    
62
        Iterator<FeatureProvider> rowsIterator = rows.iterator();
63

    
64
        int rowCount = 0;
65
        int rowFitereds = 0;
66
        if (parameters.getGroupBy() == null) {
67
            GeometryManager geomManager = GeometryLocator.getGeometryManager();
68
            this.envelope = geomManager.createEnvelope(this.geomSubtype);
69

    
70
            tc_total.start();
71
            result = new ArrayList<FeatureProvider>();
72
            while (rowsIterator.hasNext()) {
73
                FeatureProvider feature = rowsIterator.next();
74
                rowCount++;
75
                
76
                tc_accept.start();
77
                boolean accept = filter.accept(feature);
78
                tc_accept.stop();
79
                
80
                if (!accept) {
81
                    continue;
82
                }
83
                rowFitereds++;
84
                Geometry geom = feature.getDefaultGeometry();
85
                if (geom != null) {
86
                    this.envelope.add(geom.getEnvelope());
87
                }
88
                result.add(feature);
89
            }
90
            tc_total.stop();
91
            tc_accept.log("Accepts time filter");
92
            tc_total.log("Total time filer, rows input "+rowCount+", output "+rowFitereds );
93

    
94
        } else {
95
            tc_total.start();
96

    
97
            PostProcessGroupOperation groupOperation = new PostProcessGroupOperation(
98
                    this.featureType,
99
                    parameters.getGroupBy(),
100
                    parameters.getGroupGeometriesOperation()
101
            );
102
            while (rowsIterator.hasNext()) {
103
                FeatureProvider feature = rowsIterator.next();
104
                rowCount++;
105

    
106
                tc_accept.start();
107
                boolean accept = filter.accept(feature);
108
                tc_accept.stop();
109
                
110
                if (!accept) {
111
                    continue;
112
                }
113
                rowFitereds++;
114
                groupOperation.add(feature);
115
            }
116
            result = groupOperation.getRows();
117
            this.envelope = groupOperation.getEnvelope();
118

    
119
            tc_total.stop();
120
            tc_accept.log("Accepts time filter+group");
121
            tc_total.log("Total time filer+group, rows input "+rowCount+", output "+rowFitereds );
122
        }
123

    
124
        if (parameters.sortByGeometryType()) {
125
            this.sortRows(result);
126
        }
127
        return result;
128
    }
129

    
130
    public Envelope getEnvelope() {
131
        return this.envelope;
132
    }
133

    
134
    private void sortRows(List<FeatureProvider> rows) {
135
        TimeCounter tc = new TimeCounter();
136
        Collections.sort(rows, new Comparator<FeatureProvider>() {
137
            public int compare(FeatureProvider o1, FeatureProvider o2) {
138
                Geometry g1 = o1.getDefaultGeometry();
139
                Geometry g2 = o2.getDefaultGeometry();
140
                if (g1 == null) {
141
                    if (g2 == null) {
142
                        return 0;
143
                    } else {
144
                        return -1;
145
                    }
146
                } else if (g2 == null) {
147
                    return 1;
148
                }
149
                return g2.getType() - g1.getType();
150
            }
151
        });
152
        tc.stop();
153
        tc.log("sort data, rows "+rows.size());
154
    }
155

    
156
    public boolean hasOperations() {
157
        PostProcessFilterOperation filter = this.getFilter();
158
        if (filter.hasFilter()) {
159
            return true;
160
        }
161
        if (parameters.getGroupBy() != null) {
162
            return true;
163
        }
164
        return false;
165
    }
166

    
167
}