From: <svn...@os...> - 2012-06-07 10:08:26
|
Author: ang05a Date: 2012-06-07 03:08:16 -0700 (Thu, 07 Jun 2012) New Revision: 38802 Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AppSchemaDataAccess.java 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/joining/JoiningQuery.java trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/jdbc/JoiningJDBCFeatureSource.java Log: App-schema: Optimise time series filtering (subsetting). Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AppSchemaDataAccess.java =================================================================== --- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AppSchemaDataAccess.java 2012-06-06 15:19:01 UTC (rev 38801) +++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AppSchemaDataAccess.java 2012-06-07 10:08:16 UTC (rev 38802) @@ -337,7 +337,8 @@ newQuery.setSortBy( sort.toArray(new SortBy[sort.size()]) ); JoiningQuery jQuery = new JoiningQuery(newQuery); - jQuery.setQueryJoins(((JoiningQuery)query).getQueryJoins()); + jQuery.setQueryJoins(((JoiningQuery)query).getQueryJoins()); + jQuery.setSubset(((JoiningQuery) query).isSubset()); unrolledQuery = jQuery; } else { unrolledQuery = newQuery; 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-06-06 15:19:01 UTC (rev 38801) +++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/MappingFeatureIteratorFactory.java 2012-06-07 10:08:16 UTC (rev 38802) @@ -160,12 +160,25 @@ maxFeatures = query.getMaxFeatures(); query.setMaxFeatures(Query.DEFAULT_MAX); } + if (isJoining && isListFilter != null) { + // pass it on in JoiningQuery so it can be handled when the SQL is prepared + // in JoiningJDBCSource + ((JoiningQuery) query).setSubset(true); + // also reset isListFilter to null so it doesn't perform the filtering in + // DataAccessMappingFeatureIterator except when post filtering is involved + // i.e. feature chaining is involved + if (filter == null || filter.equals(Filter.INCLUDE)) { + isListFilter = null; + } + } // need to flag if this is non joining and has pre filter because it needs // to find denormalised rows that match the id (but doesn't match pre filter) boolean isFiltered = !isJoining && preFilter != null && preFilter != Filter.INCLUDE; iterator = new DataAccessMappingFeatureIterator(store, mapping, query, isFiltered); // HACK HACK HACK // experimental/temporary solution for isList subsetting by filtering + // Because subsetting should be done before the feature is built.. so we're not + // using PostFilteringMappingFeatureIterator if (isListFilter == null) { // END OF HACK if (filter != null && filter != Filter.INCLUDE) { Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/joining/JoiningQuery.java =================================================================== --- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/joining/JoiningQuery.java 2012-06-06 15:19:01 UTC (rev 38801) +++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/joining/JoiningQuery.java 2012-06-07 10:08:16 UTC (rev 38802) @@ -74,10 +74,17 @@ protected List<QueryJoin> queryJoins; + /* + * True if the query shouldn't join to the table to find other rows with same id. This is in + * case of there's a filter for multi-valued properties for timeseries. This is a requirement + * for timeseries to return a subset instead of full features. + */ + private boolean isSubset; public JoiningQuery(JoiningQuery query) { super(query); setQueryJoins(query.getQueryJoins()); + setSubset(query.isSubset); } public JoiningQuery(Query query){ @@ -94,5 +101,13 @@ public List<QueryJoin> getQueryJoins(){ return queryJoins; } + + public void setSubset(boolean isSubset) { + this.isSubset = isSubset; + } + + public boolean isSubset() { + return isSubset; + } } Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/jdbc/JoiningJDBCFeatureSource.java =================================================================== --- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/jdbc/JoiningJDBCFeatureSource.java 2012-06-06 15:19:01 UTC (rev 38801) +++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/jdbc/JoiningJDBCFeatureSource.java 2012-06-07 10:08:16 UTC (rev 38802) @@ -447,11 +447,17 @@ if (filter != null && !Filter.INCLUDE.equals(filter)) { //encode filter try { - // grab the full feature type, as we might be encoding a filter - // that uses attributes that aren't returned in the results - SortBy[] lastSortBy = query.getQueryJoins() == null || query.getQueryJoins().size()== 0 ? query.getSortBy() : - query.getQueryJoins().get(query.getQueryJoins().size()-1).getSortBy(); - + SortBy[] lastSortBy = null; + // leave it as null if it's asking for a subset, since we don't want to join to get + // other rows of same id + // since we don't want a full feature, but a subset only + if (!query.isSubset()) { + // grab the full feature type, as we might be encoding a filter + // that uses attributes that aren't returned in the results + lastSortBy = query.getQueryJoins() == null || query.getQueryJoins().size() == 0 ? query + .getSortBy() : query.getQueryJoins() + .get(query.getQueryJoins().size() - 1).getSortBy(); + } String lastTableName = query.getQueryJoins() == null || query.getQueryJoins().size()== 0 ? query.getTypeName() : query.getQueryJoins().get(query.getQueryJoins().size()-1).getJoiningTypeName(); |