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 |
} |