@Override public void beforeQuerying(GetFeatureContext context) { String version = context.getRequest().getVersion(); if (version == null || !version.startsWith("2.0")) { return; } FeatureTypeInfo featureTypeInfo = context.getFeatureTypeInfo(); if (!TimeVersioning.isEnabled(featureTypeInfo)) { // time versioning is not enabled for this feature type or is not a WFS 2.0 request return; } Query query = new Query(context.getQuery()); Filter adapted = VersioningFilterAdapter.adapt(featureTypeInfo, query.getFilter()); query.setFilter(adapted); SortBy sort = FILTER_FACTORY.sort( TimeVersioning.getTimePropertyName(featureTypeInfo), SortOrder.DESCENDING); SortBy[] sorts = query.getSortBy(); if (sorts == null) { sorts = new SortBy[] {sort}; } else { sorts = Arrays.copyOf(sorts, sorts.length + 1); sorts[sorts.length - 1] = sort; } query.setSortBy(sorts); context.setQuery(query); }
@Test public void testAlterQuery() throws Exception { tester.contextConsumer = (GetFeatureContext ctx) -> { Query query = new Query(ctx.getQuery()); try { query.setFilter(CQL.toFilter("NAME = 'Main Street'")); ctx.setQuery(query); } catch (CQLException e) { throw new RuntimeException(e); } }; Document doc = getAsDOM( "wfs?request=GetFeature&typename=" + getLayerId(ROAD_SEGMENTS) + "&version=1.1.0&service=wfs"); print(doc); assertXpathEvaluatesTo("1", "count(//cite:RoadSegments)", doc); assertXpathEvaluatesTo("Main Street", "//cite:RoadSegments/cite:NAME", doc); } }