/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2014, 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.sqlserver;
import java.util.HashMap;
import java.util.Map;
import org.geotools.filter.visitor.DefaultFilterVisitor;
import org.opengis.filter.expression.Expression;
import org.opengis.filter.expression.Literal;
import org.opengis.filter.expression.PropertyName;
import org.opengis.filter.spatial.BBOX;
import org.opengis.filter.spatial.Beyond;
import org.opengis.filter.spatial.BinarySpatialOperator;
import org.opengis.filter.spatial.Contains;
import org.opengis.filter.spatial.Crosses;
import org.opengis.filter.spatial.DWithin;
import org.opengis.filter.spatial.Disjoint;
import org.opengis.filter.spatial.Equals;
import org.opengis.filter.spatial.Intersects;
import org.opengis.filter.spatial.Overlaps;
import org.opengis.filter.spatial.Touches;
import org.opengis.filter.spatial.Within;
/**
* Extracts property names involved in spatial filters
*
* @author Andrea Aime - GeoSolutions
*
*/
class SpatialIndexAttributeExtractor extends DefaultFilterVisitor {
Map<String, Integer> spatialProperties = new HashMap<String, Integer>();
Map<String, Integer> getSpatialProperties() {
return spatialProperties;
}
public Object visit(BBOX filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
public Object visit(Beyond filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
public Object visit(Contains filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
public Object visit(Crosses filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
public Object visit(Disjoint filter, Object extraData) {
// nope, this one cannot be used with spatial indexes
// return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
return null;
}
public Object visit(DWithin filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
public Object visit(Equals filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
public Object visit(Intersects filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
public Object visit(Overlaps filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
public Object visit(Touches filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
public Object visit(Within filter, Object extraData) {
return visitBinarySpatialOperator((BinarySpatialOperator) filter, extraData);
}
protected Object visitBinarySpatialOperator(BinarySpatialOperator filter, Object extraData) {
Expression ex1 = filter.getExpression1();
Expression ex2 = filter.getExpression2();
PropertyName pn = null;
if (ex1 instanceof PropertyName && ex2 instanceof Literal) {
pn = (PropertyName) ex1;
} else if (ex1 instanceof Literal && ex2 instanceof PropertyName) {
pn = (PropertyName) ex2;
}
if (pn != null) {
String name = pn.getPropertyName();
if(spatialProperties.containsKey(name)) {
Integer count = spatialProperties.get(name);
spatialProperties.put(name, count + 1);
} else {
spatialProperties.put(name, 1);
}
}
return null;
}
}