/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.epl.index.quadtree;
import com.espertech.esper.client.EPException;
import com.espertech.esper.epl.expression.core.*;
import com.espertech.esper.epl.index.service.AdvancedIndexFactoryProvider;
import com.espertech.esper.epl.lookup.AdvancedIndexConfigContextPartition;
import com.espertech.esper.spatial.quadtree.pointregion.PointRegionQuadTreeFactory;
import static com.espertech.esper.epl.index.quadtree.AdvancedIndexQuadTreeConstants.*;
import static com.espertech.esper.epl.index.service.AdvancedIndexEvaluationHelper.*;
import static com.espertech.esper.epl.index.service.AdvancedIndexValidationHelper.*;
public abstract class AdvancedIndexFactoryProviderQuadTree implements AdvancedIndexFactoryProvider {
public AdvancedIndexConfigContextPartition validateConfigureFilterIndex(String indexName, String indexTypeName, ExprNode[] parameters, ExprValidationContext validationContext) throws ExprValidationException {
validateParameters(indexTypeName, parameters);
try {
return configureQuadTree(indexName, ExprNodeUtility.getEvaluators(parameters), validationContext.getExprEvaluatorContext());
} catch (EPException ex) {
throw new ExprValidationException(ex.getMessage(), ex);
}
}
protected static void validateParameters(String indexTypeName, ExprNode[] parameters) throws ExprValidationException {
validateParameterCount(4, 6, indexTypeName, parameters == null ? 0 : parameters.length);
validateParameterReturnTypeNumber(indexTypeName, 0, parameters[0], AdvancedIndexQuadTreeConstants.PARAM_XMIN);
validateParameterReturnTypeNumber(indexTypeName, 1, parameters[1], AdvancedIndexQuadTreeConstants.PARAM_YMIN);
validateParameterReturnTypeNumber(indexTypeName, 2, parameters[2], AdvancedIndexQuadTreeConstants.PARAM_WIDTH);
validateParameterReturnTypeNumber(indexTypeName, 3, parameters[3], AdvancedIndexQuadTreeConstants.PARAM_HEIGHT);
if (parameters.length > 4) {
validateParameterReturnType(Integer.class, indexTypeName, 4, parameters[4], AdvancedIndexQuadTreeConstants.PARAM_LEAFCAPACITY);
}
if (parameters.length > 5) {
validateParameterReturnType(Integer.class, indexTypeName, 5, parameters[5], AdvancedIndexQuadTreeConstants.PARAM_MAXTREEHEIGHT);
}
}
protected static AdvancedIndexConfigContextPartition configureQuadTree(String indexName, ExprEvaluator[] parameters, ExprEvaluatorContext exprEvaluatorContext) {
double x = evalDoubleParameter(parameters[0], indexName, PARAM_XMIN, exprEvaluatorContext);
double y = evalDoubleParameter(parameters[1], indexName, PARAM_YMIN, exprEvaluatorContext);
double width = evalDoubleParameter(parameters[2], indexName, PARAM_WIDTH, exprEvaluatorContext);
if (width <= 0) {
throw invalidParameterValue(indexName, PARAM_WIDTH, width, "value>0");
}
double height = evalDoubleParameter(parameters[3], indexName, PARAM_HEIGHT, exprEvaluatorContext);
if (height <= 0) {
throw invalidParameterValue(indexName, PARAM_HEIGHT, height, "value>0");
}
int leafCapacity = parameters.length > 4 ? evalIntParameter(parameters[4], indexName, PARAM_LEAFCAPACITY, exprEvaluatorContext) : PointRegionQuadTreeFactory.DEFAULT_LEAF_CAPACITY;
if (leafCapacity < 1) {
throw invalidParameterValue(indexName, PARAM_LEAFCAPACITY, leafCapacity, "value>=1");
}
int maxTreeHeight = parameters.length > 5 ? evalIntParameter(parameters[5], indexName, PARAM_MAXTREEHEIGHT, exprEvaluatorContext) : PointRegionQuadTreeFactory.DEFAULT_MAX_TREE_HEIGHT;
if (maxTreeHeight < 2) {
throw invalidParameterValue(indexName, PARAM_MAXTREEHEIGHT, maxTreeHeight, "value>=2");
}
return new AdvancedIndexConfigContextPartitionQuadTree(x, y, width, height, leafCapacity, maxTreeHeight);
}
}