/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.data.postgis.collection;
import org.geotools.data.jdbc.JDBCFeatureCollection;
import org.geotools.data.postgis.AbstractPostgisDataTestCase;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.feature.visitor.AverageVisitor;
import org.geotools.feature.visitor.CountVisitor;
import org.geotools.feature.visitor.MaxVisitor;
import org.geotools.feature.visitor.MinVisitor;
import org.geotools.feature.visitor.SumVisitor;
import org.geotools.feature.visitor.UniqueVisitor;
import org.geotools.filter.FunctionExpression;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.expression.Add;
import org.opengis.filter.expression.Literal;
import org.opengis.filter.expression.PropertyName;
public class FeatureCollectionAggregateVisitorTests extends AbstractPostgisDataTestCase {
FilterFactory ff = CommonFactoryFinder.getFilterFactory(null);
JDBCFeatureCollection roads;
JDBCFeatureCollection rivers;
PropertyName roadsId;
PropertyName riverFlow;
public FeatureCollectionAggregateVisitorTests(String test) {
super(test);
}
protected void setUp() throws Exception {
super.setUp();
roads = (JDBCFeatureCollection) data.getFeatureSource("road").getFeatures();
rivers = (JDBCFeatureCollection) data.getFeatureSource("river").getFeatures();
roadsId = ff.property("id");
riverFlow = ff.property("flow");
}
public void testSum() throws Exception {
// test against integer data
SumVisitor sumVisitor = new SumVisitor(roadsId);
roads.accepts(sumVisitor, null);
assertTrue(roads.isOptimized); //the optimization was used
assertEquals(6, sumVisitor.getResult().toInt());
// test complex expression
Literal one = ff.literal(1);
Add add = ff.add(roadsId, one);
SumVisitor sumInt = new SumVisitor(add);
roads.accepts(sumInt, null);
assertTrue(roads.isOptimized);
assertEquals(9, sumInt.getResult().toInt());
// test against float
Add addFloat = ff.add(riverFlow, one);
SumVisitor sumFloat = new SumVisitor(addFloat);
rivers.accepts(sumFloat, null);
assertTrue(rivers.isOptimized);
assertEquals(9.5, sumFloat.getResult().toDouble(), 0.0);
}
public void testCount() throws Exception {
// test count
CountVisitor countVisitor = new CountVisitor();
roads.accepts(countVisitor, null);
assertTrue(roads.isOptimized); //the optimization was used
assertEquals(3, countVisitor.getResult().toInt());
}
public void testMinMax() throws Exception {
MinVisitor minVisitor = new MinVisitor(roadsId);
roads.accepts(minVisitor, null);
assertTrue(roads.isOptimized); //the postgis optimization was used
assertEquals(1, minVisitor.getResult().toInt());
MaxVisitor maxVisitor = new MaxVisitor(roadsId);
roads.accepts(maxVisitor, null);
assertTrue(roads.isOptimized); //the postgis optimization was used
assertEquals(3, maxVisitor.getResult().toInt());
}
public void testAverage() throws Exception {
AverageVisitor averageVisitor = new AverageVisitor(roadsId);
roads.accepts(averageVisitor, null);
assertTrue(roads.isOptimized); //the postgis optimization was used
assertEquals(2, averageVisitor.getResult().toInt());
}
public void testUnique() throws Exception {
UniqueVisitor uniqueVisitor = new UniqueVisitor(roadsId);
roads.accepts(uniqueVisitor, null);
assertTrue(roads.isOptimized); //the postgis optimization was used
assertEquals(3, uniqueVisitor.getResult().toSet().size());
}
public void testSumExpression() throws Exception {
FunctionExpression expr = (FunctionExpression) ff.function("Collection_Sum", ff.property("id"));
int result = ((Number) expr.evaluate(roads)).intValue();
assertTrue(roads.isOptimized);
assertEquals(6, result);
}
}