Revision 24017 branches/v2_0_0_prep/libraries/libFMap_data/src/org/gvsig/fmap/data/feature/impl/featureSet/DefaultFeatureSet.java

View differences:

DefaultFeatureSet.java
10 10
import org.gvsig.fmap.data.DataStore;
11 11
import org.gvsig.fmap.data.exceptions.DataException;
12 12
import org.gvsig.fmap.data.feature.Feature;
13
import org.gvsig.fmap.data.feature.FeatureIndex;
14 13
import org.gvsig.fmap.data.feature.FeatureQuery;
15 14
import org.gvsig.fmap.data.feature.FeatureSet;
16 15
import org.gvsig.fmap.data.feature.FeatureStoreNotification;
17 16
import org.gvsig.fmap.data.feature.FeatureType;
17
import org.gvsig.fmap.data.feature.impl.DefaultFeatureIndexes;
18 18
import org.gvsig.fmap.data.feature.impl.DefaultFeatureStore;
19 19
import org.gvsig.fmap.data.feature.spi.FeatureSetProvider;
20
import org.gvsig.tools.evaluator.Evaluator;
21 20
import org.gvsig.tools.exception.BaseException;
22 21
import org.gvsig.tools.observer.Observable;
23 22
import org.gvsig.tools.observer.Observer;
......
52 51
		this.query = query;
53 52
		this.featureTypes = new ArrayList();
54 53
		this.featureTypes.add(this.query.getFeatureType());
55
		this.provider = this.getFeatureSetOverIndex();
54
		if (query.hasFilter()) {
55
			this.provider = ((DefaultFeatureIndexes) store.getIndexes())
56
					.getFeatureSet(query.getFilter());
57
		}
56 58
		if (this.provider == null) {
57 59
			this.provider = this.store.getProvider().createSet(query);
58 60
		}
59 61
	}
60 62

  
61
	private FeatureSetProvider getFeatureSetOverIndex() {
62
		class ApplyIndex {
63
			FeatureIndex index;
64
			Object[] data;
65
			String attrName;
66

  
67
			ApplyIndex(FeatureIndex index, String attrName, Object[] data) {
68
				this.index = index;
69
				this.attrName= attrName;
70
				this.data = data;
71
			}
72
		}
73
		if (!query.hasFilter()) {
74
			return null;
75
		}
76
		Evaluator evaluator;
77
		try {
78
			evaluator = query.getFilter();
79
		} catch( ClassCastException e) {
80
			return null;
81
		}
82
		try {
83
			List applyIndex = new ArrayList();
84
			Iterator indexes = this.store.getIndexes().iterator();
85
			while (indexes.hasNext()) {
86
				FeatureIndex index = (FeatureIndex) indexes
87
						.next();
88
				String[] attrs = index.getAttributeNames();
89
				for (int i=0; i<attrs.length; i++) {
90
					String attrname = attrs[i];
91
					Object[] data = evaluator.getFieldValues(attrname);
92
					if (data != null) {
93
						applyIndex.add(new ApplyIndex(index, attrname, data));
94
						break;
95
					}
96
				}
97
			}
98
			switch (applyIndex.size()) {
99
			case 0:
100
				return null;
101

  
102
			default:
103
				// FIXME: not implemented
104
				this.store
105
						.getLogger()
106
						.info(
107
								"Mas de un indice applica para la consulta. Se escoge arbitrariamente el primero.");
108

  
109
			case 1:
110
				ApplyIndex x = (ApplyIndex) applyIndex.get(0);
111
				return x.index.getFeatureSet(x.attrName, x.data);
112
			}
113

  
114
		} catch (Exception e) {
115
			this.store.getLogger().error("Error buscando indice que aplicar.",
116
					e);
117
			return null;
118
		}
119
	}
120

  
121 63
	public FeatureType getDefaultFeatureType() {
122 64
		return this.query.getFeatureType();
123 65
	}

Also available in: Unified diff