From: <svn...@os...> - 2012-05-02 13:20:27
|
Author: ang05a Date: 2012-05-02 06:20:19 -0700 (Wed, 02 May 2012) New Revision: 38700 Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/MappingFeatureIteratorFactory.java Log: App-schema isList: subsetting should affect other property values outside the filter properties. Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java =================================================================== --- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java 2012-05-02 01:23:15 UTC (rev 38699) +++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java 2012-05-02 13:20:19 UTC (rev 38700) @@ -124,8 +124,6 @@ */ private Filter listFilter; - private List<StepList> listFilterProperties; - public DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, boolean isFiltered) throws IOException { this(store, mapping, query, null); @@ -181,6 +179,24 @@ } } } + // HACK HACK HACK + // evaluate filter that applies to this list as we want a subset + // instead of full result + // this is a temporary solution for Bureau of Meteorology + // requirement for timePositionList + if (listFilter != null) { + while (exists && !listFilter.evaluate(curSrcFeature)) { + // only add to subset if filter matches value + if (getSourceFeatureIterator() != null + && getSourceFeatureIterator().hasNext()) { + this.curSrcFeature = getSourceFeatureIterator().next(); + exists = true; + } else { + exists = false; + } + } + } + // END OF HACK } else { exists = false; } @@ -714,8 +730,26 @@ while (getSourceFeatureIterator().hasNext()) { Feature next = getSourceFeatureIterator().next(); if (extractIdForFeature(next).equals(fId) && checkForeignIdValues(foreignIdValues, next)) { - features.add(next); - } else { + // HACK HACK HACK + // evaluate filter that applies to this list as we want a subset + // instead of full result + // this is a temporary solution for Bureau of Meteorology + // requirement for timePositionList + if (listFilter != null) { + if (listFilter.evaluate(next)) { + features.add(next); + } + // END OF HACK + } else { + features.add(next); + } + // HACK HACK HACK + // evaluate filter that applies to this list as we want a subset + // instead of full result + // this is a temporary solution for Bureau of Meteorology + // requirement for timePositionList + } else if (listFilter == null || listFilter.evaluate(next)) { + // END OF HACK curSrcFeature = next; break; } @@ -740,6 +774,8 @@ query.setCoordinateSystemReproject(reprojection); } } + + Filter fidFilter; if (mapping.getFeatureIdExpression().equals(Expression.NIL)) { // no real feature id mapping, @@ -747,16 +783,30 @@ Set<FeatureId> ids = new HashSet<FeatureId>(); FeatureId featureId = namespaceAwareFilterFactory.featureId(fId); ids.add(featureId); - query.setFilter(namespaceAwareFilterFactory.id(ids)); - matchingFeatures = this.mappedSource.getFeatures(query); + fidFilter = namespaceAwareFilterFactory.id(ids); } else { // in case the expression is wrapped in a function, eg. strConcat // that's why we don't always filter by id, but do a PropertyIsEqualTo - query.setFilter(namespaceAwareFilterFactory.equals(mapping.getFeatureIdExpression(), - namespaceAwareFilterFactory.literal(fId))); - matchingFeatures = this.mappedSource.getFeatures(query); + fidFilter = namespaceAwareFilterFactory.equals(mapping.getFeatureIdExpression(), + namespaceAwareFilterFactory.literal(fId)); } + + // HACK HACK HACK + // evaluate filter that applies to this list as we want a subset + // instead of full result + // this is a temporary solution for Bureau of Meteorology + // requirement for timePositionList + if (listFilter != null) { + List<Filter> filters = new ArrayList<Filter>(); + filters.add(listFilter); + filters.add(fidFilter); + fidFilter = namespaceAwareFilterFactory.and(filters); + } + // END OF HACK + query.setFilter(fidFilter); + matchingFeatures = this.mappedSource.getFeatures(query); + FeatureIterator<? extends Feature> iterator = matchingFeatures.features(); List<Feature> features = new ArrayList<Feature>(); @@ -830,24 +880,8 @@ if (sources.size() > 1 && instance != null) { List<Object> values = new ArrayList<Object>(); Expression sourceExpr = attMapping.getSourceExpression(); - if (listFilter != null - && listFilterProperties.contains(attMapping.getTargetXPath())) { - for (Feature source : sources) { - // HACK HACK HACK - // evaluate filter that applies to this list as we want a subset - // instead of full result - // this is a temporary solution for Bureau of Meteorology - // requirement for timePositionList - if (listFilter.evaluate(source)) { - // only add to subset if filter matches value - values.add(getValue(sourceExpr, source)); - } - } - } else { - // no filter concerning the list - for (Feature source : sources) { - values.add(getValue(sourceExpr, source)); - } + for (Feature source : sources) { + values.add(getValue(sourceExpr, source)); } String valueString = StringUtils.join(values.iterator(), " "); StepList fullPath = attMapping.getTargetXPath(); @@ -975,7 +1009,6 @@ sourceFeatureIterator = null; sourceFeatures = null; filteredFeatures = null; - listFilterProperties = null; listFilter = null; //NC - joining nested atts @@ -1111,9 +1144,5 @@ public void setListFilter(Filter filter) { listFilter = filter; - } - - public void setListFilterProperties(List<StepList> properties) { - listFilterProperties = properties; - } + } } Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/MappingFeatureIteratorFactory.java =================================================================== --- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/MappingFeatureIteratorFactory.java 2012-05-02 01:23:15 UTC (rev 38699) +++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/MappingFeatureIteratorFactory.java 2012-05-02 13:20:19 UTC (rev 38700) @@ -18,7 +18,6 @@ package org.geotools.data.complex; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -69,15 +68,15 @@ // Attribute mappings that have isList enabled private List<AttributeMapping> listMappings; - // Filter properties that are configured as isList - private List<StepList> listFilterProperties; + // True if the filter has properties that are configured as isList + private boolean isListFilter; private FeatureTypeMapping mappings; public IsListFilterVisitor(List<AttributeMapping> listMappings, FeatureTypeMapping mappings) { this.listMappings = listMappings; this.mappings = mappings; - listFilterProperties = new ArrayList<StepList>(); + isListFilter = false; } @Override @@ -91,14 +90,15 @@ targetXpath = mapping.getTargetXPath(); if (targetXpath.equals(simplifiedSteps)) { // TODO: support feature chaining too? - listFilterProperties.add(targetXpath); + isListFilter = true; + return extraData; } } return extraData; } - public List<StepList> getListFilterProperties() { - return listFilterProperties; + public boolean isListFilterExists() { + return isListFilter; } } @@ -107,23 +107,7 @@ if (mapping instanceof XmlFeatureTypeMapping) { return new XmlMappingFeatureIterator(store, mapping, query); - } - - // HACK HACK HACK - // experimental/temporary solution for isList subsetting by filtering - List<AttributeMapping> listMappings = mapping.getIsListMappings(); - Filter isListFilter = null; - List<StepList> listFilterProperties = null; - if (!listMappings.isEmpty()) { - IsListFilterVisitor listChecker = new IsListFilterVisitor(listMappings, mapping); - Filter complexFilter = query.getFilter(); - complexFilter.accept(listChecker, null); - listFilterProperties = listChecker.getListFilterProperties(); - if (!listFilterProperties.isEmpty()) { - isListFilter = AppSchemaDataAccess.unrollFilter(complexFilter, mapping); - } - } - // END OF HACK + } boolean isJoining = AppSchemaDataAccessConfigurator.isJoining(); @@ -146,6 +130,19 @@ unrolledQuery); } } else { + // HACK HACK HACK + // experimental/temporary solution for isList subsetting by filtering + List<AttributeMapping> listMappings = mapping.getIsListMappings(); + Filter isListFilter = null; + if (!listMappings.isEmpty()) { + IsListFilterVisitor listChecker = new IsListFilterVisitor(listMappings, mapping); + Filter complexFilter = query.getFilter(); + complexFilter.accept(listChecker, null); + if (listChecker.isListFilterExists()) { + isListFilter = AppSchemaDataAccess.unrollFilter(complexFilter, mapping); + } + } + // END OF HACK FeatureSource mappedSource = mapping.getSource(); if (isJoining || mappedSource instanceof JDBCFeatureSource || mappedSource instanceof JDBCFeatureStore) { @@ -169,15 +166,12 @@ iterator = new DataAccessMappingFeatureIterator(store, mapping, query, isFiltered); // HACK HACK HACK // experimental/temporary solution for isList subsetting by filtering - if (isListFilter != null) { - ((DataAccessMappingFeatureIterator) iterator).setListFilter(isListFilter); - ((DataAccessMappingFeatureIterator) iterator) - .setListFilterProperties(listFilterProperties); - } + if (isListFilter == null) { // END OF HACK - if (filter != null && filter != Filter.INCLUDE) { - iterator = new PostFilteringMappingFeatureIterator(iterator, filter, + if (filter != null && filter != Filter.INCLUDE) { + iterator = new PostFilteringMappingFeatureIterator(iterator, filter, maxFeatures); + } } } else if (mappedSource instanceof MappingFeatureSource) { // web service data access wrapper @@ -212,17 +206,13 @@ iterator = new DataAccessMappingFeatureIterator(store, mapping, query); } } + // HACK HACK HACK + // experimental/temporary solution for isList subsetting by filtering + if (isListFilter != null && iterator instanceof DataAccessMappingFeatureIterator) { + ((DataAccessMappingFeatureIterator) iterator).setListFilter(isListFilter); + } + // END OF HACK } - - // HACK HACK HACK - // experimental/temporary solution for isList subsetting by filtering - if (isListFilter != null && iterator instanceof DataAccessMappingFeatureIterator) { - ((DataAccessMappingFeatureIterator) iterator).setListFilter(isListFilter); - ((DataAccessMappingFeatureIterator) iterator) - .setListFilterProperties(listFilterProperties); - } - // END OF HACK - return iterator; } |